diff --git a/data/icons/Makefile.am b/data/icons/Makefile.am
index 024adfcfc..28076ef7d 100644
--- a/data/icons/Makefile.am
+++ b/data/icons/Makefile.am
@@ -57,6 +57,7 @@ install_DATA += \
ca.png \
ca2.png \
ca2_gray.png \
+ checkmark.png \
colors.png \
conax_green.png \
conax_white.png \
diff --git a/data/icons/checkmark.png b/data/icons/checkmark.png
new file mode 100755
index 000000000..59495a665
Binary files /dev/null and b/data/icons/checkmark.png differ
diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale
index 4fe597a3e..c5eeba4bf 100644
--- a/data/locale/deutsch.locale
+++ b/data/locale/deutsch.locale
@@ -818,6 +818,7 @@ menu.hint_audioplayer_title Aktivieren Sie die Titelsuche (SMS-Stil) in der Play
menu.hint_auto_lang Wählen Sie, ob automatisch ihre bevorzugte Tonspur ausgewählt wird, wenn sie vorhanden ist
menu.hint_auto_subs Automatische Anzeige der Untertitel in Ihrer bevorzugten Sprache
menu.hint_back Zurück zum vorherigen Menü.\nDie Taste 'Menü' schließt alle Menüs
+menu.hint_back_brief Zurück zum vorherigen Menü.
menu.hint_backlight Konfigurieren Sie die Hintergrundbeleuchtung der Buttons
menu.hint_backup Sichern von Konfigurationen und Kanallisten
menu.hint_bedit Bearbeiten ihrer Favoriten und der Bouquets
@@ -1034,6 +1035,8 @@ menu.hint_network IP-Adresse, Gateway, DNS, Zeit-Sync, Netzwerk-Freigaben, Diens
menu.hint_new_zap_mode Aktiviert Quickzap in der Kanalliste. Nach Betätigen der Mute-Taste wird mit den Hoch/Runter-Tasten direkt umgeschalten
menu.hint_numeric_adjust Adjust channel list mode on numeric zap
menu.hint_onekey_plugin Wählen Sie ein Plugin, das mit einer Schnellstart-Taste gestartet wird
+menu.hint_opkg Hier können Sie neue Software-Pakete installieren oder vorhandene aktualisieren
+menu.hint_opkg_upgrade Aktualisiert alle installierten Pakete auf die neueste verfügbare Version
menu.hint_osd Farben, Schriftarten, Anzeigegröße, Ansichtsoptionen der Menüs und mehr
menu.hint_osd_language Wählen Sie ihre Menü-Sprache
menu.hint_osd_preset Wählen Sie zwischen Röhren-TV (CRT) oder Flachbildschirm (LCD)
@@ -1595,6 +1598,19 @@ nvod.starting (Beginn in %d min)
nvodselector.directormode Bildregie-Modus
nvodselector.head Anfangszeit auswählen
nvodselector.subservice Perspektiven
+opkg.button.expert_off Standard-Modus
+opkg.button.expert_on Experten-Modus
+opkg.button.info Paket-Informationen
+opkg.button.install Paket installieren
+opkg.button.uninstall Paket entfernen
+opkg.failure.install Installation fehlgeschlagen (%d)
+opkg.failure.update Update fehlgeschlagen (%d)
+opkg.failure.upgrade Upgrade fehlgeschlagen (%d)
+opkg.messagebox.reinstall %s erneut installieren?
+opkg.messagebox.remove %s entfernen?
+opkg.success.install Installation erfolgreich, Neustart von Neutrino kann erforderlich sein.
+opkg.title Paketverwaltung
+opkg.upgrade Installierte Pakete aktualisieren
options.default Voreinstellungen benutzen
options.fb framebuffer
options.ntp_off DVB
diff --git a/data/locale/english.locale b/data/locale/english.locale
index 4e2f99b34..55c98d8ec 100644
--- a/data/locale/english.locale
+++ b/data/locale/english.locale
@@ -818,6 +818,7 @@ menu.hint_audioplayer_title Enable SMS-style title search in playlist
menu.hint_auto_lang Auto-switch audio to preferred language
menu.hint_auto_subs Auto-start subtitles for preferred language
menu.hint_back Return to previous menu\nPress menu key to close all menus
+menu.hint_back_brief Return to previous menu
menu.hint_backlight Configure buttons backlight
menu.hint_backup Backup configs and channels to selected dir
menu.hint_bedit Edit favorites and bouquets
@@ -1034,6 +1035,8 @@ menu.hint_network IP address, gateway, DNS, Time sync\nNetwork shares and servic
menu.hint_new_zap_mode Allow channel switch while browsing\n(toggle mode with 'mute' in channel list)
menu.hint_numeric_adjust Adjust channel list mode on numeric zap
menu.hint_onekey_plugin Choose a plugin that's executed with the one touch key
+menu.hint_opkg Install or update software packages
+menu.hint_opkg_upgrade Updates all installed packages to the most recent version available
menu.hint_osd Colors, fonts, screen size\nGUI look and feel options
menu.hint_osd_language Select OSD language
menu.hint_osd_preset Pre-configured screen margins for CRT and LCD TV
@@ -1595,6 +1598,19 @@ nvod.starting (starting in %d min)
nvodselector.directormode Direct-Mode
nvodselector.head Select starting-time
nvodselector.subservice Select Subservice
+opkg.button.expert_off Standard mode
+opkg.button.expert_on Expert mode
+opkg.button.info Package information
+opkg.button.install Install package
+opkg.button.uninstall Uninstall package
+opkg.failure.install Install failed (%d)
+opkg.failure.update Update failed (%d)
+opkg.failure.upgrade Upgrade failed (%d)
+opkg.messagebox.reinstall Re-install %s?
+opkg.messagebox.remove Remove %s?
+opkg.success.install Install successful, restart of Neutrino might be required.
+opkg.title Package Management
+opkg.upgrade Upgrade installed packages
options.default Reset to defaults
options.fb framebuffer
options.ntp_off DVB
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index e681ead81..113cadcec 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -81,6 +81,7 @@ libneutrino_gui_a_SOURCES = \
network_service.cpp \
network_setup.cpp \
nfs.cpp \
+ opkg_manager.cpp \
osd_progressbar_setup.cpp \
osd_setup.cpp \
osdlang_setup.cpp \
diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp
new file mode 100644
index 000000000..7bac91044
--- /dev/null
+++ b/src/gui/opkg_manager.cpp
@@ -0,0 +1,380 @@
+/*
+ Based up Neutrino-GUI - Tuxbox-Project
+ Copyright (C) 2001 by Steffen Hehn 'McClean'
+
+ OPKG-Manager Class for Neutrino-GUI
+
+ Implementation:
+ Copyright (C) 2012 T. Graf 'dbt'
+ www.dbox2-tuning.net
+
+ Adaptions:
+ Copyright (C) 2013 martii
+ gitorious.org/neutrino-mp/martiis-neutrino-mp
+
+ License: GPL
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef HAVE_CONFIG_H
+#include
+#endif
+
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define OPKG_CL find_executable("opkg-cl")
+#define OPKG_KEY find_executable("opkg-key")
+
+enum
+{
+ OM_LIST,
+ OM_LIST_INSTALLED,
+ OM_LIST_UPGRADEABLE,
+ OM_UPDATE,
+ OM_UPGRADE,
+ OM_REMOVE,
+ OM_INFO,
+ OM_INSTALL,
+ OM_MAX
+};
+
+static const std::string pkg_types[OM_MAX] =
+{
+ OPKG_CL + " list",
+ OPKG_CL + " list-installed",
+ OPKG_CL + " list-upgradable",
+ OPKG_CL + " update",
+ OPKG_CL + " upgrade ",
+ OPKG_CL + " remove ",
+ OPKG_CL + " info ",
+ OPKG_CL + " install "
+};
+
+COPKGManager::COPKGManager()
+{
+ width = w_max (40, 10); //%
+ frameBuffer = CFrameBuffer::getInstance();
+ pkg_map.clear();
+ list_installed_done = false;
+ list_upgradeable_done = false;
+ expert_mode = false;
+}
+
+COPKGManager::~COPKGManager()
+{
+}
+
+int COPKGManager::exec(CMenuTarget* parent, const std::string &actionKey)
+{
+ int res = menu_return::RETURN_REPAINT;
+
+ if (actionKey == "") {
+ if (parent)
+ parent->hide();
+ return showMenu();
+ }
+ int selected = menu->getSelected() - menu_offset;
+
+ if (expert_mode && actionKey == "rc_blue") {
+ if (selected < 0 || selected >= (int) pkg_vec.size() || !pkg_vec[selected]->installed)
+ return menu_return::RETURN_NONE;
+
+ char loc[200];
+ snprintf(loc, sizeof(loc), g_Locale->getText(LOCALE_OPKG_MESSAGEBOX_REMOVE), pkg_vec[selected]->name.c_str());
+ if (ShowMsg(LOCALE_OPKG_TITLE, loc, CMessageBox::mbrCancel, CMessageBox::mbYes | CMessageBox::mbCancel) != CMessageBox::mbrCancel) {
+ if (parent)
+ parent->hide();
+ execCmd(pkg_types[OM_REMOVE] + pkg_vec[selected]->name, true, true);
+ refreshMenu();
+ }
+ return res;
+ }
+ if (actionKey == "rc_info") {
+ if (selected < 0 || selected >= (int) pkg_vec.size())
+ return menu_return::RETURN_NONE;
+ if (parent)
+ parent->hide();
+ execCmd(pkg_types[OM_INFO] + pkg_vec[selected]->name, true, true);
+ return res;
+ }
+ if (actionKey == "rc_red") {
+ expert_mode = !expert_mode;
+ updateMenu();
+ return res;
+ }
+ if(actionKey == pkg_types[OM_UPGRADE]) {
+ if (parent)
+ parent->hide();
+ int r = execCmd(actionKey, true, true);
+ if (r) {
+ std::string loc = g_Locale->getText(LOCALE_OPKG_FAILURE_UPGRADE);
+ char rs[strlen(loc.c_str()) + 20];
+ snprintf(rs, sizeof(rs), loc.c_str(), r);
+ DisplayInfoMessage(rs);
+ } else
+ installed = true;
+ refreshMenu();
+ g_RCInput->postMsg((neutrino_msg_t) CRCInput::RC_up, 0);
+ return res;
+ }
+
+ std::map::iterator it = pkg_map.find(actionKey);
+ if (it != pkg_map.end()) {
+ if (parent)
+ parent->hide();
+ std::string force = "";
+ if (it->second.installed && !it->second.upgradable) {
+ char l[200];
+ snprintf(l, sizeof(l), g_Locale->getText(LOCALE_OPKG_MESSAGEBOX_REINSTALL), actionKey.c_str());
+ l[sizeof(l) - 1] = 0;
+ if (ShowMsg(LOCALE_OPKG_TITLE, l, CMessageBox::mbrCancel, CMessageBox::mbYes | CMessageBox::mbCancel) == CMessageBox::mbrCancel)
+ return res;
+ force = "--force-reinstall ";
+ }
+ int r = execCmd(pkg_types[OM_INSTALL] + force + actionKey, true, true);
+ if (r) {
+ std::string err = g_Locale->getText(LOCALE_OPKG_FAILURE_INSTALL);
+ char rs[strlen(err.c_str()) + 20];
+ snprintf(rs, sizeof(rs), err.c_str(), r);
+ DisplayInfoMessage(rs);
+ } else
+ installed = true;
+ refreshMenu();
+ }
+ return res;
+}
+
+#define COPKGManagerFooterButtonCount 3
+static const struct button_label COPKGManagerFooterButtons[COPKGManagerFooterButtonCount] = {
+ { NEUTRINO_ICON_BUTTON_RED, LOCALE_OPKG_BUTTON_EXPERT_ON },
+ { NEUTRINO_ICON_BUTTON_INFO_SMALL, LOCALE_OPKG_BUTTON_INFO },
+ { NEUTRINO_ICON_BUTTON_OKAY, LOCALE_OPKG_BUTTON_INSTALL }
+};
+#define COPKGManagerFooterButtonCountExpert 4
+static const struct button_label COPKGManagerFooterButtonsExpert[COPKGManagerFooterButtonCountExpert] = {
+ { NEUTRINO_ICON_BUTTON_RED, LOCALE_OPKG_BUTTON_EXPERT_OFF },
+ { NEUTRINO_ICON_BUTTON_INFO_SMALL, LOCALE_OPKG_BUTTON_INFO },
+ { NEUTRINO_ICON_BUTTON_OKAY, LOCALE_OPKG_BUTTON_INSTALL },
+ { NEUTRINO_ICON_BUTTON_BLUE, LOCALE_OPKG_BUTTON_UNINSTALL }
+};
+
+void COPKGManager::updateMenu()
+{
+ bool upgradesAvailable = false;
+ getPkgData(OM_LIST_INSTALLED);
+ getPkgData(OM_LIST_UPGRADEABLE);
+ for (std::map::iterator it = pkg_map.begin(); it != pkg_map.end(); it++) {
+ it->second.forwarder->iconName_Info_right = "";
+ it->second.forwarder->setActive(true);
+ if (it->second.upgradable) {
+ it->second.forwarder->iconName_Info_right = NEUTRINO_ICON_WARNING;
+ upgradesAvailable = true;
+ } else if (it->second.installed) {
+ it->second.forwarder->iconName_Info_right = NEUTRINO_ICON_CHECKMARK;
+ it->second.forwarder->setActive(expert_mode);
+ }
+ }
+
+ upgrade_forwarder->setActive(upgradesAvailable);
+
+ if (expert_mode)
+ menu->setFooter(COPKGManagerFooterButtonsExpert, COPKGManagerFooterButtonCountExpert);
+ else
+ menu->setFooter(COPKGManagerFooterButtons, COPKGManagerFooterButtonCount);
+}
+
+void COPKGManager::refreshMenu() {
+ list_installed_done = false,
+ list_upgradeable_done = false;
+ updateMenu();
+}
+
+int COPKGManager::showMenu()
+{
+ installed = false;
+
+ int r = execCmd(pkg_types[OM_UPDATE]);
+ if (r) {
+ std::string loc = g_Locale->getText(LOCALE_OPKG_FAILURE_UPDATE);
+ char rs[strlen(loc.c_str()) + 20];
+ snprintf(rs, sizeof(rs), loc.c_str(), r);
+ DisplayInfoMessage(rs);
+ }
+
+ getPkgData(OM_LIST);
+ getPkgData(OM_LIST_UPGRADEABLE);
+
+ menu = new CMenuWidget(g_Locale->getText(LOCALE_OPKG_TITLE), NEUTRINO_ICON_UPDATE, width, MN_WIDGET_ID_SOFTWAREUPDATE);
+ CMenuForwarder menuBack(LOCALE_MENU_BACK, true, NULL, NULL, NULL, CRCInput::RC_nokey, NEUTRINO_ICON_BUTTON_LEFT, NULL, true);
+ menuBack.setItemButton(!g_settings.menu_left_exit ? NEUTRINO_ICON_BUTTON_HOME : NEUTRINO_ICON_BUTTON_LEFT);
+ menu->addItem(&menuBack);
+ menuBack.setHint(NEUTRINO_ICON_HINT_BACK, LOCALE_MENU_HINT_BACK_BRIEF);
+ menu->addItem(GenericMenuSeparatorLine);
+
+ upgrade_forwarder = new CMenuForwarder(LOCALE_OPKG_UPGRADE, true, NULL , this, pkg_types[OM_UPGRADE].c_str(), CRCInput::RC_red);
+ upgrade_forwarder->setHint(NEUTRINO_ICON_HINT_SW_UPDATE, LOCALE_MENU_HINT_OPKG_UPGRADE);
+ menu->addItem(upgrade_forwarder);
+ menu->addItem(GenericMenuSeparatorLine);
+
+ menu_offset = menu->getItemsCount();
+
+ menu->addKey(CRCInput::RC_info, this, "rc_info");
+ menu->addKey(CRCInput::RC_blue, this, "rc_blue");
+ menu->addKey(CRCInput::RC_red, this, "rc_red");
+
+ pkg_vec.clear();
+ for (std::map::iterator it = pkg_map.begin(); it != pkg_map.end(); it++) {
+ it->second.forwarder = new CMenuForwarder(it->second.desc, true, NULL , this, it->second.name.c_str());
+ it->second.forwarder->setHint("", it->second.desc);
+ menu->addItem(it->second.forwarder);
+ pkg_vec.push_back(&it->second);
+ }
+
+ updateMenu();
+
+ int res = menu->exec(NULL, "");
+
+ menu->hide ();
+
+ if (installed)
+ DisplayInfoMessage(g_Locale->getText(LOCALE_OPKG_SUCCESS_INSTALL));
+ delete menu;
+ return res;
+}
+
+bool COPKGManager::hasOpkgSupport()
+{
+ string deps[] = {OPKG_CL, OPKG_KEY, "/etc/opkg/opkg.conf", "/var/lib/opkg"};
+
+ for(size_t i=0; i::iterator it = pkg_map.begin(); it != pkg_map.end(); it++)
+ it->second.installed = false;
+ break;
+ case OM_LIST_UPGRADEABLE:
+ if (list_upgradeable_done)
+ return;
+ list_upgradeable_done = true;
+ for (std::map::iterator it = pkg_map.begin(); it != pkg_map.end(); it++)
+ it->second.upgradable = false;
+ break;
+ }
+
+ FILE *f = popen(pkg_types[pkg_content_id].c_str(), "r");
+ if (!f) {
+ DisplayInfoMessage("Command failed");
+ return;
+ }
+
+ char buf[256];
+
+ while (fgets(buf, sizeof(buf), f))
+ {
+ std::string line(buf);
+ trim(line);
+
+ std::string name = getBlankPkgName(line);
+
+ switch (pkg_content_id) {
+ case OM_LIST: {
+ pkg_map[name] = pkg(name, line);
+ break;
+ }
+ case OM_LIST_INSTALLED: {
+ std::map::iterator it = pkg_map.find(name);
+ if (it != pkg_map.end())
+ it->second.installed = true;
+ break;
+ }
+ case OM_LIST_UPGRADEABLE: {
+ std::map::iterator it = pkg_map.find(name);
+ if (it != pkg_map.end())
+ it->second.upgradable = true;
+ break;
+ }
+ default:
+ fprintf(stderr, "%s %s %d: unrecognized content id %d\n", __FILE__, __func__, __LINE__, pkg_content_id);
+ break;
+ }
+ }
+
+ pclose(f);
+}
+
+std::string COPKGManager::getBlankPkgName(const std::string& line)
+{
+ size_t l_pos = line.find(" ");
+ if (l_pos != string::npos)
+ return line.substr(0, l_pos);
+ return line;
+}
+
+int COPKGManager::execCmd(const char *cmdstr, bool verbose, bool acknowledge)
+{
+fprintf(stderr, "execCmd(%s)\n", cmdstr);
+ std::string cmd(cmdstr);
+ if (verbose) {
+ cmd += " 2>&1";
+ int res;
+ CShellWindow(cmd, (verbose ? CShellWindow::VERBOSE : 0) | (acknowledge ? CShellWindow::ACKNOWLEDGE : 0), &res);
+ return res;
+ } else {
+ cmd += " 2>/dev/null >&2";
+ int r = system(cmd.c_str());
+ if (r == -1)
+ return r;
+ return WEXITSTATUS(r);
+ }
+}
diff --git a/src/gui/opkg_manager.h b/src/gui/opkg_manager.h
new file mode 100644
index 000000000..26e89afcb
--- /dev/null
+++ b/src/gui/opkg_manager.h
@@ -0,0 +1,88 @@
+/*
+ Based up Neutrino-GUI - Tuxbox-Project
+ Copyright (C) 2001 by Steffen Hehn 'McClean'
+
+ OPKG-Manager Class for Neutrino-GUI
+
+ Implementation:
+ Copyright (C) 2012 T. Graf 'dbt'
+ www.dbox2-tuning.net
+
+ Adaptions:
+ Copyright (C) 2013 martii
+ gitorious.org/neutrino-mp/martiis-neutrino-mp
+
+ License: GPL
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifndef __OPKG_MANAGER__
+#define __OPKG_MANAGER__
+
+#include
+#include
+
+#include
+#include
+#include