From 9121f33bc84f35a3403c8caf028544dbe7e917c1 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Tue, 18 Jun 2013 16:22:34 +0400 Subject: [PATCH 01/63] gui/update.cpp: hide progress window, if applySettings() failed Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/d7bdd4ee6e4b39946a603c7e406c1333a3c43b73 Author: [CST] Focus Date: 2013-06-18 (Tue, 18 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/update.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/update.cpp b/src/gui/update.cpp index 692a21111..8e0ddfec7 100644 --- a/src/gui/update.cpp +++ b/src/gui/update.cpp @@ -465,8 +465,10 @@ int CFlashUpdate::exec(CMenuTarget* parent, const std::string &actionKey) //flash it... if (g_settings.apply_settings) { if (ShowMsgUTF(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_FLASHUPDATE_APPLY_SETTINGS), CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbNo, NEUTRINO_ICON_UPDATE) == CMessageBox::mbrYes) - if (!CExtUpdate::getInstance()->applySettings(filename, CExtUpdate::MODE_SOFTUPDATE)) + if (!CExtUpdate::getInstance()->applySettings(filename, CExtUpdate::MODE_SOFTUPDATE)) { + hide(); return menu_return::RETURN_REPAINT; + } } #ifdef DEBUG1 From 4a9aeb8f0fea674c3977d38cb6e708ac0648b000 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Tue, 18 Jun 2013 16:23:51 +0400 Subject: [PATCH 02/63] system/flashtool.cpp: prevent crash on invalid mtdData access, ie pos = -1 if system-fs not found; change sysfs name on apollo Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/be05be50692b8fce50dd95eccb69be1c4d3933b6 Author: [CST] Focus Date: 2013-06-18 (Tue, 18 Jun 2013) ------------------ This commit was generated by Migit --- src/system/flashtool.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/system/flashtool.cpp b/src/system/flashtool.cpp index 2d380bdf0..1a57987f0 100644 --- a/src/system/flashtool.cpp +++ b/src/system/flashtool.cpp @@ -577,22 +577,30 @@ std::string CMTDInfo::getMTDName(const int pos) { // TODO: check /proc/mtd specification to determine mtdname encoding - return FILESYSTEM_ENCODING_TO_UTF8_STRING(mtdData[pos]->name); + if (pos >= 0) + return FILESYSTEM_ENCODING_TO_UTF8_STRING(mtdData[pos]->name); + return ""; } std::string CMTDInfo::getMTDFileName(const int pos) { - return mtdData[pos]->filename; + if (pos >= 0) + return mtdData[pos]->filename; + return ""; } int CMTDInfo::getMTDSize(const int pos) { - return mtdData[pos]->size; + if (pos >= 0) + return mtdData[pos]->size; + return 0; } int CMTDInfo::getMTDEraseSize(const int pos) { - return mtdData[pos]->erasesize; + if (pos >= 0) + return mtdData[pos]->erasesize; + return 0; } int CMTDInfo::findMTDNumber(const std::string & filename) @@ -624,7 +632,11 @@ int CMTDInfo::getMTDEraseSize( const std::string & filename ) std::string CMTDInfo::findMTDsystem() { +#ifdef BOXMODEL_APOLLO + std::string sysfs = "root0"; +#else std::string sysfs = "systemFS"; +#endif for(int i = 0; i < getMTDCount(); i++) { if(getMTDName(i) == sysfs) { From eed2d022326d08e09eed18b32fd13a6270a4c8e3 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Tue, 18 Jun 2013 16:24:50 +0400 Subject: [PATCH 03/63] gui/update_ext.cpp: return error, if sysfs not found; hack mtd size for apollo Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ad48ffd99c97c973abd065b498ccc6578b8410df Author: [CST] Focus Date: 2013-06-18 (Tue, 18 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/update_ext.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/gui/update_ext.cpp b/src/gui/update_ext.cpp index 320107e46..0346eeb3d 100644 --- a/src/gui/update_ext.cpp +++ b/src/gui/update_ext.cpp @@ -202,7 +202,14 @@ bool CExtUpdate::applySettings() CMTDInfo * mtdInfo = CMTDInfo::getInstance(); std::string mtdFilename = mtdInfo->findMTDsystem(); // /dev/mtdX + if (mtdFilename.empty()) + return ErrorReset(0, "error system mtd not found"); + +#ifdef BOXMODEL_APOLLO + int mtdSize = 65536*1024; // FIXME hack, mtd size more than free RAM +#else int mtdSize = mtdInfo->getMTDSize(mtdFilename); +#endif int mtdEraseSize = mtdInfo->getMTDEraseSize(mtdFilename); mtdNumber = mtdInfo->findMTDNumber(mtdFilename); From 68eb06a387967f6df64056dfad866fa6adcc18a8 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 18 Jun 2013 19:10:47 +0200 Subject: [PATCH 04/63] CComponentsFrmClock: set font only with fontrender object Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/03ef18cdb9c4d698ae7b83ec1f1a7fde9d9c404d Author: Thilo Graf Date: 2013-06-18 (Tue, 18 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/channellist.cpp | 7 ++++--- src/gui/components/cc_frm_clock.cpp | 6 +----- src/gui/components/cc_frm_clock.h | 7 +++---- src/gui/test_menu.cpp | 4 ++-- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 32d52c428..e973a49bb 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -2079,10 +2079,11 @@ void CChannelList::paintHead() if (headerClock == NULL) { headerClock = new CComponentsFrmClock(0, 0, 0, 0, "%H:%M"); headerClock->setClockIntervall(10); - headerClock->setClockFontType(SNeutrinoSettings::FONT_TYPE_MENU_TITLE); - headerClock->setCornerRadius(RADIUS_LARGE); - headerClock->setCornerType(CORNER_TOP_RIGHT); + } + headerClock->setClockFont(g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]); + headerClock->setCornerRadius(RADIUS_LARGE); + headerClock->setCornerType(CORNER_TOP_RIGHT); headerClock->setYPos(y); headerClock->setHeight(theight); headerClock->setTextColor(COL_MENUHEAD); diff --git a/src/gui/components/cc_frm_clock.cpp b/src/gui/components/cc_frm_clock.cpp index 3636c7a34..30193e07c 100644 --- a/src/gui/components/cc_frm_clock.cpp +++ b/src/gui/components/cc_frm_clock.cpp @@ -69,12 +69,10 @@ void CComponentsFrmClock::initVarClock() cc_item_type = CC_ITEMTYPE_FRM_CLOCK; corner_rad = RADIUS_SMALL; - cl_font_type = SNeutrinoSettings::FONT_TYPE_INFOBAR_INFO; - cl_font = NULL; + cl_font = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_INFO]; cl_col_text = COL_MENUCONTENT; cl_format_str = "%H:%M"; cl_align = CC_ALIGN_VER_CENTER | CC_ALIGN_HOR_CENTER; -// cl_force_segment_paint = false; cl_thread = 0; cl_interval = 1; @@ -112,8 +110,6 @@ void CComponentsFrmClock::initCCLockItems() initTimeString(); string s_time = cl_timestr; - cl_font = g_Font[cl_font_type]; - //get minimal required height, width from raw text int min_text_w = cl_font->getRenderWidth(s_time, true);; int min_text_h = cl_font->getHeight(); diff --git a/src/gui/components/cc_frm_clock.h b/src/gui/components/cc_frm_clock.h index e67fecdee..ebc0530d3 100644 --- a/src/gui/components/cc_frm_clock.h +++ b/src/gui/components/cc_frm_clock.h @@ -57,12 +57,11 @@ class CComponentsFrmClock : public CComponentsForm ///raw time chars char cl_timestr[20]; + //TODO: please add comments! bool paintClock; bool activeClock; - ///font - int cl_font_type; - ///fontrenderer object + ///object: font render object Font *cl_font; ///text color int cl_col_text; @@ -88,7 +87,7 @@ class CComponentsFrmClock : public CComponentsForm ~CComponentsFrmClock(); ///set font type for segments - void setClockFontType(const int& font_type){cl_font_type = font_type;}; + void setClockFont(Font *font){cl_font = font;}; ///set text color void setTextColor(fb_pixel_t color_text){ cl_col_text = color_text;}; diff --git a/src/gui/test_menu.cpp b/src/gui/test_menu.cpp index af1064720..ed8ec9228 100644 --- a/src/gui/test_menu.cpp +++ b/src/gui/test_menu.cpp @@ -589,7 +589,7 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) else if (actionKey == "running_clock"){ if (clock_r == NULL){ clock_r = new CComponentsFrmClock(100, 50, 0, 50, "%H.%M:%S"); - clock_r->setClockFontType(SNeutrinoSettings::FONT_TYPE_INFOBAR_CHANNAME); + clock_r->setClockFont(g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_CHANNAME]); clock_r->setClockIntervall(1); // clock_r->doPaintBg(false); } @@ -610,7 +610,7 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) else if (actionKey == "clock"){ if (clock == NULL){ clock = new CComponentsFrmClock(100, 50, 0, 50, "%H:%M", false); - clock->setClockFontType(SNeutrinoSettings::FONT_TYPE_INFOBAR_CHANNAME); + clock->setClockFont(g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_CHANNAME]); } if (!clock->isPainted()) From 12799dd5465e0b582f6ab61ed9081dbd70ff9e26 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 18 Jun 2013 19:32:02 +0200 Subject: [PATCH 05/63] CComponentsFrmClock: ensure update of possible changed property values This also fixes a segfault in channellist when font settings were changed und user is change back into channellist. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/020d52ddbb381a5efe2d827bf09cb56342d25ed4 Author: Thilo Graf Date: 2013-06-18 (Tue, 18 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/components/cc_frm_clock.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/components/cc_frm_clock.cpp b/src/gui/components/cc_frm_clock.cpp index 30193e07c..4d3f3e957 100644 --- a/src/gui/components/cc_frm_clock.cpp +++ b/src/gui/components/cc_frm_clock.cpp @@ -250,6 +250,9 @@ void* CComponentsFrmClock::initClockThread(void *arg) sleep(clock->cl_interval); if (clock->paintClock) { + //refresh item property values + clock->refresh(); + //paint segements, but wihtout saved backgrounds clock->paint(CC_SAVE_SCREEN_NO); count = time(0); From e1706580fc14551c184be7f251f8211f786ef865 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 2 Jun 2013 20:31:42 +0200 Subject: [PATCH 06/63] menu: make page_start[] int, avoids lots of casts Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ed039d6ba912271fe5be34deffb40602ae6c9912 Author: Stefan Seyfried Date: 2013-06-02 (Sun, 02 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 18 +++++++++--------- src/gui/widget/menue.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index c89d22c33..3f7625551 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -545,11 +545,11 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) case (CRCInput::RC_page_down) : if(msg==CRCInput::RC_page_up) { if(current_page) { - pos = (int) page_start[current_page] - 1; + pos = page_start[current_page] - 1; for (unsigned int count=pos ; count > 0; count--) { CMenuItem* item = items[pos]; if ( item->isSelectable() ) { - if ((pos < (int)page_start[current_page + 1]) && (pos >= (int)page_start[current_page])) { + if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { items[selected]->paint( false ); item->paint( true ); paintHint(pos); @@ -567,7 +567,7 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) for (unsigned int count=0; count < items.size(); count++) { CMenuItem* item = items[pos]; if ( item->isSelectable() ) { - if ((pos < (int)page_start[current_page + 1]) && (pos >= (int)page_start[current_page])) { + if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { items[selected]->paint( false ); item->paint( true ); paintHint(pos); @@ -583,13 +583,13 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) } } else if(msg==CRCInput::RC_page_down) { - pos = (int) page_start[current_page + 1];// - 1; + pos = page_start[current_page + 1];// - 1; if(pos >= (int) items.size()) pos = items.size()-1; for (unsigned int count=pos ; count < items.size(); count++) { CMenuItem* item = items[pos]; if ( item->isSelectable() ) { - if ((pos < (int)page_start[current_page + 1]) && (pos >= (int)page_start[current_page])) { + if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { items[selected]->paint( false ); item->paint( true ); paintHint(pos); @@ -621,7 +621,7 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) CMenuItem* item = items[pos]; if ( item->isSelectable() ) { - if ((pos < (int)page_start[current_page + 1]) && (pos >= (int)page_start[current_page])) + if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { // Item is currently on screen //clear prev. selected items[selected]->paint( false ); @@ -949,9 +949,9 @@ void CMenuWidget::paintItems() //Item not currently on screen if (selected >= 0) { - while(selected < (int)page_start[current_page]) + while (selected < page_start[current_page]) current_page--; - while(selected >= (int)page_start[current_page + 1]) + while (selected >= page_start[current_page + 1]) current_page++; } @@ -966,7 +966,7 @@ void CMenuWidget::paintItems() } } int ypos=item_start_y; - for (unsigned int count = 0; count < items.size(); count++) + for (int count = 0; count < (int)items.size(); count++) { CMenuItem* item = items[count]; diff --git a/src/gui/widget/menue.h b/src/gui/widget/menue.h index 1e27ec6fd..9d9eb92a1 100644 --- a/src/gui/widget/menue.h +++ b/src/gui/widget/menue.h @@ -433,7 +433,7 @@ class CMenuWidget : public CMenuTarget neutrino_locale_t name; CFrameBuffer *frameBuffer; std::vector items; - std::vector page_start; + std::vector page_start; std::string iconfile; int min_width; From e599bbfd510973a378f6c91aab8d04d1897c47bc Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 2 Jun 2013 21:33:26 +0200 Subject: [PATCH 07/63] menu: fix artifacts on page change Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4774366474500af589fa4d914f4543268adc0d1a Author: Stefan Seyfried Date: 2013-06-02 (Sun, 02 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 3f7625551..265dcf7bb 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -845,8 +845,8 @@ void CMenuWidget::calcSize() total_pages++; heightCurrPage=item_height; } - if(total_pages == 1) - itemHeightTotal+=item_height; + if (heightCurrPage > itemHeightTotal) + itemHeightTotal = heightCurrPage; } page_start.push_back(items.size()); @@ -961,9 +961,9 @@ void CMenuWidget::paintItems() int item_height=height-(item_start_y-y); frameBuffer->paintBoxRel(x+ width,item_start_y, 15, item_height, COL_MENUCONTENT_PLUS_1, RADIUS_MIN); frameBuffer->paintBoxRel(x+ width +2, item_start_y+ 2+ current_page*(item_height-4)/total_pages, 11, (item_height-4)/total_pages, COL_MENUCONTENT_PLUS_3, RADIUS_MIN); - if((current_page==total_pages-1) || (current_page == 0 && RADIUS_MIN)){ - frameBuffer->paintBoxRel(x,item_start_y, width,item_height, COL_MENUCONTENT_PLUS_0); - } + /* background of menu items, paint every time because different items can have + * different height and this might leave artifacts otherwise after changing pages */ + frameBuffer->paintBoxRel(x,item_start_y, width,item_height, COL_MENUCONTENT_PLUS_0); } int ypos=item_start_y; for (int count = 0; count < (int)items.size(); count++) From 834266d04a6032fc52626ea1c40527fe13104454 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 2 Jun 2013 23:39:51 +0200 Subject: [PATCH 08/63] CMenuWidget: simplify up/down selection code Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/c5186c82dd768773408e53076befd8e771c47a4d Author: Stefan Seyfried Date: 2013-06-02 (Sun, 02 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 151 +++++++++++++++------------------------ 1 file changed, 59 insertions(+), 92 deletions(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 265dcf7bb..38577efaa 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -483,6 +483,12 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) } } } + /* make sure we start with a selectable item... */ + while (pos < (int)items.size()) { + if (items[pos]->isSelectable()) + break; + pos++; + } #if 0 GenericMenuBack->setHint("", NONEXISTANT_LOCALE); #endif @@ -541,103 +547,64 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) } } break; - case (CRCInput::RC_page_up) : - case (CRCInput::RC_page_down) : - if(msg==CRCInput::RC_page_up) { - if(current_page) { - pos = page_start[current_page] - 1; - for (unsigned int count=pos ; count > 0; count--) { - CMenuItem* item = items[pos]; - if ( item->isSelectable() ) { - if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { - items[selected]->paint( false ); - item->paint( true ); - paintHint(pos); - selected = pos; - } else { - selected=pos; - paintItems(); - } - break; - } - pos--; + case CRCInput::RC_page_up: + case CRCInput::RC_page_down: + case CRCInput::RC_up: + case CRCInput::RC_down: + { + /* dir and wrap are used when searching for a selectable item: + * if the item is not selectable, try the previous (dir = -1) or + * next (dir = 1) item, until a selectale item is found. + * if wrap = true, allows to wrap around while searching */ + int dir = 1; + bool wrap = false; + switch (msg) { + case CRCInput::RC_page_up: + if (current_page) { + pos = page_start[current_page] - 1; + dir = -1; /* pg_up: search upwards */ + } else + pos = 0; /* ...but not if already at top */ + break; + case CRCInput::RC_page_down: + pos = page_start[current_page + 1]; + if (pos >= (int)items.size()) { + pos = items.size() - 1; + dir = -1; /* if last item is not selectable, go up */ } - } else { - pos = 0; - for (unsigned int count=0; count < items.size(); count++) { - CMenuItem* item = items[pos]; - if ( item->isSelectable() ) { - if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { - items[selected]->paint( false ); - item->paint( true ); - paintHint(pos); - selected = pos; - } else { - selected=pos; - paintItems(); - } - break; - } - pos++; - } - } + break; + case CRCInput::RC_up: + dir = -1; + default: /* fallthrough or RC_down => dir = 1 */ + pos += dir; + if (pos < 0 || pos >= (int)items.size()) + pos -= dir * items.size(); + wrap = true; } - else if(msg==CRCInput::RC_page_down) { - pos = page_start[current_page + 1];// - 1; - if(pos >= (int) items.size()) - pos = items.size()-1; - for (unsigned int count=pos ; count < items.size(); count++) { - CMenuItem* item = items[pos]; - if ( item->isSelectable() ) { - if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) { - items[selected]->paint( false ); - item->paint( true ); - paintHint(pos); - selected = pos; - } else { - selected=pos; - paintItems(); - } - break; + do { + CMenuItem* item = items[pos]; + if (item->isSelectable()) { + if (pos < page_start[current_page + 1] && pos >= page_start[current_page]) { + /* in current page */ + items[selected]->paint(false); + item->paint(true); + paintHint(pos); + selected = pos; + } else { + /* different page */ + selected = pos; + paintItems(); } - pos++; + break; } - } - break; - case (CRCInput::RC_up) : - case (CRCInput::RC_down) : - { - //search next / prev selectable item - for (unsigned int count=1; count< items.size(); count++) { - if (msg==CRCInput::RC_up) { - pos = selected - count; - if ( pos < 0 ) - pos += items.size(); - } - else if(msg==CRCInput::RC_down) { - pos = (selected+ count)%items.size(); - } - - CMenuItem* item = items[pos]; - - if ( item->isSelectable() ) { - if ((pos < page_start[current_page + 1]) && (pos >= page_start[current_page])) - { // Item is currently on screen - //clear prev. selected - items[selected]->paint( false ); - //select new - item->paint( true ); - paintHint(pos); - selected = pos; - } else { - selected=pos; - paintItems(); - } - break; - } - } - } + pos += dir; + if (wrap && (pos >= (int)items.size() || pos < 0)) { + pos -= dir * items.size(); + wrap = false; /* wrap only once, avoids endless loop */ + } + } while (pos >= 0 && pos < (int)items.size()); break; + } case (CRCInput::RC_left): { if(hasItem() && selected > -1 && (int)items.size() > selected) { From 04b6854d11502f9e81be4aff4f5a797407aa883a Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 16 Jun 2013 21:37:49 +0200 Subject: [PATCH 09/63] CMenuWidget: fix simplified up/down code Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ecef1e8ab8ff28d1c2e84b5e97ceb4bf8dc440c4 Author: Stefan Seyfried Date: 2013-06-16 (Sun, 16 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 38577efaa..7d9739984 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -464,6 +464,8 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) CVFD::MODES oldLcdMode = CVFD::getInstance()->getMode(); int pos = 0; + if (selected > 0 && selected < (int)items.size()) + pos = selected; exit_pressed = false; frameBuffer->Lock(); From 8480e2a6248ec60ca7db2316e0f36a4d51c51497 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 20 Jun 2013 12:43:18 +0200 Subject: [PATCH 10/63] slovak.license: fix license text (thx bazi98) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/1f297edafe2a264716fb8e6e6659221f42d0a0ae Author: vanhofen Date: 2013-06-20 (Thu, 20 Jun 2013) Origin message was: ------------------ - slovak.license: fix license text (thx bazi98) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/license/slovak.license | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/license/slovak.license b/data/license/slovak.license index fb94fcc56..0d481d492 100644 --- a/data/license/slovak.license +++ b/data/license/slovak.license @@ -1,4 +1,4 @@ -Tento program je slobodný softvér: môžete ho šíriť a upravovať podľa ustanovení Všeobecnej verejnej licencie GNU (GNU General Public License), vydávanej nadáciou Free Software Foundation, a to buď podľa 2.verzie tejto Licencie, alebo (podľa vášho uváženia) ktorejkoľvek neskoršej verzie. +Tento program je slobodný softvér: môžete ho šíriť a upravovať podľa ustanovení Všeobecnej verejnej licencie GNU (GNU General Public License), vydávanej nadáciou Free Software Foundation, a to podľa 2.verzie tejto Licencie. Tento program je šírený v nádeji, že bude užitočný, avšak BEZ AKEJKOĽVEK ZÁRUKY. Neposkytujú sa ani odvodené záruky OBCHODOVATEĽNOSTI alebo VHODNOSTI PRE URČITÝ ÚČEL. Ďalšie podrobnosti hľadajte vo Všeobecnej verejnej licencii GNU. From 8a92c919f8b645e2c38bd58e34acdce87da15275 Mon Sep 17 00:00:00 2001 From: martii Date: Sat, 8 Jun 2013 08:38:12 +0200 Subject: [PATCH 11/63] ytparser: prefer 720p (due to 1080p playback problems with ffmpeg/eplayer3/spark, and I'm not even sure which of those is at fault) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/eb00181c5220deb7c00a92a0f6ca7c284a4ac1a0 Author: martii Date: 2013-06-08 (Sat, 08 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/ytparser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 012684e77..7e1b87550 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -67,11 +67,11 @@ std::string cYTVideoInfo::GetUrl(int fmt) return it->second.GetUrl(); return ""; } - if ((it = formats.find(37)) != formats.end()) + if ((it = formats.find(22)) != formats.end()) // 720p return it->second.GetUrl(); - if ((it = formats.find(22)) != formats.end()) + if ((it = formats.find(37)) != formats.end()) // 1080p return it->second.GetUrl(); - if ((it = formats.find(18)) != formats.end()) + if ((it = formats.find(18)) != formats.end()) // 270p/360p return it->second.GetUrl(); return ""; } From b6a01d2000659c273b2aeaae71644caf2c7ae47f Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 9 Jun 2013 08:28:13 +0200 Subject: [PATCH 12/63] ytparser: re-use exiting curl connection for bulk transfers Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/0e6848d7d9dd0c606236469020b070103c2c34bb Author: martii Date: 2013-06-09 (Sun, 09 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/ytparser.cpp | 22 ++++++++++++++-------- src/system/ytparser.h | 4 ++-- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 7e1b87550..db7e17d42 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -96,9 +96,9 @@ size_t cYTFeedParser::CurlWriteToString(void *ptr, size_t size, size_t nmemb, vo return size*nmemb; } -bool cYTFeedParser::getUrl(std::string &url, std::string &answer) +bool cYTFeedParser::getUrl(std::string &url, std::string &answer, CURL *_curl_handle) { - CURL * curl_handle = curl_easy_init(); + CURL * curl_handle = _curl_handle ? _curl_handle : curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, &cYTFeedParser::CurlWriteToString); curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&answer); @@ -112,7 +112,8 @@ bool cYTFeedParser::getUrl(std::string &url, std::string &answer) printf("try to get [%s] ...\n", url.c_str()); CURLcode httpres = curl_easy_perform(curl_handle); - curl_easy_cleanup(curl_handle); + if (!_curl_handle) + curl_easy_cleanup(curl_handle); printf("http: res %d size %d\n", httpres, answer.size()); @@ -123,14 +124,14 @@ bool cYTFeedParser::getUrl(std::string &url, std::string &answer) return true; } -bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file) +bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file, CURL *_curl_handle) { FILE * fp = fopen(file.c_str(), "wb"); if (fp == NULL) { perror(file.c_str()); return false; } - CURL * curl_handle = curl_easy_init(); + CURL * curl_handle = _curl_handle ? _curl_handle : curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl_handle, CURLOPT_FILE, fp); curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1); @@ -145,7 +146,8 @@ bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file) double dsize; curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD, &dsize); - curl_easy_cleanup(curl_handle); + if (!_curl_handle) + curl_easy_cleanup(curl_handle); fclose(fp); printf("http: res %d size %f.\n", httpres, dsize); @@ -537,6 +539,7 @@ bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) estr.push_back("&el=vevo"); estr.push_back("&el=detailpage"); + CURL *curl_handle = curl_easy_init(); for (unsigned i = 0; i < estr.size(); i++) { std::string vurl = "http://www.youtube.com/get_video_info?video_id="; vurl += vinfo.id; @@ -544,12 +547,13 @@ bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) vurl += "&ps=default&eurl=&gl=US&hl=en"; printf("cYTFeedParser::ParseVideoInfo: get [%s]\n", vurl.c_str()); std::string answer; - if (!getUrl(vurl, answer)) + if (!getUrl(vurl, answer, curl_handle)) continue; ret = decodeVideoInfo(answer, vinfo); if (ret) break; } + curl_easy_cleanup(curl_handle); return ret; } @@ -560,6 +564,7 @@ bool cYTFeedParser::DownloadThumbnails() perror(thumbnail_dir.c_str()); //return ret; } + CURL *curl_handle = curl_easy_init(); for (unsigned i = 0; i < videos.size(); i++) { if (!videos[i].thumbnail.empty()) { std::string fname = thumbnail_dir; @@ -568,12 +573,13 @@ bool cYTFeedParser::DownloadThumbnails() fname += ".jpg"; bool found = !access(fname.c_str(), F_OK); if (!found) - found = DownloadUrl(videos[i].thumbnail, fname); + found = DownloadUrl(videos[i].thumbnail, fname, curl_handle); if (found) videos[i].tfile = fname; ret |= found; } } + curl_easy_cleanup(curl_handle); return ret; } diff --git a/src/system/ytparser.h b/src/system/ytparser.h index 8978f7ef0..efb1fa491 100644 --- a/src/system/ytparser.h +++ b/src/system/ytparser.h @@ -93,8 +93,8 @@ class cYTFeedParser static void splitString(std::string &str, std::string delim, std::vector &strlist, int start = 0); static void splitString(std::string &str, std::string delim, std::map &strmap, int start = 0); static bool saveToFile(const char * name, std::string str); - bool getUrl(std::string &url, std::string &answer); - bool DownloadUrl(std::string &url, std::string &file); + bool getUrl(std::string &url, std::string &answer, CURL *curl_handle = NULL); + bool DownloadUrl(std::string &url, std::string &file, CURL *curl_handle = NULL); bool parseFeedXml(std::string &answer); bool decodeVideoInfo(std::string &answer, cYTVideoInfo &vinfo); bool supportedFormat(int fmt); From 742122d110ed9208a9970b2eb3b7a1ca90d7efc1 Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 9 Jun 2013 09:31:57 +0200 Subject: [PATCH 13/63] ytparser/moviebrowser: add option for selecting prefered quality Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/e01e96c1ac6ef4fcf05042d98eaa5d57e24a0159 Author: martii Date: 2013-06-09 (Sun, 09 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 1 + data/locale/english.locale | 1 + src/gui/moviebrowser.cpp | 17 ++++++++++++++++- src/gui/moviebrowser.h | 1 + src/system/locals.h | 1 + src/system/locals_intern.h | 1 + src/system/ytparser.cpp | 17 ++++++++++++----- src/system/ytparser.h | 2 +- 8 files changed, 34 insertions(+), 7 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index c84be7554..f16dfeaea 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1368,6 +1368,7 @@ moviebrowser.yt_most_responded Feeds mit den meisten Reaktionen moviebrowser.yt_most_shared Am häufigsten wiedergegebe Videos moviebrowser.yt_next_results Nächste Ergebnisse moviebrowser.yt_on_the_web Trendvideos +moviebrowser.yt_pref_quality Bevorzugte Qualität moviebrowser.yt_prev_results Vorherige Ergebnisse moviebrowser.yt_recently_featured Vor kurzem empfohlen moviebrowser.yt_region Region diff --git a/data/locale/english.locale b/data/locale/english.locale index bf3dac459..495d8bea3 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1368,6 +1368,7 @@ moviebrowser.yt_most_responded Most responded moviebrowser.yt_most_shared Most shared moviebrowser.yt_next_results Next results moviebrowser.yt_on_the_web Trending videos +moviebrowser.yt_pref_quality Prefered quality moviebrowser.yt_prev_results Previous results moviebrowser.yt_recently_featured Recently featured moviebrowser.yt_region Region diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index 507221213..d0bff4bcd 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -772,6 +772,7 @@ bool CMovieBrowser::loadSettings(MB_SETTINGS* settings) } settings->ytmode = configfile.getInt32("mb_ytmode", cYTFeedParser::MOST_POPULAR); settings->ytresults = configfile.getInt32("mb_ytresults", 10); + settings->ytquality = configfile.getInt32("mb_ytquality", 22); // itag value (MP4, 720p) settings->ytregion = configfile.getString("mb_ytregion", "default"); settings->ytsearch = configfile.getString("mb_ytsearch", ""); settings->ytvid = configfile.getString("mb_ytvid", ""); @@ -826,6 +827,7 @@ bool CMovieBrowser::saveSettings(MB_SETTINGS* settings) } configfile.setInt32("mb_ytmode", settings->ytmode); configfile.setInt32("mb_ytresults", settings->ytresults); + configfile.setInt32("mb_ytquality", settings->ytquality); configfile.setString("mb_ytregion", settings->ytregion); configfile.setString("mb_ytsearch", settings->ytsearch); configfile.setString("mb_ytvid", settings->ytvid); @@ -3587,7 +3589,7 @@ void CMovieBrowser::loadYTitles(int mode, std::string search, std::string id) movieInfo.ytid = ylist[i].id; movieInfo.file.Name = ylist[i].title; - movieInfo.file.Url = ylist[i].GetUrl(); + movieInfo.file.Url = ylist[i].GetUrl(m_settings.ytquality, false); m_vMovieInfo.push_back(movieInfo); } m_currentBrowserSelection = 0; @@ -3681,6 +3683,19 @@ bool CMovieBrowser::showYTMenu() region->addOption("US"); mainMenu.addItem(region); + #define YT_QUALITY_OPTION_COUNT 3 + CMenuOptionChooser::keyval_ext YT_QUALITY_OPTIONS[YT_QUALITY_OPTION_COUNT] = + { + { 18, NONEXISTANT_LOCALE, "MP4 270p/360p"}, + { 22, NONEXISTANT_LOCALE, "MP4 720p" }, +#if 0 + { 34, NONEXISTANT_LOCALE, "FLV 360p" }, + { 35, NONEXISTANT_LOCALE, "FLV 480p" }, +#endif + { 37, NONEXISTANT_LOCALE, "MP4 1080p" } + }; + mainMenu.addItem(new CMenuOptionChooser(LOCALE_MOVIEBROWSER_YT_PREF_QUALITY, &m_settings.ytquality, YT_QUALITY_OPTIONS, YT_QUALITY_OPTION_COUNT, true, NULL, CRCInput::RC_nokey, "", true)); + mainMenu.exec(NULL, ""); delete selector; diff --git a/src/gui/moviebrowser.h b/src/gui/moviebrowser.h index 1126404a8..015068236 100644 --- a/src/gui/moviebrowser.h +++ b/src/gui/moviebrowser.h @@ -229,6 +229,7 @@ typedef struct int lastRecordRowWidth[MB_MAX_ROWS]; int ytmode; int ytresults; + int ytquality; std::string ytregion; std::string ytvid; std::string ytsearch; diff --git a/src/system/locals.h b/src/system/locals.h index 2295e6655..36127b8f2 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -1395,6 +1395,7 @@ typedef enum LOCALE_MOVIEBROWSER_YT_MOST_SHARED, LOCALE_MOVIEBROWSER_YT_NEXT_RESULTS, LOCALE_MOVIEBROWSER_YT_ON_THE_WEB, + LOCALE_MOVIEBROWSER_YT_PREF_QUALITY, LOCALE_MOVIEBROWSER_YT_PREV_RESULTS, LOCALE_MOVIEBROWSER_YT_RECENTLY_FEATURED, LOCALE_MOVIEBROWSER_YT_REGION, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 32c918e88..fc0323ae9 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -1395,6 +1395,7 @@ const char * locale_real_names[] = "moviebrowser.yt_most_shared", "moviebrowser.yt_next_results", "moviebrowser.yt_on_the_web", + "moviebrowser.yt_pref_quality", "moviebrowser.yt_prev_results", "moviebrowser.yt_recently_featured", "moviebrowser.yt_region", diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index db7e17d42..4bd2b9322 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -59,19 +59,26 @@ void cYTVideoInfo::Dump() printf("===================================================================\n"); } -std::string cYTVideoInfo::GetUrl(int fmt) +std::string cYTVideoInfo::GetUrl(int fmt, bool mandatory) { yt_urlmap_iterator_t it; if (fmt) { if ((it = formats.find(fmt)) != formats.end()) return it->second.GetUrl(); - return ""; + if (mandatory) + return ""; } - if ((it = formats.find(22)) != formats.end()) // 720p + if ((it = formats.find(22)) != formats.end()) // 720p MP4 return it->second.GetUrl(); - if ((it = formats.find(37)) != formats.end()) // 1080p +#if 0 + if ((it = formats.find(35)) != formats.end()) // 480p FLV return it->second.GetUrl(); - if ((it = formats.find(18)) != formats.end()) // 270p/360p + if ((it = formats.find(34)) != formats.end()) // 360p FLV + return it->second.GetUrl(); +#endif + if ((it = formats.find(18)) != formats.end()) // 270p/360p MP4 + return it->second.GetUrl(); + if ((it = formats.find(37)) != formats.end()) // 1080p MP4 return it->second.GetUrl(); return ""; } diff --git a/src/system/ytparser.h b/src/system/ytparser.h index efb1fa491..2dfaf9980 100644 --- a/src/system/ytparser.h +++ b/src/system/ytparser.h @@ -58,7 +58,7 @@ class cYTVideoInfo yt_urlmap_t formats; void Dump(); - std::string GetUrl(int fmt = 0); + std::string GetUrl(int fmt = 0, bool mandatory = true); }; From 576e7e44cdee7c90719855648911eff76a6e6733 Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 9 Jun 2013 14:59:45 +0200 Subject: [PATCH 14/63] ytparser: create CURL object in constructor Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/dd7ff427f717fabae3bf0eec8d859a4826dc0673 Author: martii Date: 2013-06-09 (Sun, 09 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/ytparser.cpp | 32 +++++++++++--------------------- src/system/ytparser.h | 10 ++++++---- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 4bd2b9322..18455666a 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -90,22 +90,25 @@ cYTFeedParser::cYTFeedParser() feedmode = -1; tquality = "mqdefault"; max_results = 25; + curl_handle = curl_easy_init(); } cYTFeedParser::~cYTFeedParser() { + curl_easy_cleanup(curl_handle); } size_t cYTFeedParser::CurlWriteToString(void *ptr, size_t size, size_t nmemb, void *data) { - std::string* pStr = (std::string*) data; - pStr->append((char*) ptr, nmemb); + if (size * nmemb > 0) { + std::string* pStr = (std::string*) data; + pStr->append((char*) ptr, nmemb); + } return size*nmemb; } -bool cYTFeedParser::getUrl(std::string &url, std::string &answer, CURL *_curl_handle) +bool cYTFeedParser::getUrl(std::string &url, std::string &answer) { - CURL * curl_handle = _curl_handle ? _curl_handle : curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, &cYTFeedParser::CurlWriteToString); curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&answer); @@ -119,9 +122,6 @@ bool cYTFeedParser::getUrl(std::string &url, std::string &answer, CURL *_curl_ha printf("try to get [%s] ...\n", url.c_str()); CURLcode httpres = curl_easy_perform(curl_handle); - if (!_curl_handle) - curl_easy_cleanup(curl_handle); - printf("http: res %d size %d\n", httpres, answer.size()); if (httpres != 0 || answer.empty()) { @@ -131,15 +131,15 @@ bool cYTFeedParser::getUrl(std::string &url, std::string &answer, CURL *_curl_ha return true; } -bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file, CURL *_curl_handle) +bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file) { FILE * fp = fopen(file.c_str(), "wb"); if (fp == NULL) { perror(file.c_str()); return false; } - CURL * curl_handle = _curl_handle ? _curl_handle : curl_easy_init(); curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, NULL); curl_easy_setopt(curl_handle, CURLOPT_FILE, fp); curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1); curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, URL_TIMEOUT); @@ -153,8 +153,6 @@ bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file, CURL *_curl double dsize; curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD, &dsize); - if (!_curl_handle) - curl_easy_cleanup(curl_handle); fclose(fp); printf("http: res %d size %f.\n", httpres, dsize); @@ -169,9 +167,7 @@ bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file, CURL *_curl void cYTFeedParser::decodeUrl(std::string &url) { - CURL * curl_handle = curl_easy_init(); char * str = curl_easy_unescape(curl_handle, url.c_str(), 0, NULL); - curl_easy_cleanup(curl_handle); if(str) url = str; curl_free(str); @@ -179,9 +175,7 @@ void cYTFeedParser::decodeUrl(std::string &url) void cYTFeedParser::encodeUrl(std::string &txt) { - CURL * curl_handle = curl_easy_init(); char * str = curl_easy_escape(curl_handle, txt.c_str(), txt.length()); - curl_easy_cleanup(curl_handle); if(str) txt = str; curl_free(str); @@ -546,7 +540,6 @@ bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) estr.push_back("&el=vevo"); estr.push_back("&el=detailpage"); - CURL *curl_handle = curl_easy_init(); for (unsigned i = 0; i < estr.size(); i++) { std::string vurl = "http://www.youtube.com/get_video_info?video_id="; vurl += vinfo.id; @@ -554,13 +547,12 @@ bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) vurl += "&ps=default&eurl=&gl=US&hl=en"; printf("cYTFeedParser::ParseVideoInfo: get [%s]\n", vurl.c_str()); std::string answer; - if (!getUrl(vurl, answer, curl_handle)) + if (!getUrl(vurl, answer)) continue; ret = decodeVideoInfo(answer, vinfo); if (ret) break; } - curl_easy_cleanup(curl_handle); return ret; } @@ -571,7 +563,6 @@ bool cYTFeedParser::DownloadThumbnails() perror(thumbnail_dir.c_str()); //return ret; } - CURL *curl_handle = curl_easy_init(); for (unsigned i = 0; i < videos.size(); i++) { if (!videos[i].thumbnail.empty()) { std::string fname = thumbnail_dir; @@ -580,13 +571,12 @@ bool cYTFeedParser::DownloadThumbnails() fname += ".jpg"; bool found = !access(fname.c_str(), F_OK); if (!found) - found = DownloadUrl(videos[i].thumbnail, fname, curl_handle); + found = DownloadUrl(videos[i].thumbnail, fname); if (found) videos[i].tfile = fname; ret |= found; } } - curl_easy_cleanup(curl_handle); return ret; } diff --git a/src/system/ytparser.h b/src/system/ytparser.h index 2dfaf9980..980525f5d 100644 --- a/src/system/ytparser.h +++ b/src/system/ytparser.h @@ -87,14 +87,16 @@ class cYTFeedParser std::string getXmlAttr(xmlNodePtr node, const char * attr); std::string getXmlData(xmlNodePtr node); + CURL *curl_handle; + static size_t CurlWriteToString(void *ptr, size_t size, size_t nmemb, void *data); - static void encodeUrl(std::string &txt); - static void decodeUrl(std::string &url); + void encodeUrl(std::string &txt); + void decodeUrl(std::string &url); static void splitString(std::string &str, std::string delim, std::vector &strlist, int start = 0); static void splitString(std::string &str, std::string delim, std::map &strmap, int start = 0); static bool saveToFile(const char * name, std::string str); - bool getUrl(std::string &url, std::string &answer, CURL *curl_handle = NULL); - bool DownloadUrl(std::string &url, std::string &file, CURL *curl_handle = NULL); + bool getUrl(std::string &url, std::string &answer); + bool DownloadUrl(std::string &url, std::string &file); bool parseFeedXml(std::string &answer); bool decodeVideoInfo(std::string &answer, cYTVideoInfo &vinfo); bool supportedFormat(int fmt); From 347ad94e5884fe34ed295c822919b2e235dd2a4d Mon Sep 17 00:00:00 2001 From: martii Date: Sun, 9 Jun 2013 21:35:06 +0200 Subject: [PATCH 15/63] yt: speed up retrieving feed data by starting multiple (up to 8, default is 4) http transfers in parallel Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/8836a15a423f2073d3a3b59fcf36f74e0b96ec93 Author: martii Date: 2013-06-09 (Sun, 09 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 1 + data/locale/english.locale | 1 + src/gui/moviebrowser.cpp | 5 ++ src/gui/moviebrowser.h | 1 + src/system/locals.h | 1 + src/system/locals_intern.h | 1 + src/system/ytparser.cpp | 161 +++++++++++++++++++++++++++---------- src/system/ytparser.h | 17 +++- 8 files changed, 142 insertions(+), 46 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index f16dfeaea..224ee5908 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1359,6 +1359,7 @@ moviebrowser.update_if_dest_empty_only Übernehmen nur wenn Ziel leer moviebrowser.use_dir Verzeichnis verwenden moviebrowser.use_movie_dir Wiedergabeverzeichnis verwenden moviebrowser.use_rec_dir Aufnahmeverzeichnis verwenden +moviebrowser.yt_concurrent_connections Gleichzeitige Verbindungen moviebrowser.yt_error Fehler beim laden des Youtube Feed moviebrowser.yt_max_results Max. Anzahl der zu holenden Feeds moviebrowser.yt_most_discussed Am meisten diskutiert diff --git a/data/locale/english.locale b/data/locale/english.locale index 495d8bea3..73b50b659 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1359,6 +1359,7 @@ moviebrowser.update_if_dest_empty_only Copy if destination is empty only moviebrowser.use_dir Use directory moviebrowser.use_movie_dir Use movie directory moviebrowser.use_rec_dir Use record directory +moviebrowser.yt_concurrent_connections Concurrent connections moviebrowser.yt_error Failed to load youtube feed moviebrowser.yt_max_results Max results to fetch moviebrowser.yt_most_discussed Most discussed diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index d0bff4bcd..fd2a30b09 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -773,6 +773,7 @@ bool CMovieBrowser::loadSettings(MB_SETTINGS* settings) settings->ytmode = configfile.getInt32("mb_ytmode", cYTFeedParser::MOST_POPULAR); settings->ytresults = configfile.getInt32("mb_ytresults", 10); settings->ytquality = configfile.getInt32("mb_ytquality", 22); // itag value (MP4, 720p) + settings->ytconcconn = configfile.getInt32("mb_ytconcconn", 4); // concurrent connections settings->ytregion = configfile.getString("mb_ytregion", "default"); settings->ytsearch = configfile.getString("mb_ytsearch", ""); settings->ytvid = configfile.getString("mb_ytvid", ""); @@ -828,6 +829,7 @@ bool CMovieBrowser::saveSettings(MB_SETTINGS* settings) configfile.setInt32("mb_ytmode", settings->ytmode); configfile.setInt32("mb_ytresults", settings->ytresults); configfile.setInt32("mb_ytquality", settings->ytquality); + configfile.setInt32("mb_ytconcconn", settings->ytconcconn); configfile.setString("mb_ytregion", settings->ytregion); configfile.setString("mb_ytsearch", settings->ytsearch); configfile.setString("mb_ytvid", settings->ytvid); @@ -3564,6 +3566,7 @@ void CMovieBrowser::loadYTitles(int mode, std::string search, std::string id) ytparser.SetRegion(m_settings.ytregion); ytparser.SetMaxResults(m_settings.ytresults); + ytparser.SetConcurrentDownloads(m_settings.ytconcconn); if (!ytparser.Parsed() || (ytparser.GetFeedMode() != mode)) { if (ytparser.ParseFeed((cYTFeedParser::yt_feed_mode_t)mode, search, id)) { @@ -3695,8 +3698,10 @@ bool CMovieBrowser::showYTMenu() { 37, NONEXISTANT_LOCALE, "MP4 1080p" } }; mainMenu.addItem(new CMenuOptionChooser(LOCALE_MOVIEBROWSER_YT_PREF_QUALITY, &m_settings.ytquality, YT_QUALITY_OPTIONS, YT_QUALITY_OPTION_COUNT, true, NULL, CRCInput::RC_nokey, "", true)); + mainMenu.addItem(new CMenuOptionNumberChooser(LOCALE_MOVIEBROWSER_YT_CONCURRENT_CONNECTIONS, &m_settings.ytconcconn, true, 1, 8)); mainMenu.exec(NULL, ""); + ytparser.SetConcurrentDownloads(m_settings.ytconcconn); delete selector; bool reload = false; diff --git a/src/gui/moviebrowser.h b/src/gui/moviebrowser.h index 015068236..188eb95b5 100644 --- a/src/gui/moviebrowser.h +++ b/src/gui/moviebrowser.h @@ -230,6 +230,7 @@ typedef struct int ytmode; int ytresults; int ytquality; + int ytconcconn; std::string ytregion; std::string ytvid; std::string ytsearch; diff --git a/src/system/locals.h b/src/system/locals.h index 36127b8f2..82a303ff3 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -1386,6 +1386,7 @@ typedef enum LOCALE_MOVIEBROWSER_USE_DIR, LOCALE_MOVIEBROWSER_USE_MOVIE_DIR, LOCALE_MOVIEBROWSER_USE_REC_DIR, + LOCALE_MOVIEBROWSER_YT_CONCURRENT_CONNECTIONS, LOCALE_MOVIEBROWSER_YT_ERROR, LOCALE_MOVIEBROWSER_YT_MAX_RESULTS, LOCALE_MOVIEBROWSER_YT_MOST_DISCUSSED, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index fc0323ae9..66616dfe8 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -1386,6 +1386,7 @@ const char * locale_real_names[] = "moviebrowser.use_dir", "moviebrowser.use_movie_dir", "moviebrowser.use_rec_dir", + "moviebrowser.yt_concurrent_connections", "moviebrowser.yt_error", "moviebrowser.yt_max_results", "moviebrowser.yt_most_discussed", diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 18455666a..29fce2986 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,9 @@ #include #include +#include +#include "set_threadname.h" + #include "ytparser.h" #if LIBCURL_VERSION_NUM < 0x071507 @@ -90,6 +94,7 @@ cYTFeedParser::cYTFeedParser() feedmode = -1; tquality = "mqdefault"; max_results = 25; + concurrent_downloads = 2; curl_handle = curl_easy_init(); } @@ -107,20 +112,23 @@ size_t cYTFeedParser::CurlWriteToString(void *ptr, size_t size, size_t nmemb, vo return size*nmemb; } -bool cYTFeedParser::getUrl(std::string &url, std::string &answer) +bool cYTFeedParser::getUrl(std::string &url, std::string &answer, CURL *_curl_handle) { - curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, &cYTFeedParser::CurlWriteToString); - curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&answer); - curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1); - curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, URL_TIMEOUT); - curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, (long)1); + if (!_curl_handle) + _curl_handle = curl_handle; + + curl_easy_setopt(_curl_handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(_curl_handle, CURLOPT_WRITEFUNCTION, &cYTFeedParser::CurlWriteToString); + curl_easy_setopt(_curl_handle, CURLOPT_FILE, (void *)&answer); + curl_easy_setopt(_curl_handle, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(_curl_handle, CURLOPT_TIMEOUT, URL_TIMEOUT); + curl_easy_setopt(_curl_handle, CURLOPT_NOSIGNAL, (long)1); char cerror[CURL_ERROR_SIZE]; - curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, cerror); + curl_easy_setopt(_curl_handle, CURLOPT_ERRORBUFFER, cerror); printf("try to get [%s] ...\n", url.c_str()); - CURLcode httpres = curl_easy_perform(curl_handle); + CURLcode httpres = curl_easy_perform(_curl_handle); printf("http: res %d size %d\n", httpres, answer.size()); @@ -131,31 +139,34 @@ bool cYTFeedParser::getUrl(std::string &url, std::string &answer) return true; } -bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file) +bool cYTFeedParser::DownloadUrl(std::string &url, std::string &file, CURL *_curl_handle) { + if (!_curl_handle) + _curl_handle = curl_handle; + FILE * fp = fopen(file.c_str(), "wb"); if (fp == NULL) { perror(file.c_str()); return false; } - curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, NULL); - curl_easy_setopt(curl_handle, CURLOPT_FILE, fp); - curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1); - curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, URL_TIMEOUT); - curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, (long)1); + curl_easy_setopt(_curl_handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(_curl_handle, CURLOPT_WRITEFUNCTION, NULL); + curl_easy_setopt(_curl_handle, CURLOPT_FILE, fp); + curl_easy_setopt(_curl_handle, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(_curl_handle, CURLOPT_TIMEOUT, URL_TIMEOUT); + curl_easy_setopt(_curl_handle, CURLOPT_NOSIGNAL, (long)1); char cerror[CURL_ERROR_SIZE]; - curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, cerror); + curl_easy_setopt(_curl_handle, CURLOPT_ERRORBUFFER, cerror); printf("try to get [%s] ...\n", url.c_str()); - CURLcode httpres = curl_easy_perform(curl_handle); + CURLcode httpres = curl_easy_perform(_curl_handle); double dsize; - curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD, &dsize); + curl_easy_getinfo(_curl_handle, CURLINFO_SIZE_DOWNLOAD, &dsize); fclose(fp); - printf("http: res %d size %f.\n", httpres, dsize); + printf("http: res %d size %g.\n", httpres, dsize); if (httpres != 0) { printf("curl error: %s\n", cerror); @@ -360,12 +371,22 @@ bool cYTFeedParser::parseFeedXml(std::string &answer) /* save first one, if wanted not found */ if (vinfo.thumbnail.empty()) vinfo.thumbnail = thumbnail; - if (ParseVideoInfo(vinfo)) - videos.push_back(vinfo); + vinfo.ret = false; + videos.push_back(vinfo); } entry = entry->xmlNextNode; } xmlFreeDoc(answer_parser); + + GetVideoUrls(); + + std::vector::iterator pos = videos.begin(); + while (pos != videos.end()) + if ((*pos).ret) + ++pos; + else + pos = videos.erase(pos); + parsed = !videos.empty(); return parsed; } @@ -532,7 +553,7 @@ bool cYTFeedParser::ParseFeed(yt_feed_mode_t mode, std::string search, std::stri return ParseFeed(url); } -bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) +bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo, CURL *_curl_handle) { bool ret = false; std::vector estr; @@ -547,44 +568,98 @@ bool cYTFeedParser::ParseVideoInfo(cYTVideoInfo &vinfo) vurl += "&ps=default&eurl=&gl=US&hl=en"; printf("cYTFeedParser::ParseVideoInfo: get [%s]\n", vurl.c_str()); std::string answer; - if (!getUrl(vurl, answer)) + if (!getUrl(vurl, answer, _curl_handle)) continue; ret = decodeVideoInfo(answer, vinfo); if (ret) break; } + vinfo.ret = ret; return ret; } +void *cYTFeedParser::DownloadThumbnailsThread(void *arg) +{ + set_threadname("YT::DownloadThumbnails"); + bool ret = true; + cYTFeedParser *caller = (cYTFeedParser *)arg; + CURL *c = curl_easy_init(); + unsigned int i; + do { + OpenThreads::ScopedLock m_lock(caller->mutex); + i = caller->worker_index++; + } while (i < caller->videos.size() && ((ret &= caller->DownloadThumbnail(caller->videos[i], c)) || true)); + curl_easy_cleanup(c); + pthread_exit(&ret); +} + +bool cYTFeedParser::DownloadThumbnail(cYTVideoInfo &vinfo, CURL *_curl_handle) +{ + if (!_curl_handle) + _curl_handle = curl_handle; + bool found = false; + if (!vinfo.thumbnail.empty()) { + std::string fname = thumbnail_dir + "/" + vinfo.id + ".jpg"; + found = !access(fname.c_str(), F_OK); + if (!found) + found = DownloadUrl(vinfo.thumbnail, fname, _curl_handle); + if (found) + vinfo.tfile = fname; + } + return found; +} + bool cYTFeedParser::DownloadThumbnails() { - bool ret = false; - if (mkdir(thumbnail_dir.c_str(), 0755)) { + bool ret = true; + if (mkdir(thumbnail_dir.c_str(), 0755) && errno != EEXIST) { perror(thumbnail_dir.c_str()); - //return ret; + return false; } - for (unsigned i = 0; i < videos.size(); i++) { - if (!videos[i].thumbnail.empty()) { - std::string fname = thumbnail_dir; - fname += "/"; - fname += videos[i].id; - fname += ".jpg"; - bool found = !access(fname.c_str(), F_OK); - if (!found) - found = DownloadUrl(videos[i].thumbnail, fname); - if (found) - videos[i].tfile = fname; - ret |= found; - } + unsigned int max_threads = concurrent_downloads; + if (videos.size() < max_threads) + max_threads = videos.size(); + pthread_t ta[max_threads]; + worker_index = 0; + for (unsigned i = 0; i < max_threads; i++) + pthread_create(&ta[i], NULL, cYTFeedParser::DownloadThumbnailsThread, this); + for (unsigned i = 0; i < max_threads; i++) { + void *r; + pthread_join(ta[i], &r); + ret &= *((bool *)r); } return ret; } +void *cYTFeedParser::GetVideoUrlsThread(void *arg) +{ + set_threadname("YT::GetVideoUrls"); + int ret = 0; + cYTFeedParser *caller = (cYTFeedParser *)arg; + CURL *c = curl_easy_init(); + unsigned int i; + do { + OpenThreads::ScopedLock m_lock(caller->mutex); + i = caller->worker_index++; + } while (i < caller->videos.size() && ((ret |= caller->ParseVideoInfo(caller->videos[i], c)) || true)); + curl_easy_cleanup(c); + pthread_exit(&ret); +} + bool cYTFeedParser::GetVideoUrls() { - bool ret = false; - for (unsigned i = 0; i < videos.size(); i++) { - ret |= ParseVideoInfo(videos[i]); + int ret = 0; + unsigned int max_threads = concurrent_downloads; + if (videos.size() < max_threads) + max_threads = videos.size(); + pthread_t ta[max_threads]; + worker_index = 0; + for (unsigned i = 0; i < max_threads; i++) + pthread_create(&ta[i], NULL, cYTFeedParser::GetVideoUrlsThread, this); + for (unsigned i = 0; i < max_threads; i++) { + void *r; + pthread_join(ta[i], &r); + ret |= *((int *)r); } return ret; } diff --git a/src/system/ytparser.h b/src/system/ytparser.h index 980525f5d..fb97d65d1 100644 --- a/src/system/ytparser.h +++ b/src/system/ytparser.h @@ -28,6 +28,9 @@ #include #include +#include +#include + class cYTVideoUrl { public: @@ -56,6 +59,7 @@ class cYTVideoInfo std::string published; int duration; yt_urlmap_t formats; + bool ret; void Dump(); std::string GetUrl(int fmt = 0, bool mandatory = true); @@ -80,6 +84,7 @@ class cYTFeedParser int feedmode; int max_results; + int concurrent_downloads; bool parsed; yt_video_list_t videos; @@ -88,6 +93,10 @@ class cYTFeedParser std::string getXmlData(xmlNodePtr node); CURL *curl_handle; + OpenThreads::Mutex mutex; + int worker_index; + static void* GetVideoUrlsThread(void*); + static void* DownloadThumbnailsThread(void*); static size_t CurlWriteToString(void *ptr, size_t size, size_t nmemb, void *data); void encodeUrl(std::string &txt); @@ -95,8 +104,8 @@ class cYTFeedParser static void splitString(std::string &str, std::string delim, std::vector &strlist, int start = 0); static void splitString(std::string &str, std::string delim, std::map &strmap, int start = 0); static bool saveToFile(const char * name, std::string str); - bool getUrl(std::string &url, std::string &answer); - bool DownloadUrl(std::string &url, std::string &file); + bool getUrl(std::string &url, std::string &answer, CURL *_curl_handle = NULL); + bool DownloadUrl(std::string &url, std::string &file, CURL *_curl_handle = NULL); bool parseFeedXml(std::string &answer); bool decodeVideoInfo(std::string &answer, cYTVideoInfo &vinfo); bool supportedFormat(int fmt); @@ -124,7 +133,8 @@ class cYTFeedParser ~cYTFeedParser(); bool ParseFeed(yt_feed_mode_t mode = MOST_POPULAR, std::string search = "", std::string vid = ""); - bool ParseVideoInfo(cYTVideoInfo &vinfo); + bool ParseVideoInfo(cYTVideoInfo &vinfo, CURL *_curl_handle = NULL); + bool DownloadThumbnail(cYTVideoInfo &vinfo, CURL *_curl_handle = NULL); bool GetVideoUrls(); bool DownloadThumbnails(); void Dump(); @@ -140,6 +150,7 @@ class cYTFeedParser void SetRegion(std::string reg) { region = reg; } void SetMaxResults(int count) { max_results = count; } + void SetConcurrentDownloads(int count) { concurrent_downloads = count; } }; #endif From 1ee39e109bf8e7775d2ca9b1909f2b5ef0a15164 Mon Sep 17 00:00:00 2001 From: martii Date: Mon, 10 Jun 2013 12:56:05 +0200 Subject: [PATCH 16/63] yt: revert to original quality selection order) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/b90497fc69b0f6489c80453ee25df8d7c2e62de0 Author: martii Date: 2013-06-10 (Mon, 10 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/ytparser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system/ytparser.cpp b/src/system/ytparser.cpp index 29fce2986..3e9eb1d46 100644 --- a/src/system/ytparser.cpp +++ b/src/system/ytparser.cpp @@ -72,6 +72,8 @@ std::string cYTVideoInfo::GetUrl(int fmt, bool mandatory) if (mandatory) return ""; } + if ((it = formats.find(37)) != formats.end()) // 1080p MP4 + return it->second.GetUrl(); if ((it = formats.find(22)) != formats.end()) // 720p MP4 return it->second.GetUrl(); #if 0 @@ -82,8 +84,6 @@ std::string cYTVideoInfo::GetUrl(int fmt, bool mandatory) #endif if ((it = formats.find(18)) != formats.end()) // 270p/360p MP4 return it->second.GetUrl(); - if ((it = formats.find(37)) != formats.end()) // 1080p MP4 - return it->second.GetUrl(); return ""; } From 7646d2a07478db192c92f3ae772ec69c99e30aff Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Wed, 19 Jun 2013 15:17:40 +0400 Subject: [PATCH 17/63] add system/set_threadname.h from git://gitorious.org/~martii/neutrino-mp/martiis-neutrino-mp.git Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/2d47ab2ecde64cef3797fc4389e0aaf3e850b0c1 Author: [CST] Focus Date: 2013-06-19 (Wed, 19 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/set_threadname.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/system/set_threadname.h diff --git a/src/system/set_threadname.h b/src/system/set_threadname.h new file mode 100644 index 000000000..587b8c4f9 --- /dev/null +++ b/src/system/set_threadname.h @@ -0,0 +1,14 @@ +#ifndef __set_threadname_h__ +#define __set_threadname_h__ +#include +#include +#include + +inline void set_threadname(const char *name) +{ + char threadname[17]; + strncpy(threadname, name, sizeof(threadname)); + threadname[16] = 0; + prctl (PR_SET_NAME, (unsigned long)&threadname); +} +#endif From 4cd4c66b6e62445d6eba0a413b6655cc7ad50759 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Thu, 20 Jun 2013 16:11:52 +0400 Subject: [PATCH 18/63] src/gui/moviebrowser.cpp: change default ytquality to 1080p Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/9cf2c7e0c609e79c95efef51e304ac72f5773f66 Author: [CST] Focus Date: 2013-06-20 (Thu, 20 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/moviebrowser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index fd2a30b09..76c40a3a3 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -772,7 +772,7 @@ bool CMovieBrowser::loadSettings(MB_SETTINGS* settings) } settings->ytmode = configfile.getInt32("mb_ytmode", cYTFeedParser::MOST_POPULAR); settings->ytresults = configfile.getInt32("mb_ytresults", 10); - settings->ytquality = configfile.getInt32("mb_ytquality", 22); // itag value (MP4, 720p) + settings->ytquality = configfile.getInt32("mb_ytquality", 37); // itag value (MP4, 1080p) settings->ytconcconn = configfile.getInt32("mb_ytconcconn", 4); // concurrent connections settings->ytregion = configfile.getString("mb_ytregion", "default"); settings->ytsearch = configfile.getString("mb_ytsearch", ""); From 756a8a4820d3e2f8e90a86b3f158490f7112621f Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Fri, 21 Jun 2013 13:52:55 +0200 Subject: [PATCH 19/63] Locales: small text change for image info caption Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/04957806680574ada6e7459e776fd2ef0a590789 Author: Thilo Graf Date: 2013-06-21 (Fri, 21 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 224ee5908..c1d8e446b 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -591,7 +591,7 @@ imageinfo.creator Ersteller: imageinfo.date Datum: imageinfo.dokumentation Dokus: imageinfo.forum Forum: -imageinfo.head Image Info: +imageinfo.head Image-Informationen imageinfo.homepage Homepage: imageinfo.image Image: imageinfo.kernel Kernel: From 8a6ae48f5e0e032a64dc464c221901ab8629378e Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 20:34:19 +0200 Subject: [PATCH 20/63] CComponentsForm: fix position of replaced item If cc-item is bound on a parent form, it's not enough to replace the item object only, also properties like parent and index must be moved to new item to ensure that positions are calculated correctly. But it's matter for unbound cc-items. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/c66c7783268e15fd35df5225911d9ca59e3f7c26 Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/components/cc.h | 2 ++ src/gui/components/cc_frm.cpp | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gui/components/cc.h b/src/gui/components/cc.h index 39b8909d6..3d01723d9 100644 --- a/src/gui/components/cc.h +++ b/src/gui/components/cc.h @@ -242,6 +242,8 @@ class CComponentsItem : public CComponents ///sets pointer to the form object in which this item is embedded. virtual void setParent(CComponentsItem *parent){cc_parent = parent;}; + ///returns pointer to the form object in which this item is embedded. + virtual CComponentsItem * getParent(){return cc_parent;}; ///abstract: paint item, arg: do_save_bg see paintInit() above virtual void paint(bool do_save_bg = CC_SAVE_SCREEN_YES) = 0; diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 5040f7d47..46313ba2e 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -188,9 +188,14 @@ CComponentsItem* CComponentsForm::getCCItem(const uint& cc_item_id) void CComponentsForm::replaceCCItem(const uint& cc_item_id, CComponentsItem* new_cc_Item) { if (!v_cc_items.empty()){ - if (v_cc_items[cc_item_id]){ - delete v_cc_items[cc_item_id]; - v_cc_items[cc_item_id] = NULL; + CComponentsItem* old_Item = v_cc_items[cc_item_id]; + if (old_Item){ + if (old_Item->getParent()){ + new_cc_Item->setParent(old_Item); + new_cc_Item->setIndex(old_Item->getIndex()); + } + delete old_Item; + old_Item = NULL; v_cc_items[cc_item_id] = new_cc_Item; } } From ce93cfe5d5c83825f8a8ffd5ce9d8858a61f62b3 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 22:20:42 +0200 Subject: [PATCH 21/63] CComponentsForm: add new member genIndex() Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a8721fa72a93a1ca8db03dd8ed71962767889396 Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc.h | 3 ++- src/gui/components/cc_frm.cpp | 15 ++++++++++----- src/gui/components/cc_frm.h | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gui/components/cc.h b/src/gui/components/cc.h index 3d01723d9..e86b43799 100644 --- a/src/gui/components/cc.h +++ b/src/gui/components/cc.h @@ -267,7 +267,8 @@ class CComponentsItem : public CComponents ///get current index of item, see also attribut cc_item_index virtual int getIndex(){return cc_item_index;}; - ///set index to item, see also attribut cc_item_index + ///set an index to item, see also attribut cc_item_index. + ///To generate an index, use genIndex() virtual void setIndex(const int& index){cc_item_index = index;}; }; diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 46313ba2e..ebc65a028 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -143,11 +143,7 @@ void CComponentsForm::addCCItem(CComponentsItem* cc_Item) #endif //assign item index - int count = v_cc_items.size(); - char buf[64]; - snprintf(buf, sizeof(buf), "%d%d", cc_item_index, count); - buf[63] = '\0'; - int new_index = atoi(buf); + int new_index = genIndex(); cc_Item->setIndex(new_index); #ifdef DEBUG_CC printf(" %s-%d parent index = %d, assigned index ======> %d\n", __FUNCTION__, __LINE__, cc_item_index, new_index); @@ -177,6 +173,15 @@ bool CComponentsForm::isAdded(CComponentsItem* cc_item) return ret; } +int CComponentsForm::genIndex() +{ + int count = v_cc_items.size(); + char buf[64]; + snprintf(buf, sizeof(buf), "%d%d", cc_item_index, count); + buf[63] = '\0'; + int ret = atoi(buf); + return ret; +} CComponentsItem* CComponentsForm::getCCItem(const uint& cc_item_id) { diff --git a/src/gui/components/cc_frm.h b/src/gui/components/cc_frm.h index 38a2bd348..d9cd09e7c 100644 --- a/src/gui/components/cc_frm.h +++ b/src/gui/components/cc_frm.h @@ -41,6 +41,8 @@ class CComponentsForm : public CComponentsItem std::vector v_cc_items; void initVarForm(); void paintForm(bool do_save_bg); + ///generates next possible index for an item, see also cc_item_index, getIndex(), setIndex() + int genIndex(); int append_h_offset; int append_v_offset; From d09c6a7c3ca64050e5aeb73a2d4411c98ee34973 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 22:28:23 +0200 Subject: [PATCH 22/63] CComponentsForm: use addCCItem() instead push_back push_back doesn't make all necessary steps to add an item Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/460c8bbff3560dd2a7037b58e7de245d645d0c1a Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index ebc65a028..7cba3c969 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -227,7 +227,7 @@ void CComponentsForm::insertCCItem(const uint& cc_item_id, CComponentsItem* cc_I } if (v_cc_items.empty()){ - v_cc_items.push_back(cc_Item); + addCCItem(cc_Item); #ifdef DEBUG_CC printf("[CComponentsForm] %s insert cc_Item not possible, v_cc_items is empty, cc_Item added\n", __FUNCTION__); #endif From 744b88e627c594759d7227917d76a3add42c9e1e Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 22:54:08 +0200 Subject: [PATCH 23/63] CComponentsForm: fix position of inserted item It's not enough to insert an item object only. Also properties like parent and index must be defined to inserted item to ensure that positions are calculated correctly. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/75fe48043ecf64a160c954643950f8427cad3d63 Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 7cba3c969..1cf9ff3ca 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -231,8 +231,13 @@ void CComponentsForm::insertCCItem(const uint& cc_item_id, CComponentsItem* cc_I #ifdef DEBUG_CC printf("[CComponentsForm] %s insert cc_Item not possible, v_cc_items is empty, cc_Item added\n", __FUNCTION__); #endif - }else + }else{ v_cc_items.insert(v_cc_items.begin()+cc_item_id, cc_Item); + cc_Item->setParent(this); + //assign item index + int index = genIndex(); + cc_Item->setIndex(index); + } } void CComponentsForm::removeCCItem(const uint& cc_item_id) From 730cbee3cdc7e69a1027d1e9ff642d4e07f64975 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 23:25:55 +0200 Subject: [PATCH 24/63] CComponentsWindow: remove unused member Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/3fe6a376a55b58b674473ec05db2dc8e1ba5c2d7 Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm_window.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/gui/components/cc_frm_window.cpp b/src/gui/components/cc_frm_window.cpp index 2b1fb257f..254e4a6ac 100644 --- a/src/gui/components/cc_frm_window.cpp +++ b/src/gui/components/cc_frm_window.cpp @@ -211,14 +211,6 @@ void CComponentsWindow::addWindowItem(CComponentsItem* cc_Item) ccw_body->addCCItem(cc_Item); } -int CComponentsWindow::getStartY() -{ - if (ccw_head) - return ccw_head->getHeight(); - - return 0; -} - void CComponentsWindow::initCCWItems() { #ifdef DEBUG_CC From 772bb947184d9e049f4f47d80ff24a197d5b5170 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Sun, 23 Jun 2013 23:27:28 +0200 Subject: [PATCH 25/63] CComponentsWindow: fix wrong type for ccw_footer Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4a2a55e3ddb9f751ff616f900962681d40405e09 Author: Thilo Graf Date: 2013-06-23 (Sun, 23 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gui/components/cc_frm.h b/src/gui/components/cc_frm.h index d9cd09e7c..0d06549e4 100644 --- a/src/gui/components/cc_frm.h +++ b/src/gui/components/cc_frm.h @@ -215,7 +215,7 @@ class CComponentsWindow : public CComponentsForm ///object: body object, this is the container for all needed items, to add with addWindowItem() CComponentsForm * ccw_body; ///object: footer object, to get access to header properties see also getFooterObject( - CComponentsForm * ccw_footer; + CComponentsFooter * ccw_footer; ///property: caption in header, see also getHeaderObject() std::string ccw_caption; ///property: icon name in header, see also getHeaderObject() @@ -297,9 +297,7 @@ class CComponentsWindow : public CComponentsForm CComponentsForm* getBodyObject(){return ccw_body;}; ///returns a pointer to the internal footer object, use this to get access to footer properities - CComponentsForm* getFooterObject(){return ccw_footer;}; - - int getStartY(); //y value for start of the area below header + CComponentsFooter* getFooterObject(){return ccw_footer;}; }; #endif From 4ad1c86c70aef1a38474ddd859989db131834e68 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Mon, 24 Jun 2013 15:07:51 +0200 Subject: [PATCH 26/63] yweb: use correct remotecontrol in dependecy from neutrino-setting ... ... or choose another remotecontrol for yweb only * TODO: add an image an an imagemap for remotecontrol v4 (neo twin) * imagemaps for dbox-remotecontrols are taken from tuxbox neutrino Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/915789cac8f67e6577fae858248e28d15d2a11dd Author: vanhofen Date: 2013-06-24 (Mon, 24 Jun 2013) Origin message was: ------------------ - yweb: use correct remotecontrol in dependecy from neutrino-setting ... ... or choose another remotecontrol for yweb only * TODO: add an image an an imagemap for remotecontrol v4 (neo twin) * imagemaps for dbox-remotecontrols are taken from tuxbox neutrino ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Blocks.txt | 222 ++++++++++++------ src/nhttpd/web/Y_Settings_yWeb.yhtm | 33 ++- src/nhttpd/web/Y_Version.txt | 4 +- src/nhttpd/web/images/LICENSE | 4 +- src/nhttpd/web/images/Makefile.am | 13 +- src/nhttpd/web/images/rc.gif | Bin 20540 -> 0 bytes .../web/images/{hd1.jpg => rc_cst_v1.jpg} | Bin .../web/images/{neo.jpg => rc_cst_v2.jpg} | Bin .../web/images/{zee.jpg => rc_cst_v3.jpg} | Bin .../images/{rc.jpg => rc_dbox_nokia_old.jpg} | Bin .../{rc_sagem.jpg => rc_dbox_philips.jpg} | Bin src/nhttpd/web/images/rcd.jpg | Bin 37918 -> 0 bytes 12 files changed, 187 insertions(+), 89 deletions(-) delete mode 100644 src/nhttpd/web/images/rc.gif rename src/nhttpd/web/images/{hd1.jpg => rc_cst_v1.jpg} (100%) rename src/nhttpd/web/images/{neo.jpg => rc_cst_v2.jpg} (100%) rename src/nhttpd/web/images/{zee.jpg => rc_cst_v3.jpg} (100%) rename src/nhttpd/web/images/{rc.jpg => rc_dbox_nokia_old.jpg} (100%) rename src/nhttpd/web/images/{rc_sagem.jpg => rc_dbox_philips.jpg} (100%) delete mode 100644 src/nhttpd/web/images/rcd.jpg diff --git a/src/nhttpd/web/Y_Blocks.txt b/src/nhttpd/web/Y_Blocks.txt index 7894b0ca4..df2f9b83c 100644 --- a/src/nhttpd/web/Y_Blocks.txt +++ b/src/nhttpd/web/Y_Blocks.txt @@ -496,19 +496,92 @@ end-block~frame_live_epg # ------- Remote start-block~remote -{=if-equal:CST Neo SAT~{=if-equal:{=ini-get:/var/tuxbox/config/Y-Web.conf;fb;default=}~default~{=func:get_boxtype=}~{=ini-get:/var/tuxbox/config/Y-Web.conf;fb;default=}=}~{=include-block:Y_Blocks.txt;remote_neo=}~ - {=if-equal:{=func:get_boxtype=}~CST Neo CABLE~{=include-block:Y_Blocks.txt;remote_neo=}~ - {=if-equal:{=func:get_boxtype=}~CST Zee SAT~{=include-block:Y_Blocks.txt;remote_zee=}~ - {=if-equal:{=func:get_boxtype=}~CST Zee CABLE~{=include-block:Y_Blocks.txt;remote_zee=}~ - {=if-equal:{=func:get_boxtype=}~CST Neo Twin SAT~{=include-block:Y_Blocks.txt;remote_zee=}~ - {=if-equal:{=func:get_boxtype=}~CST Neo Twin CABLE~{=include-block:Y_Blocks.txt;remote_zee=}~ -{=include-block:Y_Blocks.txt;remote_hd1=}=}=}=}=}=}=} +{=var-set:nfbtype={=ini-get:/var/tuxbox/config/neutrino.conf;remote_control_hardware=}=} +{=var-set:yfbtype={=ini-get:/var/tuxbox/config/Y-Web.conf;fb;0=}=} +{=var-set:boxtype={=func:get_boxtype=}=} +{=if-equal:{=var-get:yfbtype=}~0~ + {=if-equal:{=var-get:nfbtype=}~2~ {=include-block:Y_Blocks.txt;rc_dbox_philips=}~ + {=if-equal:{=var-get:nfbtype=}~1~ {=include-block:Y_Blocks.txt;rc_dbox_nokia_old=}~ + {=if-equal:{=var-get:boxtype=}~CST Neo SAT~ {=include-block:Y_Blocks.txt;rc_cst_v2=}~ + {=if-equal:{=var-get:boxtype=}~CST Neo CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v2=}~ + {=if-equal:{=var-get:boxtype=}~CST Zee SAT~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ + {=if-equal:{=var-get:boxtype=}~CST Zee CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ + {=if-equal:{=var-get:boxtype=}~CST Neo Twin SAT~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} + {=if-equal:{=var-get:boxtype=}~CST Neo Twin CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} + + {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_v1=} + =}=}=}=}=}=} + =}=} +~ + {=if-equal:{=var-get:yfbtype=}~-2~ {=include-block:Y_Blocks.txt;rc_dbox_philips=}~ + {=if-equal:{=var-get:yfbtype=}~-1~ {=include-block:Y_Blocks.txt;rc_dbox_nokia_old=}~ + {=if-equal:{=var-get:yfbtype=}~1~ {=include-block:Y_Blocks.txt;rc_cst_v1=}~ + {=if-equal:{=var-get:yfbtype=}~2~ {=include-block:Y_Blocks.txt;rc_cst_v2=}~ + {=if-equal:{=var-get:yfbtype=}~3~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ + {=if-equal:{=var-get:yfbtype=}~4~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} + + {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_hd1=} + =}=}=}=}=}=} +=} end-block~remote -# ------- Remote Coolstream Neo -start-block~remote_neo - - +# ------ Remote CST V1 (HD1 / BSE) +start-block~rc_cst_v1 +remote + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +end-block~rc_cst_v1 + +# ------- Remote CST V2 (NEO) +start-block~rc_cst_v2 +remote + @@ -557,12 +630,12 @@ start-block~remote_neo -end-block~remote_neo +end-block~rc_cst_v2 -# ------ Remote Coolstream ZEE -start-block~remote_zee - - +# ------ Remote CST V3 (ZEE, NEO2) +start-block~rc_cst_v3 +remote + @@ -612,57 +685,70 @@ start-block~remote_zee -end-block~remote_zee +end-block~rc_cst_v3 -# ------ Remote Coolstream HD1 -start-block~remote_hd1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# ------- Remote d-Box Nokia old +start-block~rc_dbox_nokia_old +remote + + + + + + + + + + + + + + + + + + + + + + + + + + + -end-block~remote_hd1 +end-block~rc_dbox_nokia_old + +# ------- Remote d-Box Philips/Sagem +start-block~rc_dbox_philips +remote + + + + + + + + + + + + + + + + + + + + + + + + + + + + +end-block~rc_dbox_philips diff --git a/src/nhttpd/web/Y_Settings_yWeb.yhtm b/src/nhttpd/web/Y_Settings_yWeb.yhtm index bc7e396d9..0be09d97a 100644 --- a/src/nhttpd/web/Y_Settings_yWeb.yhtm +++ b/src/nhttpd/web/Y_Settings_yWeb.yhtm @@ -9,12 +9,20 @@ function do_submit(){ document.f.submit(); } function do_init(){ - val = "{=ini-get:/var/tuxbox/config/Y-Web.conf;fb;{=if-equal:{=global-var-get:boxtype=}~coolstream~Coolstream~default=}~open=}"; + val = "{=ini-get:/var/tuxbox/config/Y-Web.conf;fb;0~open=}"; var sel=2; switch(val){ - case "default": sel=0; break; - case "Nokia": sel=1; break; - case "CST": sel=3; break; + case "-2": // d-box philips + case "-1": // d-box nokia old + case "0": // auto + case "1": // cst hd1/bse + case "2": // cst neo + case "3": // cst zee/neo2 + case "4": // cst neo twin (todo!) + sel=(sel*1+val*1); + break; + default: + break; } document.f.fb.selectedIndex = sel; val = "{=ini-get:/var/tuxbox/config/Y-Web.conf;start_page;bouquets~cache=}"; @@ -78,12 +86,17 @@ function do_init(){ {=L:others=} {=L:set.yweb.remote=} - + + + {=L:set.yweb.start_page=} diff --git a/src/nhttpd/web/Y_Version.txt b/src/nhttpd/web/Y_Version.txt index 92c58e2c6..fd3d4cd20 100644 --- a/src/nhttpd/web/Y_Version.txt +++ b/src/nhttpd/web/Y_Version.txt @@ -1,4 +1,4 @@ -version=2.8.0.33 -date=06.02.2013 +version=2.8.0.34 +date=24.06.2013 type=Release info=Port CST diff --git a/src/nhttpd/web/images/LICENSE b/src/nhttpd/web/images/LICENSE index c98e4bd19..71f5be81e 100644 --- a/src/nhttpd/web/images/LICENSE +++ b/src/nhttpd/web/images/LICENSE @@ -1,7 +1,7 @@ Same pictures used are form the Tuxbox Community: Published under GPL v2 -- rc.jpg : Jonny Spitzner -- rc_sagem.jpg Jonny Spitzner +- rc_dbox_nokia_old.jpg : Jonny Spitzner +- rc_dbox_philips.jpg : Jonny Spitzner - tux.gif : from wiki.tuxbox.org From Johannes Golombek yjogol@online.de: diff --git a/src/nhttpd/web/images/Makefile.am b/src/nhttpd/web/images/Makefile.am index 01bcdc88b..c2cb4e513 100644 --- a/src/nhttpd/web/images/Makefile.am +++ b/src/nhttpd/web/images/Makefile.am @@ -38,7 +38,6 @@ install_DATA = accept.png \ ftype_folder.gif \ ftype_link.gif \ fullscreen.png \ - hd1.jpg \ help.gif \ help_white.gif \ hidden.gif \ @@ -56,7 +55,6 @@ install_DATA = accept.png \ lock.gif \ lock.png \ modify.png \ - neo.jpg \ new.gif \ new.png \ ok.gif \ @@ -66,9 +64,11 @@ install_DATA = accept.png \ properties.gif \ properties.png \ radio.png \ - rc.gif \ - rc.jpg \ - rc_sagem.jpg \ + rc_cst_v1.jpg \ + rc_cst_v2.jpg \ + rc_cst_v3.jpg \ + rc_dbox_nokia_old.jpg \ + rc_dbox_philips.jpg \ record.gif \ record.png \ reload.gif \ @@ -105,5 +105,4 @@ install_DATA = accept.png \ x_red.gif \ yjogol.gif \ y.png \ - zap.png \ - zee.jpg + zap.png diff --git a/src/nhttpd/web/images/rc.gif b/src/nhttpd/web/images/rc.gif deleted file mode 100644 index dfa2a15201dd7a5f342815924209ace487c2819d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20540 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

_v)zoBjaKU|$vR9#!Mt+4>XA-KcBg1fuB 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 pNpL65I;{{3_Lo27g{`EO}PYOeqQ From 94e792ad0c6c52b4b50ef3ab598bd97e5256181c Mon Sep 17 00:00:00 2001 From: vanhofen Date: Mon, 24 Jun 2013 15:37:14 +0200 Subject: [PATCH 27/63] yweb: supplement to 4ad1c86 (the missing language entrys) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/b9d9bdc21bd76a304e56b62fb48463c72f1fcbec Author: vanhofen Date: 2013-06-24 (Mon, 24 Jun 2013) Origin message was: ------------------ - yweb: supplement to 4ad1c86 (the missing language entrys) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/languages/Deutsch | 1 + src/nhttpd/web/languages/English | 1 + 2 files changed, 2 insertions(+) diff --git a/src/nhttpd/web/languages/Deutsch b/src/nhttpd/web/languages/Deutsch index c8ca664e0..943dfe257 100644 --- a/src/nhttpd/web/languages/Deutsch +++ b/src/nhttpd/web/languages/Deutsch @@ -53,6 +53,7 @@ attention=Achtung! directory=Verzeichnis filename=Dateiname restriced_by_management_ip=Zugriff verwehrt wg. ManagementIP +automatic=automatisch # ==========Main Menue main.boxcontrol=Boxsteuerung diff --git a/src/nhttpd/web/languages/English b/src/nhttpd/web/languages/English index d49bac530..df3181952 100644 --- a/src/nhttpd/web/languages/English +++ b/src/nhttpd/web/languages/English @@ -53,6 +53,7 @@ attention=Attention! directory=Directory filename=Filename restriced_by_management_ip=restricted by ManagementIP +automatic=automatically #========= MAIN Menue main.live_tv_desc=LiveTV From 766bcee340f3c1562360bbaa7d4c47aba60eef27 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 25 Jun 2013 08:31:28 +0200 Subject: [PATCH 28/63] yweb: supplement2 to 4ad1c86 (typo) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ef64f1dfbc4b65940c30d90f52c127df3c2809e5 Author: vanhofen Date: 2013-06-25 (Tue, 25 Jun 2013) Origin message was: ------------------ - yweb: supplement2 to 4ad1c86 (typo) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Blocks.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nhttpd/web/Y_Blocks.txt b/src/nhttpd/web/Y_Blocks.txt index df2f9b83c..32f6504b3 100644 --- a/src/nhttpd/web/Y_Blocks.txt +++ b/src/nhttpd/web/Y_Blocks.txt @@ -520,7 +520,7 @@ start-block~remote {=if-equal:{=var-get:yfbtype=}~3~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=if-equal:{=var-get:yfbtype=}~4~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} - {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_hd1=} + {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_v1=} =}=}=}=}=}=} =} end-block~remote From 0bbf33c104bb246a200510fe6896734d1a930044 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 25 Jun 2013 09:59:28 +0200 Subject: [PATCH 29/63] yweb: use a more matching icon for remotecontrol Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/177eb70b91b688dfcf25473fba394ae036f86843 Author: vanhofen Date: 2013-06-25 (Tue, 25 Jun 2013) Origin message was: ------------------ - yweb: use a more matching icon for remotecontrol ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/images/fb.png | Bin 457 -> 521 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/nhttpd/web/images/fb.png b/src/nhttpd/web/images/fb.png index da7e7f031fda5e1ddef740a1342060c0ce6e7e48..e08d81e8bd17e69717154698f806eb081b2d102d 100644 GIT binary patch delta 506 zcmVD!^a>9 zu3Xnm9LGtFF@K3MCMgz+N9J<5#C6>y2!bo%E$|57Zxfv2pC-s;GI*XxqtU?gJRHZl zH-YuDFdPo?eVFnEqrity!x`oUTExd%|e8WcN(|`UXmmQpnkVOv)R0CwOWrY%OYhqn>}7) w%GqpoIUbMAv9()f4}i|$P=1H^zy%O}1D+F*rAdidHvj+t07*qoM6N<$f(%96w*UYD delta 442 zcmV;r0Y(0a1jz%C8Gi!+001a04^sdD00d`2O+f$vugEtAis=9V02y>eSaefwW^{L9 za%BKPWN%_+AW3auXJt}lVPtu6$z?nM006pBOjJex|Nl{OsZnvMdYZ(IvE6Tw!G)~d zQE{nJa;Z~usZ(>RRCTLVb*xr)tyg)jSbDHnd$C%4vRr<&Tz`JGUV*n?gSlXZx?zR8 zV~4$Dh`wfvz-W%cY?8=ql*w+C%5Rp-ZZ~`e~qy@G-;czIi=(F;L7V|^U`bMJm=Y! zH*Ire^S k{D}F~Hd)&=$;JP^0e+uT7y1wj_y7O^07*qoM6N<$f@YQDZvX%Q From 4bc1f03422882222728d757c28340a6e9e4374aa Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 25 Jun 2013 10:37:00 +0200 Subject: [PATCH 30/63] yweb: a more suitable caption of remotecontrol button Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/5f87a1246da9621005495c8b24e3e17750c50880 Author: vanhofen Date: 2013-06-25 (Tue, 25 Jun 2013) Origin message was: ------------------ - yweb: a more suitable caption of remotecontrol button ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Main.css | 2 +- src/nhttpd/web/Y_Tools_Screenshot.yhtm | 16 ++++++++++++---- src/nhttpd/web/languages/Deutsch | 2 ++ src/nhttpd/web/languages/English | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/nhttpd/web/Y_Main.css b/src/nhttpd/web/Y_Main.css index 705b64cad..ea0f859d3 100644 --- a/src/nhttpd/web/Y_Main.css +++ b/src/nhttpd/web/Y_Main.css @@ -51,7 +51,7 @@ button[ytype="timedown"]{background-image:url(/images/time_down.png);} button[ytype="timeadd"]{background-image:url(/images/time_add.png);} button[ytype="snapshot"]{background-image:url(/images/snapshot.png);} button[ytype="clearshot"]{background-image:url(/images/remove.png);} -button[ytype="zoomshot"]{background-image:url(/images/fullscreen.png);} +button[ytype="switchrc"]{background-image:url(/images/fb.png);} button[ytype="go"]{background-image:url(/images/accept.png);} button[ytype="download"]{background-image:url(/images/wget.gif);} button[ytype="clear"]{background-image:url(/images/remove.png);} diff --git a/src/nhttpd/web/Y_Tools_Screenshot.yhtm b/src/nhttpd/web/Y_Tools_Screenshot.yhtm index 6adee9bc7..2e25e5d3d 100644 --- a/src/nhttpd/web/Y_Tools_Screenshot.yhtm +++ b/src/nhttpd/web/Y_Tools_Screenshot.yhtm @@ -65,17 +65,25 @@ function do_clearshot(){ loadSyncURL("/control/exec?Y_Tools&screenshot_clear"); } -function do_zoomshot(){ - // not a really zoom-function +function do_switchrc(){ if (id('remote').style.display == 'none') $('remote').show(); else $('remote').hide(); + + do_switchrc_txt(); +} + +function do_switchrc_txt(){ + if (id('remote').style.display == 'none') + $('switchrc').update("{=L:bc.control.remote=} {=L:show=}"); + else + $('switchrc').update("{=L:bc.control.remote=} {=L:hide=}"); } //]]> - +

{=var-set:help_url==}{=var-set:menu={=L:bc.menue.screenshot=}=}{=include-block:Y_Blocks.txt;work_menu=}
@@ -85,7 +93,7 @@ function do_zoomshot(){
    -   +  
diff --git a/src/nhttpd/web/languages/Deutsch b/src/nhttpd/web/languages/Deutsch index 943dfe257..0457b64cf 100644 --- a/src/nhttpd/web/languages/Deutsch +++ b/src/nhttpd/web/languages/Deutsch @@ -54,6 +54,8 @@ directory=Verzeichnis filename=Dateiname restriced_by_management_ip=Zugriff verwehrt wg. ManagementIP automatic=automatisch +show=zeigen +hide=verstecken # ==========Main Menue main.boxcontrol=Boxsteuerung diff --git a/src/nhttpd/web/languages/English b/src/nhttpd/web/languages/English index df3181952..7e28b9afa 100644 --- a/src/nhttpd/web/languages/English +++ b/src/nhttpd/web/languages/English @@ -54,6 +54,8 @@ directory=Directory filename=Filename restriced_by_management_ip=restricted by ManagementIP automatic=automatically +show=show +hide=hide #========= MAIN Menue main.live_tv_desc=LiveTV From 201d07611ccf2bc8e969d699d5a5c10e42e85d58 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Mon, 24 Jun 2013 09:53:37 +0200 Subject: [PATCH 31/63] CComponentsWindow: add member Refresh() to reinit dimensions and positions Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/5521a3b34128dc57875a092626b5b4fc847e9bae Author: Thilo Graf Date: 2013-06-24 (Mon, 24 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/components/cc_frm.h b/src/gui/components/cc_frm.h index 0d06549e4..e936eaf6f 100644 --- a/src/gui/components/cc_frm.h +++ b/src/gui/components/cc_frm.h @@ -298,6 +298,9 @@ class CComponentsWindow : public CComponentsForm ///returns a pointer to the internal footer object, use this to get access to footer properities CComponentsFooter* getFooterObject(){return ccw_footer;}; + + ///refresh position and dimension and reinitialize elemenatary properties + void Refresh(){initCCWItems();}; }; #endif From 71884de80e3f13f0c4808e7cda0a2578636441f3 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 25 Jun 2013 10:58:33 +0200 Subject: [PATCH 32/63] CComponentsForm: fix possible segfault Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/7fd870a0639fef0866889720b40775f4f916a307 Author: Thilo Graf Date: 2013-06-25 (Tue, 25 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 1cf9ff3ca..990a62223 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -195,10 +195,9 @@ void CComponentsForm::replaceCCItem(const uint& cc_item_id, CComponentsItem* new if (!v_cc_items.empty()){ CComponentsItem* old_Item = v_cc_items[cc_item_id]; if (old_Item){ - if (old_Item->getParent()){ - new_cc_Item->setParent(old_Item); - new_cc_Item->setIndex(old_Item->getIndex()); - } + CComponentsItem * old_parent = old_Item->getParent(); + new_cc_Item->setParent(old_parent); + new_cc_Item->setIndex(old_parent->getIndex()); delete old_Item; old_Item = NULL; v_cc_items[cc_item_id] = new_cc_Item; From e2b20f649b946f0a02979faaf8ab81e64117e230 Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 25 Jun 2013 11:23:02 +0200 Subject: [PATCH 33/63] CComponentsForm: add more debug details Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f3cb2bc41cb6184ec1b3024f14ca70a22be8c09f Author: Thilo Graf Date: 2013-06-25 (Tue, 25 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp index 990a62223..f00078539 100644 --- a/src/gui/components/cc_frm.cpp +++ b/src/gui/components/cc_frm.cpp @@ -335,7 +335,8 @@ void CComponentsForm::paintCCItems() int w_diff = right_item - right_frm; int new_w = w_item - w_diff; if (right_item > right_frm){ - printf("[CComponentsForm] %s: item %d width is too large, definied width=%d, possible width=%d \n", __FUNCTION__, i, w_item, new_w); + printf("[CComponentsForm] %s: [form: %d] [item-index %d] [type=%d] width is too large, definied width=%d, possible width=%d \n", + __FUNCTION__, cc_item_index, cc_item->getIndex(), cc_item->getItemType(), w_item, new_w); cc_item->setWidth(new_w); } @@ -345,7 +346,8 @@ void CComponentsForm::paintCCItems() int h_diff = bottom_item - bottom_frm; int new_h = h_item - h_diff; if (bottom_item > bottom_frm){ - printf("[CComponentsForm] %s: item %d height is too large, definied height=%d, possible height=%d \n", __FUNCTION__, i, h_item, new_h); + printf("[CComponentsForm] %s: [form: %d] [item-index %d] [type=%d] height is too large, definied height=%d, possible height=%d \n", + __FUNCTION__, cc_item_index, cc_item->getIndex(), cc_item->getItemType(), h_item, new_h); cc_item->setHeight(new_h); } From c2ff66f2acede19fca134ccb71809bcd690535fc Mon Sep 17 00:00:00 2001 From: Thilo Graf Date: Tue, 25 Jun 2013 11:28:54 +0200 Subject: [PATCH 34/63] CComponentsWindow: fix missing init of footer Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/ac53313da46dcac61d8347c87d37e5a5d23f87d5 Author: Thilo Graf Date: 2013-06-25 (Tue, 25 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/components/cc_frm_window.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gui/components/cc_frm_window.cpp b/src/gui/components/cc_frm_window.cpp index 254e4a6ac..9feaffcdf 100644 --- a/src/gui/components/cc_frm_window.cpp +++ b/src/gui/components/cc_frm_window.cpp @@ -51,8 +51,7 @@ CComponentsWindow::CComponentsWindow(const std::string& caption, const char* ico ccw_caption = caption; ccw_icon_name = iconname; - initHeader(); - initBody(); + initCCWItems(); } CComponentsWindow::CComponentsWindow(neutrino_locale_t locale_caption, const char* iconname) From 5d982a69084248650c7e9200c5bbe42fb8d567f2 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 27 Jun 2013 12:20:29 +0200 Subject: [PATCH 35/63] yweb: re-introduce 'WebsiteMain.hosted_directory' * this directory can be used to host some of your cracy stuff. yhtm, yjs and ysh will also parsed now. it is reachable with /hosted/ * if exist a subdir named 'logos' in this directory you can use this as an external logo-dir for yweb too * path can be configured with '--with-hosted_httpddir=PATH' Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/9078775a0a7f12917e215d58eee011db1d7e8c0a Author: vanhofen Date: 2013-06-27 (Thu, 27 Jun 2013) Origin message was: ------------------ - yweb: re-introduce 'WebsiteMain.hosted_directory' * this directory can be used to host some of your cracy stuff. yhtm, yjs and ysh will also parsed now. it is reachable with /hosted/ * if exist a subdir named 'logos' in this directory you can use this as an external logo-dir for yweb too * path can be configured with '--with-hosted_httpddir=PATH' ------------------ This commit was generated by Migit --- acinclude.m4 | 7 +++++++ src/nhttpd/README | 2 +- src/nhttpd/nhttpd.conf.in | 2 +- src/nhttpd/web/Y_Blocks.txt | 2 +- src/nhttpd/web/Y_Settings_nhttpd.yhtm | 13 ++++++++++--- src/nhttpd/web/languages/Deutsch | 1 + src/nhttpd/web/languages/English | 1 + src/nhttpd/yconfig.h | 3 ++- src/nhttpd/yhttpd.cpp | 18 ++++++++++++------ src/nhttpd/yhttpd_core/yresponse.cpp | 8 -------- src/nhttpd/yhttpd_mods/mod_sendfile.cpp | 8 ++++++++ src/nhttpd/yhttpd_mods/mod_yparser.cpp | 22 +++++++++++++++------- 12 files changed, 59 insertions(+), 28 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 3b103591e..387b3338f 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -114,10 +114,12 @@ if test "$TARGET" = "cdk"; then sysconfdir="\${prefix}/etc" localstatedir="\${prefix}/var" libdir="\${prefix}/lib" + mntdir="\${prefix}/mnt" targetdatadir="\${TARGET_PREFIX}/share" targetsysconfdir="\${TARGET_PREFIX}/etc" targetlocalstatedir="\${TARGET_PREFIX}/var" targetlibdir="\${TARGET_PREFIX}/lib" + targetmntdir="\${TARGET_PREFIX}/mnt" fi TUXBOX_APPS_DIRECTORY_ONE(configdir,CONFIGDIR,localstatedir,/var,/tuxbox/config, @@ -152,6 +154,9 @@ TUXBOX_APPS_DIRECTORY_ONE(private_httpddir,PRIVATE_HTTPDDIR,datadir,/share,/tuxb TUXBOX_APPS_DIRECTORY_ONE(public_httpddir,PUBLIC_HTTPDDIR,localstatedir,/var,/httpd, [--with-public_httpddir=PATH ],[where to find the the public httpd files]) + +TUXBOX_APPS_DIRECTORY_ONE(hosted_httpddir,HOSTED_HTTPDDIR,mntdir,/mnt,/hosted, + [--with-hosted_httpddir=PATH ],[where to find the the hosted files]) ]) dnl automake <= 1.6 needs this specifications @@ -160,12 +165,14 @@ AC_SUBST(DATADIR) AC_SUBST(FONTDIR) AC_SUBST(GAMESDIR) AC_SUBST(LIBDIR) +AC_SUBST(MNTDIR) AC_SUBST(PLUGINDIR) AC_SUBST(UCODEDIR) AC_SUBST(THEMESDIR) AC_SUBST(ICONSDIR) AC_SUBST(PRIVATE_HTTPDDIR) AC_SUBST(PUBLIC_HTTPDDIR) +AC_SUBST(HOSTED_HTTPDDIR) dnl end workaround AC_DEFUN([TUXBOX_APPS_ENDIAN],[ diff --git a/src/nhttpd/README b/src/nhttpd/README index ec5e8f38d..b46815ca2 100644 --- a/src/nhttpd/README +++ b/src/nhttpd/README @@ -32,7 +32,7 @@ Tuxbox.LogosURL= WebsiteMain.directory=/share/tuxbox/neutrino/httpd // Main HTML,Javascript, Images Directoty root (e.g. read-only area in mFlash) WebsiteMain.override_directory=/var/httpd // Override directory (writable) for extensions or Updates. Webserver first search here. WebsiteMain.port=80 // Port the webserver is running on -WebsiteMain.hosted_directory=/var/hosted // our own directory hosted by the webserver. Adressable with /hosted/ +WebsiteMain.hosted_directory=/mnt/hosted // our own directory hosted by the webserver. Adressable with /hosted/ configfile.version=4 // Version of this config file mod_auth.authenticate=false // ask for username/password (http digit authentication) mod_auth.no_auth_client= // IP Adress without http authentication diff --git a/src/nhttpd/nhttpd.conf.in b/src/nhttpd/nhttpd.conf.in index a4d74e924..4facd7a42 100644 --- a/src/nhttpd/nhttpd.conf.in +++ b/src/nhttpd/nhttpd.conf.in @@ -4,7 +4,7 @@ Tuxbox.LogosURL=@TARGET_ICONSDIR@/logo WebsiteMain.directory=@TARGET_PRIVATE_HTTPDDIR@ WebsiteMain.override_directory=@TARGET_PUBLIC_HTTPDDIR@ WebsiteMain.port=80 -WebsiteMain.hosted_directory=/var/hosted +WebsiteMain.hosted_directory=@TARGET_HOSTED_HTTPDDIR@ configfile.version=4 mod_auth.authenticate=false mod_auth.no_auth_client= diff --git a/src/nhttpd/web/Y_Blocks.txt b/src/nhttpd/web/Y_Blocks.txt index 32f6504b3..d17ad1693 100644 --- a/src/nhttpd/web/Y_Blocks.txt +++ b/src/nhttpd/web/Y_Blocks.txt @@ -53,7 +53,7 @@ start-block~nhttpd_save_settings {=ini-set:/var/tuxbox/config/nhttpd.conf;WebsiteMain.port;{=port=}~cache=} {=ini-set:/var/tuxbox/config/nhttpd.conf;webserver.threading;{=threading=}~cache=} {=ini-set:/var/tuxbox/config/nhttpd.conf;server.no_keep-alive_ips;{=no_keep_alive_ips=}~cache=} -{=ini-set:/var/tuxbox/config/nhttpd.conf;WebsiteMain.hosted_directory;{=HostedDocRoot=}~cache=} +{=ini-set:/var/tuxbox/config/nhttpd.conf;WebsiteMain.hosted_directory;{=hosted_directory=}~cache=} {=ini-set:/var/tuxbox/config/nhttpd.conf;WebsiteMain.override_directory;{=override_directory=}~cache=} {=ini-set:/var/tuxbox/config/nhttpd.conf;mod_sendfile.mime_types;{=mod_sendfile_mime_types=}~cache=} {=ini-set:/var/tuxbox/config/nhttpd.conf;mod_sendfile.sendAll;{=mod_sendfile_sendAll=}~cache=} diff --git a/src/nhttpd/web/Y_Settings_nhttpd.yhtm b/src/nhttpd/web/Y_Settings_nhttpd.yhtm index 5418e22a4..d3891c79a 100644 --- a/src/nhttpd/web/Y_Settings_nhttpd.yhtm +++ b/src/nhttpd/web/Y_Settings_nhttpd.yhtm @@ -62,7 +62,7 @@ function do_submit() {=L:set.nhttpd.port=} -  {=L:active_after_boot=} +  {=L:set.nhttpd.active_after_boot=} {=if-not-equal:{=global-var-get:boxtype=}~coolstream~ @@ -76,8 +76,15 @@ function do_submit() =} {=L:set.nhttpd.alternate_web_folder=} -  {=L:active_after_boot=} - + +  {=L:set.nhttpd.active_after_boot=} + + + + {=L:set.nhttpd.hosted_folder=} + +  {=L:set.nhttpd.active_after_boot=} + {=L:set.nhttpd.allowed_file_extensions=} diff --git a/src/nhttpd/web/languages/Deutsch b/src/nhttpd/web/languages/Deutsch index 0457b64cf..5afaea92f 100644 --- a/src/nhttpd/web/languages/Deutsch +++ b/src/nhttpd/web/languages/Deutsch @@ -303,6 +303,7 @@ set.nhttpd.active_after_boot=Nach Neustart aktiv set.nhttpd.port=Port set.nhttpd.threading=Threading set.nhttpd.alternate_web_folder=Alternativer Web-Ordner +set.nhttpd.hosted_folder=Eingebundenes Verzeichnis set.nhttpd.allowed_file_extensions=Erlaubte Dateiendungen / MIME set.nhttpd.allow_all_file_extensions=Alle Dateiendungen erlauben set.nhttpd.url_of_logos_desc=URL bzw. Verzeichnis der Logos eingeben diff --git a/src/nhttpd/web/languages/English b/src/nhttpd/web/languages/English index 7e28b9afa..a769bd57b 100644 --- a/src/nhttpd/web/languages/English +++ b/src/nhttpd/web/languages/English @@ -306,6 +306,7 @@ set.nhttpd.active_after_boot=active after boot set.nhttpd.port=Port set.nhttpd.threading=Threading set.nhttpd.alternate_web_folder=Alternate Web-Folder +set.nhttpd.hosted_folder=Mounted directory set.nhttpd.allowed_file_extensions=Allowed File Extensions / MIME set.nhttpd.allow_all_file_extensions=Allow all File Extensions set.nhttpd.url_of_logos_desc=Enter URL or directory of Logos diff --git a/src/nhttpd/yconfig.h b/src/nhttpd/yconfig.h index 675d6a04e..663e919b0 100644 --- a/src/nhttpd/yconfig.h +++ b/src/nhttpd/yconfig.h @@ -109,7 +109,8 @@ #define YWEB_CONFIGFILE HTTPD_CONFIGDIR"/Y-Web.conf" #define PUBLICDOCUMENTROOT PUBLIC_HTTPDDIR #define NEUTRINO_CONFIGFILE CONFIGDIR"/neutrino.conf" -#define HOSTEDDOCUMENTROOT "/mnt/hosted" +#define HOSTEDDOCUMENTROOT HOSTED_HTTPDDIR +#define HOSTEDDOCUMENTURL "/hosted/" #define EXTRASDOCUMENTROOT "/mnt/hosted/extras" #define EXTRASDOCUMENTURL "/hosted/extras" #define ZAPITXMLPATH CONFIGDIR"/zapit" diff --git a/src/nhttpd/yhttpd.cpp b/src/nhttpd/yhttpd.cpp index 6d8125c8d..718728c1c 100644 --- a/src/nhttpd/yhttpd.cpp +++ b/src/nhttpd/yhttpd.cpp @@ -490,7 +490,7 @@ void Cyhttpd::ReadConfig(void) { Config->setString("Language.selected", HTTPD_DEFAULT_LANGUAGE); Config->setString("Language.directory", HTTPD_LANGUAGEDIR); if (Config->getString("WebsiteMain.hosted_directory", "") == "") - Config->setString("WebsiteMain.hosted_directory", "/var/hosted"); + Config->setString("WebsiteMain.hosted_directory", HOSTEDDOCUMENTROOT); Config->saveConfig(HTTPD_CONFIGFILE); } } @@ -527,14 +527,20 @@ void Cyhttpd::ReadConfig(void) { // Check location of logos if (Config->getString("Tuxbox.LogosURL", "") == "") { - if (access(std::string(ConfigList["WebsiteMain.directory"] + "/logos").c_str(), 4) == 0) { - Config->setString("Tuxbox.LogosURL", ConfigList["WebsiteMain.directory"] + "/logos"); - have_config = false; //save config - } - else if (access(std::string(ConfigList["WebsiteMain.override_directory"] ).c_str(), 4) == 0){ + if (access(std::string(ConfigList["WebsiteMain.override_directory"] + "/logos").c_str(), 4) == 0) { Config->setString("Tuxbox.LogosURL", ConfigList["WebsiteMain.override_directory"] + "/logos"); have_config = false; //save config } + else if (access(std::string(ConfigList["WebsiteMain.directory"] + "/logos").c_str(), 4) == 0){ + Config->setString("Tuxbox.LogosURL", ConfigList["WebsiteMain.directory"] + "/logos"); + have_config = false; //save config + } +#ifdef Y_CONFIG_USE_HOSTEDWEB + else if (access(std::string(ConfigList["WebsiteMain.hosted_directory"] + "/logos").c_str(), 4) == 0){ + Config->setString("Tuxbox.LogosURL", ConfigList["WebsiteMain.hosted_directory"] + "/logos"); + have_config = false; //save config + } +#endif //Y_CONFIG_USE_HOSTEDWEB } ConfigList["Tuxbox.LogosURL"] = Config->getString("Tuxbox.LogosURL", ""); diff --git a/src/nhttpd/yhttpd_core/yresponse.cpp b/src/nhttpd/yhttpd_core/yresponse.cpp index 96ed8f510..74af5515a 100644 --- a/src/nhttpd/yhttpd_core/yresponse.cpp +++ b/src/nhttpd/yhttpd_core/yresponse.cpp @@ -64,14 +64,6 @@ bool CWebserverResponse::SendResponse() { // Checking and Preperation: Auth, static, cache, ... //-------------------------------------------------------------- - // move to mod_sendfile ??? -#ifdef Y_CONFIG_USE_HOSTEDWEB - // for hosted webs: rewrite URL - std::string _hosted="/hosted/"; - if((Connection->Request.UrlData["path"]).compare(0,_hosted.length(),"/hosted/") == 0) // hosted Web ? - Connection->Request.UrlData["path"]=Cyhttpd::ConfigList["WebsiteMain.hosted_directory"] - +(Connection->Request.UrlData["path"]).substr(_hosted.length()-1); -#endif //Y_CONFIG_USE_HOSTEDWEB do { if (Connection->RequestCanceled) return false; diff --git a/src/nhttpd/yhttpd_mods/mod_sendfile.cpp b/src/nhttpd/yhttpd_mods/mod_sendfile.cpp index ce3a2551f..81f3cabb6 100644 --- a/src/nhttpd/yhttpd_mods/mod_sendfile.cpp +++ b/src/nhttpd/yhttpd_mods/mod_sendfile.cpp @@ -65,6 +65,14 @@ THandleStatus CmodSendfile::Hook_PrepareResponse(CyhookHandler *hh) { hh->status = HANDLED_NONE; log_level_printf(4, "mod_sendfile prepare hook start url:%s\n", hh->UrlData["fullurl"].c_str()); + +#ifdef Y_CONFIG_USE_HOSTEDWEB + // for hosted webs: rewrite URL + std::string _hosted=HOSTEDDOCUMENTURL; + if((hh->UrlData["path"]).compare(0,_hosted.length(),HOSTEDDOCUMENTURL) == 0) // hosted Web ? + hh->UrlData["path"]=hh->WebserverConfigList["WebsiteMain.hosted_directory"]+(hh->UrlData["path"]).substr(_hosted.length()-1); +#endif //Y_CONFIG_USE_HOSTEDWEB + std::string mime = sendfileTypes[hh->UrlData["fileext"]]; if (((mime != "") || (hh->WebserverConfigList["mod_sendfile.sendAll"] == "true")) && !(hh->UrlData["fileext"] == "yhtm" || hh->UrlData["fileext"] == "yjs" || hh->UrlData["fileext"] == "ysh")) { diff --git a/src/nhttpd/yhttpd_mods/mod_yparser.cpp b/src/nhttpd/yhttpd_mods/mod_yparser.cpp index b7995dc23..e6859fb25 100644 --- a/src/nhttpd/yhttpd_mods/mod_yparser.cpp +++ b/src/nhttpd/yhttpd_mods/mod_yparser.cpp @@ -271,10 +271,18 @@ std::string CyParser::cgi_file_parsing(CyhookHandler *hh, bool found = false; std::string htmlfullfilename, yresult, html_template; + bool isHosted = false; +#ifdef Y_CONFIG_USE_HOSTEDWEB + // for hosted webs: search in hosted_directory only + std::string _hosted=hh->WebserverConfigList["WebsiteMain.hosted_directory"]; + if((hh->UrlData["path"]).compare(0,_hosted.length(),hh->WebserverConfigList["WebsiteMain.hosted_directory"]) == 0) // hosted Web ? + isHosted = true; +#endif //Y_CONFIG_USE_HOSTEDWEB + char cwd[255]; getcwd(cwd, 254); - for (unsigned int i = 0; i < HTML_DIR_COUNT && !found; i++) { - htmlfullfilename = HTML_DIRS[i] + "/" + htmlfilename; + for (unsigned int i = 0; i < (isHosted ? 1 : HTML_DIR_COUNT) && !found; i++) { + htmlfullfilename = (isHosted ? "" : HTML_DIRS[i]) + "/" + htmlfilename; std::fstream fin(htmlfullfilename.c_str(), std::fstream::in); if (fin.good()) { found = true; @@ -292,11 +300,11 @@ std::string CyParser::cgi_file_parsing(CyhookHandler *hh, } chdir(cwd); if (!found) { - printf("[CyParser] Y-cgi:template %s not found in\n", - htmlfilename.c_str()); - for (unsigned int i = 0; i < HTML_DIR_COUNT; i++) { - printf("%s\n", HTML_DIRS[i].c_str()); - } + printf("[CyParser] Y-cgi:template %s not found %s\n", htmlfilename.c_str(), isHosted ? "" : "in"); + if (!isHosted) + for (unsigned int i = 0; i < HTML_DIR_COUNT; i++) { + printf("%s\n", HTML_DIRS[i].c_str()); + } } return yresult; } From ca9bf5068b92fb98de0af855969ce65e4895e079 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Thu, 27 Jun 2013 13:19:20 +0400 Subject: [PATCH 36/63] Revert "gui/scan_setup.cpp: disable intro items in select satellite -" seems to be fixed. This reverts commit b35324f201c293c7204d88cfac564b4049ef21dc. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/5c60ba98e60a977a3f3452723a0160c7b754ad50 Author: [CST] Focus Date: 2013-06-27 (Thu, 27 Jun 2013) ------------------ This commit was generated by Migit --- src/gui/scan_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/scan_setup.cpp b/src/gui/scan_setup.cpp index ae99800ed..6fbd35a3f 100644 --- a/src/gui/scan_setup.cpp +++ b/src/gui/scan_setup.cpp @@ -768,7 +768,7 @@ int CScanSetup::showFrontendSetup(int number) setupMenu->addItem(dorder); CMenuWidget * satToSelect = new CMenuWidget(LOCALE_SATSETUP_SELECT_SAT, NEUTRINO_ICON_SETTINGS, width); - //satToSelect->addIntroItems(); + satToSelect->addIntroItems(); satellite_map_t & satmap = fe->getSatellites(); for (sat_iterator_t sit = satmap.begin(); sit != satmap.end(); ++sit) From 0a5f0d0f27783bbb1af48b91313206d381b7357c Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Thu, 27 Jun 2013 13:20:56 +0400 Subject: [PATCH 37/63] neutrino.cpp: fix analog_mode1 on apollo Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/06a3533d68dd5c3524e2b4b624a5a6113af501b7 Author: [CST] Focus Date: 2013-06-27 (Thu, 27 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/neutrino.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neutrino.cpp b/src/neutrino.cpp index e27e7ed93..d2355a0b6 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -310,7 +310,7 @@ int CNeutrinoApp::loadSetup(const char * fname) // video g_settings.video_Mode = configfile.getInt32("video_Mode", VIDEO_STD_1080I50); // VIDEO_STD_720P50 #ifdef ANALOG_MODE - g_settings.analog_mode1 = configfile.getInt32("analog_mode1", (int)ANALOG_MODE(SCART,SD,RGB)); // default RGB + g_settings.analog_mode1 = configfile.getInt32("analog_mode1", (int)ANALOG_MODE(BOTH,SD,RGB)); // default RGB g_settings.analog_mode2 = configfile.getInt32("analog_mode2", (int)ANALOG_MODE(CINCH,SD,YPRPB)); // default YPBPR #else g_settings.analog_mode1 = configfile.getInt32("analog_mode1", (int)ANALOG_SD_RGB_SCART); // default RGB From 2d85a76be7055d86f66b885abe76c0673d7c549e Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Thu, 27 Jun 2013 13:25:01 +0400 Subject: [PATCH 38/63] gui/videosettings.cpp: do not set g_settings.analog_mode2 on apollo Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/9f63e80629ab642cc46d07c8bde500824bf4431d Author: [CST] Focus Date: 2013-06-27 (Thu, 27 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/videosettings.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/videosettings.cpp b/src/gui/videosettings.cpp index 27f46688f..b1927c04a 100644 --- a/src/gui/videosettings.cpp +++ b/src/gui/videosettings.cpp @@ -336,13 +336,16 @@ void CVideoSettings::setVideoSettings() videoDecoder->SetVideoMode((analog_mode_t) g_settings.analog_mode1); videoDecoder->SetVideoMode((analog_mode_t) g_settings.analog_mode2); #endif +#ifdef BOXMODEL_APOLLO + changeNotify(LOCALE_VIDEOMENU_ANALOG_MODE, NULL); +#else if (system_rev == 0x06) { changeNotify(LOCALE_VIDEOMENU_ANALOG_MODE, NULL); } else { changeNotify(LOCALE_VIDEOMENU_SCART, NULL); changeNotify(LOCALE_VIDEOMENU_CINCH, NULL); } - +#endif //setupVideoSystem(false/*don't ask*/);// focus: CVideoSettings constructor do this already ? #if 0 From 7d3e739beffc5743261954a64b5ffac64268823f Mon Sep 17 00:00:00 2001 From: vanhofen Date: Thu, 27 Jun 2013 14:03:34 +0200 Subject: [PATCH 39/63] pluginlist: using CComponentsHeader to paint header * fix scrollbar painting Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/b1f2f4dc98d99e5034cc1a66827ffebe503c90b5 Author: vanhofen Date: 2013-06-27 (Thu, 27 Jun 2013) Origin message was: ------------------ - pluginlist: using CComponentsHeader to paint header * fix scrollbar painting ------------------ This commit was generated by Migit --- src/gui/pluginlist.cpp | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/gui/pluginlist.cpp b/src/gui/pluginlist.cpp index dfa8f6bd6..c74ab285e 100644 --- a/src/gui/pluginlist.cpp +++ b/src/gui/pluginlist.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -301,23 +302,18 @@ void CPluginList::paintItem(int pos) void CPluginList::paintHead() { - if(listmaxshow > pluginlist.size()+1) - frameBuffer->paintBoxRel(x,y, width,theight, COL_MENUHEAD_PLUS_0, RADIUS_LARGE, CORNER_TOP); - else - frameBuffer->paintBoxRel(x,y, width+15,theight, COL_MENUHEAD_PLUS_0, RADIUS_LARGE, CORNER_TOP); + int h_width = width; + if (listmaxshow < pluginlist.size()) + h_width += 15; - if(pluginlisttype == CPlugins::P_TYPE_GAME) - { - frameBuffer->paintIcon(NEUTRINO_ICON_GAMES,x+8,y+5); - g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->RenderString(x+38,y+theight+1, width, g_Locale->getText(name), COL_MENUHEAD, 0, true); // UTF-8 - } else if (pluginlisttype == CPlugins::P_TYPE_SCRIPT) - { - frameBuffer->paintIcon(NEUTRINO_ICON_SHELL,x+8,y+5); - g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->RenderString(x+38,y+theight+1, width, g_Locale->getText(name), COL_MENUHEAD, 0, true); // UTF-8 - } else - { - g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->RenderString(x+8,y+theight+1, width, g_Locale->getText(name), COL_MENUHEAD, 0, true); // UTF-8 - } + CComponentsHeader header(x, y, h_width, theight, name, NULL /* no header icon */); + + if (pluginlisttype == CPlugins::P_TYPE_GAME) + header.setIcon(NEUTRINO_ICON_GAMES); + else if (pluginlisttype == CPlugins::P_TYPE_SCRIPT) + header.setIcon(NEUTRINO_ICON_SHELL); + + header.paint(CC_SAVE_SCREEN_NO); } void CPluginList::paint() @@ -338,7 +334,7 @@ void CPluginList::paint() void CPluginList::paintItems() { - if(listmaxshow <= pluginlist.size()+1) + if(listmaxshow < pluginlist.size()) { // Scrollbar int nrOfPages = ((pluginlist.size()-1) / listmaxshow)+1; From bbebbb9ac3cb16bde90a7d1ddd92e88d32238c82 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 28 Jun 2013 00:52:59 +0200 Subject: [PATCH 40/63] yweb: rework classifying slidertable in channellist for a smoother view Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/63173fd5e28a066d716a157382f5a8ac2d48297e Author: vanhofen Date: 2013-06-28 (Fri, 28 Jun 2013) Origin message was: ------------------ - yweb: rework classifying slidertable in channellist for a smoother view ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- .../tuxboxapi/coolstream/neutrinoyparser.cpp | 37 ++++++++++++------- src/nhttpd/web/Y_Main.css | 11 ++++-- src/nhttpd/web/Y_Version.txt | 4 +- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp b/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp index 9ea0ebaaf..a3489f34a 100644 --- a/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp +++ b/src/nhttpd/tuxboxapi/coolstream/neutrinoyparser.cpp @@ -345,7 +345,7 @@ std::string CNeutrinoYParser::func_get_bouquets_with_epg(CyhookHandler *hh, std: int i = 1; char classname; t_channel_id current_channel = CZapit::getInstance()->GetCurrentChannelID(); - int prozent; + int prozent = 100; CSectionsdClient::responseGetCurrentNextInfoChannelID currentNextInfo; std::string timestr; bool have_logos = false; @@ -373,20 +373,31 @@ std::string CNeutrinoYParser::func_get_bouquets_with_epg(CyhookHandler *hh, std: /* timer slider */ if(event && event->duration > 0) + { prozent = 100 * (time(NULL) - event->startTime) / event->duration; + yresult += string_printf("\n" + , classname + , (prozent / 10) * 3 + , (10 - (prozent / 10))*3 + ); + } else - prozent = 100; - yresult += string_printf("
\n" + "\t" + "" + "" + "" + "" + "
\n
\n" - , classname - , (prozent / 10) * 3 - , (10 - (prozent / 10))*3 - ); + { + yresult += string_printf("
\n" - "\t" - "" - "" - "" - "" - "
\n
\n" + , classname + ); + } /* channel name and buttons */ yresult += string_printf("
\n" + "\t" + "" + "" + "" + "
\n
\n%s Date: Thu, 27 Jun 2013 17:58:49 +0400 Subject: [PATCH 41/63] src/gui/scan_setup.cpp: prevent crash in wizard - channel list not created yet Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/584405883da47f7a46f2c85f6e7c7cb977ebdc65 Author: [CST] Focus Date: 2013-06-27 (Thu, 27 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/scan_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/scan_setup.cpp b/src/gui/scan_setup.cpp index 6fbd35a3f..2180b252b 100644 --- a/src/gui/scan_setup.cpp +++ b/src/gui/scan_setup.cpp @@ -660,7 +660,7 @@ int CScanSetup::showScanMenuFrontendSetup() fe_restart = false; CFEManager::getInstance()->linkFrontends(true); t_channel_id live_channel_id = CZapit::getInstance()->GetCurrentChannelID(); - if (live_channel_id) + if (live_channel_id && CNeutrinoApp::getInstance()->channelList) CNeutrinoApp::getInstance()->channelList->zapTo_ChannelID(live_channel_id, true); } return res; From dcea029cd012527a7d9a520c3f8cfda649f81ba1 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Fri, 28 Jun 2013 15:53:12 +0400 Subject: [PATCH 42/63] start wizard: add easy mode as requested by customers, which only ask for gui language and show fast scan (sat) and/or simple cable scan menu Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/d5e57f8877aa9adb12ace81c8ffc2447e3043fc2 Author: [CST] Focus Date: 2013-06-28 (Fri, 28 Jun 2013) ------------------ This commit was generated by Migit --- data/locale/english.locale | 5 +++ src/gui/osdlang_setup.h | 2 +- src/gui/scan_setup.cpp | 13 +++++-- src/gui/scan_setup.h | 8 ++--- src/gui/start_wizard.cpp | 74 ++++++++++++++++++++++++++++---------- src/system/locals.h | 5 +++ src/system/locals_intern.h | 5 +++ 7 files changed, 85 insertions(+), 27 deletions(-) diff --git a/data/locale/english.locale b/data/locale/english.locale index 73b50b659..a56761b7c 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1935,6 +1935,11 @@ videomenu.videoformat_43 4:3 videomenu.videomode Digital video mode wizard.initial_settings Initial settings found wizard.install_settings Do you want to install channels for Astra 19.2°E? +wizard.setup First installation +wizard.setup_advanced Advanced +wizard.setup_easy Easy +wizard.setup_type Installation type +wizard.setup_type_hint Easy to setup for CanalDigitaal/TéléSAT/TV Vlaanderen providers or simple cable scan wizard.welcome_head Welcome to the Setup Wizard wizard.welcome_text Next steps will guide you through initial installation of the device.\nImportant: Your CST set-top box can be conveniently controlled\nwith the web interface for timer management or live TV on the Web browser.\nDo not make it accessible to untrusted networks!\nDo you want to continue? word.from from diff --git a/src/gui/osdlang_setup.h b/src/gui/osdlang_setup.h index 5add67954..1e181b46b 100644 --- a/src/gui/osdlang_setup.h +++ b/src/gui/osdlang_setup.h @@ -56,7 +56,6 @@ class COsdLangSetup : public CMenuTarget, CChangeObserver bool is_wizard; int showLocalSetup(); - void showLanguageSetup(CMenuWidget *osdl_setup); void showPrefMenu(CMenuWidget *prefMenu, CLangSelectNotifier *langNotifier); CMenuOptionStringChooser* getTzItems(); @@ -74,6 +73,7 @@ class COsdLangSetup : public CMenuTarget, CChangeObserver COsdLangSetup(bool wizard_mode = OSDLANG_SETUP_MODE_WIZARD_NO); ~COsdLangSetup(); int exec(CMenuTarget* parent, const std::string & actionKey); + void showLanguageSetup(CMenuWidget *osdl_setup); }; #endif diff --git a/src/gui/scan_setup.cpp b/src/gui/scan_setup.cpp index 2180b252b..462f33817 100644 --- a/src/gui/scan_setup.cpp +++ b/src/gui/scan_setup.cpp @@ -218,6 +218,9 @@ CScanSetup::CScanSetup(bool wizard_mode) lcnhd = NULL; linkfe = NULL; in_menu = false; + allow_start = true; + if (CFEManager::getInstance()->haveCable()) + nid = new CIntInput(LOCALE_SATSETUP_CABLE_NID, (int&) scansettings.cable_nid, 5, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); } CScanSetup* CScanSetup::getInstance() @@ -302,6 +305,8 @@ int CScanSetup::exec(CMenuTarget* parent, const std::string &actionKey) } CScanTs scanTs(FE_QAM); scanTs.exec(NULL, "manual"); + if (is_wizard) + return menu_return::RETURN_EXIT_ALL; return res; } std::string scants_key[] = {"all", "manual", "test", "fast", "auto"/*doesn't exists in CScanTs!*/}; @@ -320,6 +325,8 @@ int CScanSetup::exec(CMenuTarget* parent, const std::string &actionKey) //...then start scan CScanTs scanTs(delsys); scanTs.exec(NULL, scants_key[i]); + if (is_wizard && as == "fast") + return menu_return::RETURN_EXIT_ALL; return res; } } @@ -452,7 +459,7 @@ int CScanSetup::showScanMenu() settings->addItem(fautoScanAll); #ifdef ENABLE_FASTSCAN //fast scan - CMenuWidget * fastScanMenu = new CMenuWidget(LOCALE_SATSETUP_FASTSCAN_HEAD, NEUTRINO_ICON_SETTINGS, MN_WIDGET_ID_SCAN_FAST_SCAN); + CMenuWidget * fastScanMenu = new CMenuWidget(LOCALE_SATSETUP_FASTSCAN_HEAD, NEUTRINO_ICON_SETTINGS, w, MN_WIDGET_ID_SCAN_FAST_SCAN); addScanMenuFastScan(fastScanMenu); mf = new CMenuDForwarder(LOCALE_SATSETUP_FASTSCAN_HEAD, true, NULL, fastScanMenu, "", CRCInput::convertDigitToKey(shortcut++)); mf->setHint("", LOCALE_MENU_HINT_SCAN_FAST); @@ -474,7 +481,7 @@ int CScanSetup::showScanMenu() nc->setHint("", LOCALE_MENU_HINT_SCAN_FETIMEOUT); settings->addItem(nc); } - nid = new CIntInput(LOCALE_SATSETUP_CABLE_NID, (int&) scansettings.cable_nid, 5, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); + //nid = new CIntInput(LOCALE_SATSETUP_CABLE_NID, (int&) scansettings.cable_nid, 5, NONEXISTANT_LOCALE, NONEXISTANT_LOCALE); //auto scan char autoscan[64]; @@ -559,7 +566,7 @@ int CScanSetup::showScanMenu() //delete satSelect; delete satOnOff; delete settings; - delete nid; + //delete nid; return res; } diff --git a/src/gui/scan_setup.h b/src/gui/scan_setup.h index 3b5515834..42dd6d5af 100644 --- a/src/gui/scan_setup.h +++ b/src/gui/scan_setup.h @@ -111,11 +111,7 @@ class CScanSetup : public CMenuTarget, public CChangeObserver void addScanMenuTempSat(CMenuWidget *temp_sat, sat_config_t &satconfig); void addScanMenuManualScan(CMenuWidget *manual_Scan); void addScanMenuAutoScanAll(CMenuWidget *auto_ScanAll); -#ifdef ENABLE_FASTSCAN - void addScanMenuFastScan(CMenuWidget *fast_ScanMenu); -#endif void addScanMenuAutoScan(CMenuWidget *auto_Scan); - void addScanMenuCable(CMenuWidget *menu); int addScanOptionsItems(CMenuWidget *options_menu, const int &shortcut = 1); int addListFlagsItems(CMenuWidget *listflags_menu, const int &shortcut = 1, bool manual = false); @@ -140,6 +136,10 @@ class CScanSetup : public CMenuTarget, public CChangeObserver int exec(CMenuTarget* parent, const std::string & actionKey = ""); bool changeNotify(const neutrino_locale_t OptionName, void * /*data*/); +#ifdef ENABLE_FASTSCAN + void addScanMenuFastScan(CMenuWidget *fast_ScanMenu); +#endif + void addScanMenuCable(CMenuWidget *menu); }; class CTPSelectHandler : public CMenuTarget //CScanSetup diff --git a/src/gui/start_wizard.cpp b/src/gui/start_wizard.cpp index f0191dd56..b0a8de716 100644 --- a/src/gui/start_wizard.cpp +++ b/src/gui/start_wizard.cpp @@ -54,19 +54,23 @@ #include extern cVideo * videoDecoder; +extern Zapit_config zapitCfg; using namespace std; - CStartUpWizard::CStartUpWizard() { - } CStartUpWizard::~CStartUpWizard() { - } +const CMenuOptionChooser::keyval WIZARD_SETUP_TYPE[] = +{ + { 0, LOCALE_WIZARD_SETUP_EASY }, + { 1, LOCALE_WIZARD_SETUP_ADVANCED }, +}; + int CStartUpWizard::exec(CMenuTarget* parent, const string & /*actionKey*/) { int res = menu_return::RETURN_REPAINT; @@ -74,26 +78,43 @@ int CStartUpWizard::exec(CMenuTarget* parent, const string & /*actionKey*/) if (parent) parent->hide(); - + COsdLangSetup languageSettings(COsdLangSetup::OSDLANG_SETUP_MODE_WIZARD); - + +#if 0 languageSettings.exec(NULL, ""); +#endif + //language setup + CMenuWidget osdl_setup(LOCALE_LANGUAGESETUP_OSD, NEUTRINO_ICON_LANGUAGE, 45, MN_WIDGET_ID_LANGUAGESETUP_LOCALE); + osdl_setup.setWizardMode(true); + languageSettings.showLanguageSetup(&osdl_setup); + osdl_setup.exec(NULL, ""); - if(ShowMsgUTF (LOCALE_WIZARD_WELCOME_HEAD, g_Locale->getText(LOCALE_WIZARD_WELCOME_TEXT), CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbrCancel) == CMessageBox::mbrYes) + if(ShowMsgUTF (LOCALE_WIZARD_WELCOME_HEAD, g_Locale->getText(LOCALE_WIZARD_WELCOME_TEXT), CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbrCancel) == CMessageBox::mbrYes) { + int advanced = 1; +#ifdef ENABLE_FASTSCAN + advanced = 0; + CMenuWidget wtype(LOCALE_WIZARD_SETUP); + wtype.setWizardMode(true); + wtype.addIntroItems(); + CMenuOptionChooser * mc = new CMenuOptionChooser(LOCALE_WIZARD_SETUP_TYPE, &advanced, WIZARD_SETUP_TYPE, 2, true, NULL); + mc->setHint("", LOCALE_WIZARD_SETUP_TYPE_HINT); + wtype.addItem(mc); + wtype.exec(NULL, ""); +#endif //open video settings in wizardmode - g_videoSettings->setWizardMode(CVideoSettings::V_SETUP_MODE_WIZARD); - - COsdSetup osdSettings(COsdSetup::OSD_SETUP_MODE_WIZARD); - - res = g_videoSettings->exec(NULL, ""); - g_videoSettings->setWizardMode(CVideoSettings::V_SETUP_MODE_WIZARD_NO); - - if(res != menu_return::RETURN_EXIT_ALL) + if(advanced && res != menu_return::RETURN_EXIT_ALL) { + g_videoSettings->setWizardMode(CVideoSettings::V_SETUP_MODE_WIZARD); + res = g_videoSettings->exec(NULL, ""); + g_videoSettings->setWizardMode(CVideoSettings::V_SETUP_MODE_WIZARD_NO); + } + if(advanced && res != menu_return::RETURN_EXIT_ALL) { + COsdSetup osdSettings(COsdSetup::OSD_SETUP_MODE_WIZARD); res = osdSettings.exec(NULL, ""); } - if(res != menu_return::RETURN_EXIT_ALL) + if(advanced && res != menu_return::RETURN_EXIT_ALL) { CNetworkSetup::getInstance()->setWizardMode(CNetworkSetup::N_SETUP_MODE_WIZARD); res = CNetworkSetup::getInstance()->exec(NULL, ""); @@ -113,19 +134,34 @@ int CStartUpWizard::exec(CMenuTarget* parent, const string & /*actionKey*/) CZapit::getInstance()->PrepareChannels(); } } - if(res != menu_return::RETURN_EXIT_ALL) + if(res != menu_return::RETURN_EXIT_ALL) { CScanSetup::getInstance()->setWizardMode(CScanSetup::SCAN_SETUP_MODE_WIZARD); - res = CScanSetup::getInstance()->exec(NULL, ""); + if (advanced) { + res = CScanSetup::getInstance()->exec(NULL, ""); + } else { + CZapit::getInstance()->GetConfig(zapitCfg); + if (CFEManager::getInstance()->haveSat()) { + CMenuWidget fastScanMenu(LOCALE_SATSETUP_FASTSCAN_HEAD, NEUTRINO_ICON_SETTINGS, 45, MN_WIDGET_ID_SCAN_FAST_SCAN); + fastScanMenu.setWizardMode(true); + CScanSetup::getInstance()->addScanMenuFastScan(&fastScanMenu); + res = fastScanMenu.exec(NULL, ""); + } + if (CFEManager::getInstance()->haveCable()) { + CMenuWidget cableScan(LOCALE_SATSETUP_CABLE, NEUTRINO_ICON_SETTINGS, 45, MN_WIDGET_ID_SCAN_CABLE_SCAN); + cableScan.setWizardMode(true); + CScanSetup::getInstance()->addScanMenuCable(&cableScan); + res = cableScan.exec(NULL, ""); + } + } CScanSetup::getInstance()->setWizardMode(CScanSetup::SCAN_SETUP_MODE_WIZARD_NO); } } - + killBackgroundLogo(); return res; } - inline void CStartUpWizard::showBackgroundLogo() { videoDecoder->ShowPicture(DATADIR "/neutrino/icons/start.jpg"); diff --git a/src/system/locals.h b/src/system/locals.h index 82a303ff3..e2c795a09 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -1962,6 +1962,11 @@ typedef enum LOCALE_VIDEOMENU_VIDEOMODE, LOCALE_WIZARD_INITIAL_SETTINGS, LOCALE_WIZARD_INSTALL_SETTINGS, + LOCALE_WIZARD_SETUP, + LOCALE_WIZARD_SETUP_ADVANCED, + LOCALE_WIZARD_SETUP_EASY, + LOCALE_WIZARD_SETUP_TYPE, + LOCALE_WIZARD_SETUP_TYPE_HINT, LOCALE_WIZARD_WELCOME_HEAD, LOCALE_WIZARD_WELCOME_TEXT, LOCALE_WORD_FROM, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 66616dfe8..4fbfb8e5a 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -1962,6 +1962,11 @@ const char * locale_real_names[] = "videomenu.videomode", "wizard.initial_settings", "wizard.install_settings", + "wizard.setup", + "wizard.setup_advanced", + "wizard.setup_easy", + "wizard.setup_type", + "wizard.setup_type_hint", "wizard.welcome_head", "wizard.welcome_text", "word.from", From 406ff09af11e8d4cfe64685dce7c6b335c1e73cf Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Fri, 28 Jun 2013 16:12:33 +0400 Subject: [PATCH 43/63] add initial Astra 19e settings to install Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/33bc58915a540a3e746680a8f093bcbd1ce84c8c Author: [CST] Focus Date: 2013-06-28 (Fri, 28 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- configure.ac | 1 + data/Makefile.am | 2 +- data/initial/Makefile.am | 3 + data/initial/bouquets.xml | 1488 ++++++++++++++++++++++++++++++++++ data/initial/frontend.conf | 19 + data/initial/services.xml | 1572 ++++++++++++++++++++++++++++++++++++ data/initial/ubouquets.xml | 1358 +++++++++++++++++++++++++++++++ 7 files changed, 4442 insertions(+), 1 deletion(-) create mode 100644 data/initial/Makefile.am create mode 100644 data/initial/bouquets.xml create mode 100644 data/initial/frontend.conf create mode 100644 data/initial/services.xml create mode 100644 data/initial/ubouquets.xml diff --git a/configure.ac b/configure.ac index 0e9ff6bb6..1b443ce9f 100644 --- a/configure.ac +++ b/configure.ac @@ -204,6 +204,7 @@ data/Makefile data/fonts/Makefile data/icons/Makefile data/inetradio/Makefile +data/initial/Makefile data/iso-codes/Makefile data/lcd/Makefile data/lcd/icons/Makefile diff --git a/data/Makefile.am b/data/Makefile.am index 0bd5290e7..ffce4ceb4 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = fonts icons inetradio iso-codes license locale scripts themes neutrino-scripts +SUBDIRS = fonts icons inetradio initial iso-codes license locale scripts themes neutrino-scripts if BOXTYPE_TRIPLE SUBDIRS += lcd diff --git a/data/initial/Makefile.am b/data/initial/Makefile.am new file mode 100644 index 000000000..1099d2462 --- /dev/null +++ b/data/initial/Makefile.am @@ -0,0 +1,3 @@ +installdir = $(CONFIGDIR)/initial + +install_DATA = bouquets.xml services.xml ubouquets.xml frontend.conf diff --git a/data/initial/bouquets.xml b/data/initial/bouquets.xml new file mode 100644 index 000000000..16abf6a28 --- /dev/null +++ b/data/initial/bouquets.xml @@ -0,0 +1,1488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/initial/frontend.conf b/data/initial/frontend.conf new file mode 100644 index 000000000..1bfe6aaf5 --- /dev/null +++ b/data/initial/frontend.conf @@ -0,0 +1,19 @@ +fe0_diseqcRepeats=0 +fe0_diseqcType=0 +fe0_highVoltage=0 +fe0_lastSatellitePosition=360 +fe0_motorRotationSpeed=18 +fe0_position_192=192,-1,-1,-1,0,0,9750,10600,11700,0,0,1 +fe0_satellites=192 +fe0_uni_qrg=0 +fe0_uni_scr=-1 +fe1_diseqcRepeats=0 +fe1_diseqcType=0 +fe1_highVoltage=0 +fe1_lastSatellitePosition=360 +fe1_motorRotationSpeed=18 +fe1_position_192=192,-1,-1,-1,0,0,9750,10600,11700,0,0,1 +fe1_satellites=192 +fe1_uni_qrg=0 +fe1_uni_scr=-1 +mode=1 diff --git a/data/initial/services.xml b/data/initial/services.xml new file mode 100644 index 000000000..2352ecb41 --- /dev/null +++ b/data/initial/services.xml @@ -0,0 +1,1572 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/initial/ubouquets.xml b/data/initial/ubouquets.xml new file mode 100644 index 000000000..bef717e4e --- /dev/null +++ b/data/initial/ubouquets.xml @@ -0,0 +1,1358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 68ef5497b3f6c47162e1ff1bb40f6df189ee10ab Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 29 Jun 2013 01:26:14 +0200 Subject: [PATCH 44/63] yweb: fix 4bc1f03 (change eventhandler to new function) Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/f7ff06485ffe80c9d1fcf6bef90c6c4e705d77bc Author: vanhofen Date: 2013-06-29 (Sat, 29 Jun 2013) Origin message was: ------------------ - yweb: fix 4bc1f03 (change eventhandler to new function) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Tools_Screenshot.yhtm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nhttpd/web/Y_Tools_Screenshot.yhtm b/src/nhttpd/web/Y_Tools_Screenshot.yhtm index 2e25e5d3d..5051e5b27 100644 --- a/src/nhttpd/web/Y_Tools_Screenshot.yhtm +++ b/src/nhttpd/web/Y_Tools_Screenshot.yhtm @@ -116,7 +116,7 @@ function do_switchrc_txt(){ {=include-block:Y_Blocks.txt;remote=} - +
From 443ca28c499aa556730395c6fb6efc57a6b8dfd2 Mon Sep 17 00:00:00 2001 From: "[CST] Focus" Date: Sat, 29 Jun 2013 14:47:04 +0400 Subject: [PATCH 45/63] src/zapit/src/getservices.cpp: try to fix satellite services load in case service.xml and satellites.xml have different sat names Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/9827f0360110846ea48e2cba0b01fe24e35a8361 Author: [CST] Focus Date: 2013-06-29 (Sat, 29 Jun 2013) ------------------ This commit was generated by Migit --- src/zapit/src/getservices.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/zapit/src/getservices.cpp b/src/zapit/src/getservices.cpp index c1137fa68..30b087724 100644 --- a/src/zapit/src/getservices.cpp +++ b/src/zapit/src/getservices.cpp @@ -470,17 +470,21 @@ void CServiceManager::FindTransponder(xmlNodePtr search) while (search) { fe_type_t delsys = FE_QPSK; - if (!(strcmp(xmlGetName(search), "cable"))) + t_satellite_position satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10); + if (!(strcmp(xmlGetName(search), "cable"))) { delsys = FE_QAM; + char * name = xmlGetAttribute(search, "name"); + satellitePosition = GetSatellitePosition(name); + } else if ((strcmp(xmlGetName(search), "sat"))) { search = search->xmlNextNode; continue; } - +#if 0 //t_satellite_position satellitePosition = xmlGetSignedNumericAttribute(search, "position", 10); char * name = xmlGetAttribute(search, "name"); t_satellite_position satellitePosition = GetSatellitePosition(name); - +#endif DBG("going to parse dvb-%c provider %s\n", xmlGetName(search)[0], xmlGetAttribute(search, "name")); ParseTransponders(search->xmlChildrenNode, satellitePosition, delsys); newfound++; From 815dc461c3669e68e6ae5a0230c80c6e87124ae2 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Mon, 1 Jul 2013 12:40:53 +0200 Subject: [PATCH 46/63] CMenuWidget: fix simplified up/down code - supplement to 834266d04a6032fc52626ea1c40527fe13104454 Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/4003d5f4347969b6942a6b0103adb549ebe74371 Author: Michael Liebmann Date: 2013-07-01 (Mon, 01 Jul 2013) ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 7d9739984..63d7d987b 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -640,6 +640,7 @@ int CMenuWidget::exec(CMenuTarget* parent, const std::string &) if (fade && washidden) fader.StartFadeIn(); checkHints(); + pos = selected; paint(); break; } From 2a982cd646ca59167d7cc93bce37cd110e6cd99e Mon Sep 17 00:00:00 2001 From: vanhofen Date: Mon, 1 Jul 2013 15:19:58 +0200 Subject: [PATCH 47/63] yweb: new images for remotecontrols v3 (zee and neo2) and v4 (neo twin) special thanks to luuk@astrasat for support * add image for remotecontrol v4 (neo twin) * replace german images with plain images and localized tooltips. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/1b7c7fecf67eba7022cc8b93aea38962676afd53 Author: vanhofen Date: 2013-07-01 (Mon, 01 Jul 2013) Origin message was: ------------------ - yweb: new images for remotecontrols v3 (zee and neo2) and v4 (neo twin) special thanks to luuk@astrasat for support * add image for remotecontrol v4 (neo twin) * replace german images with plain images and localized tooltips. ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Blocks.txt | 142 +++++++++++++++++----------- src/nhttpd/web/Y_Main.css | 4 + src/nhttpd/web/images/Makefile.am | 1 + src/nhttpd/web/images/rc_cst_v3.jpg | Bin 97480 -> 78385 bytes src/nhttpd/web/images/rc_cst_v4.jpg | Bin 0 -> 78908 bytes src/nhttpd/web/languages/Deutsch | 51 ++++++++++ src/nhttpd/web/languages/English | 50 ++++++++++ 7 files changed, 195 insertions(+), 53 deletions(-) create mode 100644 src/nhttpd/web/images/rc_cst_v4.jpg diff --git a/src/nhttpd/web/Y_Blocks.txt b/src/nhttpd/web/Y_Blocks.txt index d17ad1693..18ad726df 100644 --- a/src/nhttpd/web/Y_Blocks.txt +++ b/src/nhttpd/web/Y_Blocks.txt @@ -506,8 +506,8 @@ start-block~remote {=if-equal:{=var-get:boxtype=}~CST Neo CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v2=}~ {=if-equal:{=var-get:boxtype=}~CST Zee SAT~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=if-equal:{=var-get:boxtype=}~CST Zee CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ - {=if-equal:{=var-get:boxtype=}~CST Neo Twin SAT~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} - {=if-equal:{=var-get:boxtype=}~CST Neo Twin CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} + {=if-equal:{=var-get:boxtype=}~CST Neo Twin SAT~ {=include-block:Y_Blocks.txt;rc_cst_v4=}~ + {=if-equal:{=var-get:boxtype=}~CST Neo Twin CABLE~ {=include-block:Y_Blocks.txt;rc_cst_v4=}~ {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_v1=} =}=}=}=}=}=} @@ -518,7 +518,7 @@ start-block~remote {=if-equal:{=var-get:yfbtype=}~1~ {=include-block:Y_Blocks.txt;rc_cst_v1=}~ {=if-equal:{=var-get:yfbtype=}~2~ {=include-block:Y_Blocks.txt;rc_cst_v2=}~ {=if-equal:{=var-get:yfbtype=}~3~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ - {=if-equal:{=var-get:yfbtype=}~4~ {=include-block:Y_Blocks.txt;rc_cst_v3=}~ {=comment:todo! rc version 4 ~=} + {=if-equal:{=var-get:yfbtype=}~4~ {=include-block:Y_Blocks.txt;rc_cst_v4=}~ {=comment:fallback~=} {=include-block:Y_Blocks.txt;rc_cst_v1=} =}=}=}=}=}=} @@ -634,59 +634,95 @@ end-block~rc_cst_v2 # ------ Remote CST V3 (ZEE, NEO2) start-block~rc_cst_v3 +{=var-set:rcu=rc_cst_v3=} remote - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{=include-block:Y_Blocks.txt;map_rc_cst_v3_v4=} end-block~rc_cst_v3 +# ------ Remote CST V4 (NEO TWIN) +start-block~rc_cst_v4 +{=var-set:rcu=rc_cst_v4=} +remote +{=include-block:Y_Blocks.txt;map_rc_cst_v3_v4=} +end-block~rc_cst_v4 + +# ------ Map for Remote CST V3 (ZEE, NEO2) and V4 (NEO TWIN) +start-block~map_rc_cst_v3_v4 + + standby + mute + + tv/radio + skip- + skip+ + + + + sleep + audio + help + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + + txt + fav + + epg + info + + up + down + left + right + ok + + menu + exit + + vol+ + vol- + page+ + page- + sat + + red + green + yellow + blue + + w + + + + + rew + play + ff + stop + + rec + pause + m/s + t/s + + picsize +{=if-equal:{=var-get:rcu=}~rc_cst_v3~ + picmode~ +{=if-equal:{=var-get:rcu=}~rc_cst_v4~ + picmode~ +=}=} + +end-block~map_rc_cst_v3_v4 + # ------- Remote d-Box Nokia old start-block~rc_dbox_nokia_old remote diff --git a/src/nhttpd/web/Y_Main.css b/src/nhttpd/web/Y_Main.css index 6a062e5e0..7f4f979a1 100644 --- a/src/nhttpd/web/Y_Main.css +++ b/src/nhttpd/web/Y_Main.css @@ -869,9 +869,13 @@ a.timer { #screenshot_header { height: 30px; } +td#remote, td.shot { vertical-align: top; } +td#remote img { + margin: 10px 10px 10px 0; +} img#shot { width: 100%; background-color: #ffffff; diff --git a/src/nhttpd/web/images/Makefile.am b/src/nhttpd/web/images/Makefile.am index c2cb4e513..99ad6eaab 100644 --- a/src/nhttpd/web/images/Makefile.am +++ b/src/nhttpd/web/images/Makefile.am @@ -67,6 +67,7 @@ install_DATA = accept.png \ rc_cst_v1.jpg \ rc_cst_v2.jpg \ rc_cst_v3.jpg \ + rc_cst_v4.jpg \ rc_dbox_nokia_old.jpg \ rc_dbox_philips.jpg \ record.gif \ diff --git a/src/nhttpd/web/images/rc_cst_v3.jpg b/src/nhttpd/web/images/rc_cst_v3.jpg index 7bbb8ae61a0ff77e4f51446019fefad406e144b5..33aba320edb1c48585798ec233530cb4bfb70929 100644 GIT binary patch literal 78385 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ïwlfC-qu;8&fQ5tO<_k4| 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 Jp#9K)|Jf?O$nyXI literal 97480 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

;dFmXN4dmp4#i>-(-|pwxBy@NOxi$0ntXYrex! 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 Date: Wed, 26 Jun 2013 23:14:30 +0200 Subject: [PATCH 48/63] CVolumeBar: add enums for volume bar pos Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/2a63a855847a836080566caa8d3acbc43d1174c6 Author: Michael Liebmann Date: 2013-06-26 (Wed, 26 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/osd_setup.cpp | 14 +++++++------- src/gui/volumebar.cpp | 14 +++++++------- src/gui/volumebar.h | 11 +++++++++++ src/neutrino.cpp | 2 +- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/gui/osd_setup.cpp b/src/gui/osd_setup.cpp index d85eaf9f0..3a07ef112 100644 --- a/src/gui/osd_setup.cpp +++ b/src/gui/osd_setup.cpp @@ -335,13 +335,13 @@ const CMenuOptionChooser::keyval INFOBAR_SUBCHAN_DISP_POS_OPTIONS[INFOBAR_SUBCH #define VOLUMEBAR_DISP_POS_OPTIONS_COUNT 7 const CMenuOptionChooser::keyval VOLUMEBAR_DISP_POS_OPTIONS[VOLUMEBAR_DISP_POS_OPTIONS_COUNT]= { - { 0 , LOCALE_SETTINGS_POS_TOP_RIGHT }, - { 1 , LOCALE_SETTINGS_POS_TOP_LEFT }, - { 2 , LOCALE_SETTINGS_POS_BOTTOM_LEFT }, - { 3 , LOCALE_SETTINGS_POS_BOTTOM_RIGHT }, - { 4 , LOCALE_SETTINGS_POS_TOP_CENTER }, - { 5 , LOCALE_SETTINGS_POS_BOTTOM_CENTER }, - { 6 , LOCALE_SETTINGS_POS_HIGHER_CENTER } + { CVolumeBar::VOLUMEBAR_POS_TOP_RIGHT , LOCALE_SETTINGS_POS_TOP_RIGHT }, + { CVolumeBar::VOLUMEBAR_POS_TOP_LEFT , LOCALE_SETTINGS_POS_TOP_LEFT }, + { CVolumeBar::VOLUMEBAR_POS_BOTTOM_LEFT , LOCALE_SETTINGS_POS_BOTTOM_LEFT }, + { CVolumeBar::VOLUMEBAR_POS_BOTTOM_RIGHT , LOCALE_SETTINGS_POS_BOTTOM_RIGHT }, + { CVolumeBar::VOLUMEBAR_POS_TOP_CENTER , LOCALE_SETTINGS_POS_TOP_CENTER }, + { CVolumeBar::VOLUMEBAR_POS_BOTTOM_CENTER, LOCALE_SETTINGS_POS_BOTTOM_CENTER }, + { CVolumeBar::VOLUMEBAR_POS_HIGHER_CENTER, LOCALE_SETTINGS_POS_HIGHER_CENTER } }; #define MENU_DISP_POS_OPTIONS_COUNT 5 diff --git a/src/gui/volumebar.cpp b/src/gui/volumebar.cpp index 446d7504b..6330ef150 100644 --- a/src/gui/volumebar.cpp +++ b/src/gui/volumebar.cpp @@ -121,7 +121,7 @@ void CVolumeBar::initVolumeBarPosition() switch (g_settings.volume_pos) { - case 0:{// upper right + case VOLUMEBAR_POS_TOP_RIGHT:{ int x_corr = 0; if (( neutrino->getMode() != CNeutrinoApp::mode_scart ) && ( neutrino->getMode() != CNeutrinoApp::mode_audio) && ( neutrino->getMode() != CNeutrinoApp::mode_pic)) { if ((neutrino->isMuted()) && (!g_settings.mode_clock)) @@ -132,23 +132,23 @@ void CVolumeBar::initVolumeBarPosition() x = sw - width - x_corr; break; } - case 1:// upper left + case VOLUMEBAR_POS_TOP_LEFT: break; - case 2:// bottom left + case VOLUMEBAR_POS_BOTTOM_LEFT: y = (sh + frameBuffer->getScreenY()) - height - v_spacer; break; - case 3:// bottom right + case VOLUMEBAR_POS_BOTTOM_RIGHT: x = sw - width; y = (sh + frameBuffer->getScreenY()) - height - v_spacer; break; - case 4:// upper center + case VOLUMEBAR_POS_TOP_CENTER: x = ((sw - width) / 2) + x - h_spacer/2; break; - case 5:// bottom center + case VOLUMEBAR_POS_BOTTOM_CENTER: x = ((sw - width) / 2) + x - h_spacer/2; y = (sh + frameBuffer->getScreenY()) - height - v_spacer; break; - case 6:// higher center + case VOLUMEBAR_POS_HIGHER_CENTER: x = ((sw - width) / 2) + x - h_spacer/2; y = (sh + frameBuffer->getScreenY()) - sh/10; break; diff --git a/src/gui/volumebar.h b/src/gui/volumebar.h index ce1903ae6..af44efef0 100644 --- a/src/gui/volumebar.h +++ b/src/gui/volumebar.h @@ -80,6 +80,17 @@ class CVolumeBar : public CComponentsForm public: + enum + { + VOLUMEBAR_POS_TOP_RIGHT = 0, + VOLUMEBAR_POS_TOP_LEFT = 1, + VOLUMEBAR_POS_BOTTOM_LEFT = 2, + VOLUMEBAR_POS_BOTTOM_RIGHT = 3, + VOLUMEBAR_POS_TOP_CENTER = 4, + VOLUMEBAR_POS_BOTTOM_CENTER = 5, + VOLUMEBAR_POS_HIGHER_CENTER = 6 + }; + CVolumeBar(/*int current_volume*/); // ~CVolumeBar(); inherited from CComponentsForm diff --git a/src/neutrino.cpp b/src/neutrino.cpp index d2355a0b6..86e8d6a76 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -398,7 +398,7 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.infobar_progressbar = configfile.getInt32("infobar_progressbar" , 1 ); // below channel name g_settings.casystem_display = configfile.getInt32("casystem_display", 1 );//discreet ca mode default g_settings.scrambled_message = configfile.getBool("scrambled_message", true ); - g_settings.volume_pos = configfile.getInt32("volume_pos", 0 ); + g_settings.volume_pos = configfile.getInt32("volume_pos", CVolumeBar::VOLUMEBAR_POS_TOP_RIGHT ); g_settings.volume_digits = configfile.getBool("volume_digits", true); g_settings.menu_pos = configfile.getInt32("menu_pos", CMenuWidget::MENU_POS_CENTER); g_settings.show_menu_hints = configfile.getBool("show_menu_hints", true); From 99e28fe73d9cbbc2de4104e1e6816bb7b422ba68 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 26 Jun 2013 22:36:08 +0200 Subject: [PATCH 49/63] Fix paint VolumeBar on InfoViewer Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/31e2dae62250343ab5969f72d9008ffabbf97779 Author: Michael Liebmann Date: 2013-06-26 (Wed, 26 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/driver/volume.cpp | 45 +++++++++++++++++++-------------------- src/driver/volume.h | 2 ++ src/gui/infoviewer.cpp | 25 +++++++++++++++++++++- src/gui/infoviewer.h | 1 + src/gui/infoviewer_bb.cpp | 11 ++++++++++ 5 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/driver/volume.cpp b/src/driver/volume.cpp index ae5b0abcf..73167b4b6 100644 --- a/src/driver/volume.cpp +++ b/src/driver/volume.cpp @@ -87,16 +87,8 @@ void CVolume::setVolume(const neutrino_msg_t key) } } - if (volscale){ - volscale->hide(); - delete volscale; - volscale = NULL; - } - - if (volscale == NULL){ - volscale = new CVolumeBar(); - volscale->paint(); - } + hideVolscale(); + showVolscale(); neutrino_msg_data_t data; uint64_t timeoutEnd; @@ -111,12 +103,7 @@ void CVolume::setVolume(const neutrino_msg_t key) (sub_chan_keybind && (msg == CRCInput::RC_right || msg == CRCInput::RC_left))) { int dir = (msg == CRCInput::RC_plus || msg == CRCInput::RC_right) ? 1 : -1; if (CNeutrinoApp::getInstance()->isMuted() && (dir > 0 || g_settings.current_volume > 0)) { - if (volscale){ - if (volscale->isPainted()) - volscale->hide(); - delete volscale; - volscale = NULL; - } + hideVolscale(); CAudioMute::getInstance()->AudioMute(false, true); if (mode == CNeutrinoApp::mode_audio) { CAudioPlayerGui *cap = CMediaPlayerMenu::getInstance()->getPlayerInstance(); @@ -137,12 +124,7 @@ void CVolume::setVolume(const neutrino_msg_t key) v = 0; g_settings.current_volume = 0; if (g_settings.show_mute_icon) { - if (volscale) { - if (volscale->isPainted()) - volscale->hide(); - delete volscale; - volscale = NULL; - } + hideVolscale(); CAudioMute::getInstance()->AudioMute(true, true); if (mode == CNeutrinoApp::mode_audio) { CAudioPlayerGui *cap = CMediaPlayerMenu::getInstance()->getPlayerInstance(); @@ -187,12 +169,29 @@ void CVolume::setVolume(const neutrino_msg_t key) } } while (msg != CRCInput::RC_timeout); + hideVolscale(); +} + +bool CVolume::hideVolscale() +{ + bool ret = false; if (volscale) { - if (volscale->isPainted()) + if (volscale->isPainted()) { volscale->hide(); + ret = true; + } delete volscale; volscale = NULL; } + return ret; +} + +void CVolume::showVolscale() +{ + if (volscale == NULL){ + volscale = new CVolumeBar(); + volscale->paint(); + } } bool CVolume::changeNotify(const neutrino_locale_t OptionName, void * data) diff --git a/src/driver/volume.h b/src/driver/volume.h index 4c901c779..ecf019734 100644 --- a/src/driver/volume.h +++ b/src/driver/volume.h @@ -51,6 +51,8 @@ class CVolume : public CChangeObserver void SetCurrentPid(int pid) { apid = pid; } void SetCurrentChannel(t_channel_id id) { channel_id = id; } + bool hideVolscale(); + void showVolscale(); bool changeNotify(const neutrino_locale_t OptionName, void *); }; diff --git a/src/gui/infoviewer.cpp b/src/gui/infoviewer.cpp index f3c27290e..f6aa75332 100644 --- a/src/gui/infoviewer.cpp +++ b/src/gui/infoviewer.cpp @@ -61,6 +61,7 @@ #include #include +#include #include #include @@ -115,6 +116,7 @@ CInfoViewer::CInfoViewer () infoViewerBB->Init(); oldinfo.current_uniqueKey = 0; oldinfo.next_uniqueKey = 0; + isVolscale = false; } CInfoViewer::~CInfoViewer() @@ -475,6 +477,14 @@ void CInfoViewer::showMovieTitle(const int playState, const std::string &Channel const std::string &g_file_epg, const std::string &g_file_epg1, const int duration, const int curr_pos) { + if (g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_LEFT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_RIGHT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_CENTER || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_HIGHER_CENTER) + isVolscale = CVolume::getInstance()->hideVolscale(); + else + isVolscale = false; + check_channellogo_ca_SettingsChange(); aspectRatio = 0; last_curr_id = last_next_id = 0; @@ -615,6 +625,14 @@ void CInfoViewer::showTitle(t_channel_id chid, const bool calledFromNumZap, int void CInfoViewer::showTitle (const int ChanNum, const std::string & Channel, const t_satellite_position satellitePosition, const t_channel_id new_channel_id, const bool calledFromNumZap, int epgpos, char *pname) { + if (g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_LEFT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_RIGHT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_CENTER || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_HIGHER_CENTER) + isVolscale = CVolume::getInstance()->hideVolscale(); + else + isVolscale = false; + check_channellogo_ca_SettingsChange(); aspectRatio = 0; last_curr_id = last_next_id = 0; @@ -822,6 +840,9 @@ void CInfoViewer::loop(bool show_dot) neutrino_msg_t msg; neutrino_msg_data_t data; + if (isVolscale) + CVolume::getInstance()->showVolscale(); + while (!(res & (messages_return::cancel_info | messages_return::cancel_all))) { g_RCInput->getMsgAbsoluteTimeout (&msg, &data, &timeoutEnd); @@ -933,8 +954,10 @@ void CInfoViewer::loop(bool show_dot) } } - if (hideIt) + if (hideIt) { + CVolume::getInstance()->hideVolscale(); killTitle (); + } g_RCInput->killTimer (sec_timer_id); fader.Stop(); diff --git a/src/gui/infoviewer.h b/src/gui/infoviewer.h index 2fe467131..d14bbc11c 100644 --- a/src/gui/infoviewer.h +++ b/src/gui/infoviewer.h @@ -151,6 +151,7 @@ class CInfoViewer int BoxEndY; int ChanInfoX; bool showButtonBar; + bool isVolscale; CInfoViewer(); ~CInfoViewer(); diff --git a/src/gui/infoviewer_bb.cpp b/src/gui/infoviewer_bb.cpp index 4d020dc42..3a1c0deaa 100644 --- a/src/gui/infoviewer_bb.cpp +++ b/src/gui/infoviewer_bb.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -351,6 +352,14 @@ void CInfoViewerBB::showBBButtons(const int modus) int i; bool paint = false; + if (g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_LEFT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_RIGHT || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_BOTTOM_CENTER || + g_settings.volume_pos == CVolumeBar::VOLUMEBAR_POS_HIGHER_CENTER) + g_InfoViewer->isVolscale = CVolume::getInstance()->hideVolscale(); + else + g_InfoViewer->isVolscale = false; + getBBButtonInfo(); for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) { if (tmp_bbButtonInfoText[i] != bbButtonInfo[i].text) { @@ -389,6 +398,8 @@ void CInfoViewerBB::showBBButtons(const int modus) tmp_bbButtonInfoText[i] = bbButtonInfo[i].text; } } + if (g_InfoViewer->isVolscale) + CVolume::getInstance()->showVolscale(); } void CInfoViewerBB::showBBIcons(const int modus, const std::string & icon) From 9e36a9e5291b13930b3bb03cca9a8816f6fcf155 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 3 Jul 2013 04:48:19 +0200 Subject: [PATCH 50/63] src/system/helpers.cpp: Add getBaseName() and getPathName() Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/767ff03d980cc764322434753341df0873a62438 Author: Michael Liebmann Date: 2013-07-03 (Wed, 03 Jul 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/system/helpers.cpp | 18 ++++++++++++++++++ src/system/helpers.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/src/system/helpers.cpp b/src/system/helpers.cpp index d1ea12352..f36bbbd5b 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -284,6 +284,24 @@ bool get_mem_usage(unsigned long &kbtotal, unsigned long &kbfree) return true; } +std::string getPathName(std::string &path) +{ + size_t pos = path.find_last_of("/"); + if (pos == std::string::npos) + return path; + return path.substr(0, pos); +} + +std::string getBaseName(std::string &path) +{ + size_t pos = path.find_last_of("/"); + if (pos == std::string::npos) + return path; + if (path.length() == pos +1) + return ""; + return path.substr(pos+1); +} + std::string trim(std::string &str, const std::string &trimChars /*= " \n\r\t"*/) { std::string result = str.erase(str.find_last_not_of(trimChars) + 1); diff --git a/src/system/helpers.h b/src/system/helpers.h index a811edab8..70db9525b 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -22,6 +22,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + int my_system(const char * cmd); int my_system(int argc, const char *arg, ...); /* argc is number of arguments including command */ @@ -34,6 +36,8 @@ int check_dir(const char * dir); bool get_fs_usage(const char * dir, long &total, long &used, long *bsize=NULL); bool get_mem_usage(unsigned long &total, unsigned long &free); +std::string getPathName(std::string &path); +std::string getBaseName(std::string &path); std::string trim(std::string &str, const std::string &trimChars = " \n\r\t"); class CFileHelpers From be561abd354f684233a4f482142b9b941b4b3252 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 3 Jul 2013 04:54:18 +0200 Subject: [PATCH 51/63] COsdSetup: Display file names in font setup menu Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/6d3a05fe0ad9a8fbb6237ba9583d7ec727e2d669 Author: Michael Liebmann Date: 2013-07-03 (Wed, 03 Jul 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/osd_setup.cpp | 26 ++++++++++++++++++-------- src/gui/osd_setup.h | 2 ++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/gui/osd_setup.cpp b/src/gui/osd_setup.cpp index 3a07ef112..d66e92d80 100644 --- a/src/gui/osd_setup.cpp +++ b/src/gui/osd_setup.cpp @@ -55,6 +55,7 @@ #include #include +#include extern CRemoteControl * g_RemoteControl; @@ -81,6 +82,8 @@ COsdSetup::~COsdSetup() { delete colorSetupNotifier; delete fontsizenotifier; + delete mfFontFile; + delete mfTtxFontFile; } //font settings @@ -195,6 +198,8 @@ int COsdSetup::exec(CMenuTarget* parent, const std::string &actionKey) strcpy(g_settings.font_file, fileBrowser.getSelectedFile()->Name.c_str()); printf("[neutrino] new font file %s\n", fileBrowser.getSelectedFile()->Name.c_str()); CNeutrinoApp::getInstance()->SetupFonts(); + osdFontFile = "(" + getBaseName(fileBrowser.getSelectedFile()->Name) + ")"; + mfFontFile->setOption(osdFontFile.c_str()); } return menu_return::RETURN_REPAINT; } @@ -210,6 +215,8 @@ int COsdSetup::exec(CMenuTarget* parent, const std::string &actionKey) ttx_font_file = fileBrowser.getSelectedFile()->Name; printf("[neutrino] ttx font file %s\n", fileBrowser.getSelectedFile()->Name.c_str()); CNeutrinoApp::getInstance()->SetupFonts(); + osdTtxFontFile = "(" + getBaseName(fileBrowser.getSelectedFile()->Name) + ")"; + mfTtxFontFile->setOption(osdTtxFontFile.c_str()); } return menu_return::RETURN_REPAINT; } @@ -416,7 +423,7 @@ int COsdSetup::showOsdSetup() osd_menu->addItem(mf); //fonts - CMenuWidget osd_menu_fonts(LOCALE_MAINMENU_SETTINGS, NEUTRINO_ICON_COLORS, width, MN_WIDGET_ID_OSDSETUP_FONT); + CMenuWidget osd_menu_fonts(LOCALE_MAINMENU_SETTINGS, NEUTRINO_ICON_COLORS, w_max(50, 10), MN_WIDGET_ID_OSDSETUP_FONT); showOsdFontSizeSetup(&osd_menu_fonts); mf = new CMenuForwarder(LOCALE_FONTMENU_HEAD, true, NULL, &osd_menu_fonts, NULL, CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); mf->setHint("", LOCALE_MENU_HINT_FONTS); @@ -653,7 +660,6 @@ void COsdSetup::AddFontSettingItem(CMenuWidget &font_Settings, const SNeutrinoSe font_Settings.addItem(new CMenuNumberInput(neutrino_font[number_of_fontsize_entry].name, neutrino_font[number_of_fontsize_entry].defaultsize, fontsizenotifier, CNeutrinoApp::getInstance()->getConfigFile())); } - //font settings menu void COsdSetup::showOsdFontSizeSetup(CMenuWidget *menu_fonts) { @@ -663,14 +669,18 @@ void COsdSetup::showOsdFontSizeSetup(CMenuWidget *menu_fonts) fontSettings->addIntroItems(LOCALE_FONTMENU_HEAD); // select gui font file - mf = new CMenuForwarder(LOCALE_COLORMENU_FONT, true, NULL, this, "select_font", CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED); - mf->setHint("", LOCALE_MENU_HINT_FONT_GUI); - fontSettings->addItem(mf); + osdFontFile = g_settings.font_file; + osdFontFile = "(" + getBaseName(osdFontFile) + ")"; + mfFontFile = new CMenuForwarder(LOCALE_COLORMENU_FONT, true, osdFontFile.c_str(), this, "select_font", CRCInput::RC_red, NEUTRINO_ICON_BUTTON_RED); + mfFontFile->setHint("", LOCALE_MENU_HINT_FONT_GUI); + fontSettings->addItem(mfFontFile); // select teletext font file - mf = new CMenuForwarder(LOCALE_COLORMENU_FONT_TTX, true, NULL, this, "ttx_font", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); - mf->setHint("", LOCALE_MENU_HINT_FONT_TTX); - fontSettings->addItem(mf); + osdTtxFontFile = g_settings.ttx_font_file; + osdTtxFontFile = "(" + getBaseName(osdTtxFontFile) + ")"; + mfTtxFontFile = new CMenuForwarder(LOCALE_COLORMENU_FONT_TTX, true, osdTtxFontFile.c_str(), this, "ttx_font", CRCInput::RC_green, NEUTRINO_ICON_BUTTON_GREEN); + mfTtxFontFile->setHint("", LOCALE_MENU_HINT_FONT_TTX); + fontSettings->addItem(mfTtxFontFile); // contrast fonts CMenuOptionChooser * mc = new CMenuOptionChooser(LOCALE_COLORMENU_CONTRAST_FONTS, &g_settings.contrast_fonts, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this, CRCInput::RC_yellow, NEUTRINO_ICON_BUTTON_YELLOW); diff --git a/src/gui/osd_setup.h b/src/gui/osd_setup.h index d8c866131..b1ebb733e 100644 --- a/src/gui/osd_setup.h +++ b/src/gui/osd_setup.h @@ -47,6 +47,8 @@ class COsdSetup : public CMenuTarget, public CChangeObserver CFontSizeNotifier *fontsizenotifier; CMenuWidget *osd_menu; CMenuWidget *submenu_menus; + CMenuForwarder *mfFontFile, *mfTtxFontFile; + std::string osdFontFile, osdTtxFontFile; int width; bool is_wizard; From c908cb4688eb60c065855fb84f9ea609f8680ad5 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 3 Jul 2013 07:19:51 +0200 Subject: [PATCH 52/63] info viewer: Fix corner radius Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/d313392144b7f45662d13091289335ab807d1cac Author: Michael Liebmann Date: 2013-07-03 (Wed, 03 Jul 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/infoviewer_bb.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/infoviewer_bb.cpp b/src/gui/infoviewer_bb.cpp index 3a1c0deaa..cfcb9404d 100644 --- a/src/gui/infoviewer_bb.cpp +++ b/src/gui/infoviewer_bb.cpp @@ -370,7 +370,7 @@ void CInfoViewerBB::showBBButtons(const int modus) if (paint) { int last_x = minX; - frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, minX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_SMALL, CORNER_BOTTOM); //round + frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, minX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_LARGE, CORNER_BOTTOM); //round for (i = BUTTON_MAX; i > 0;) { --i; if ((bbButtonInfo[i].x <= g_InfoViewer->ChanInfoX) || (bbButtonInfo[i].x >= g_InfoViewer->BoxEndX) || (!bbButtonInfo[i].paint)) @@ -425,7 +425,7 @@ void CInfoViewerBB::paintshowButtonBar() if (g_settings.casystem_display < 2) paintCA_bar(0,0); - frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_SMALL, CORNER_BOTTOM); //round + frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_LARGE, CORNER_BOTTOM); //round g_InfoViewer->showSNR(); From 1c1cec1ddeebc2b0553f5638ecc62190741842db Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Thu, 4 Jul 2013 01:08:21 +0200 Subject: [PATCH 53/63] CMenuForwarder: Use std::string (not pointer to std::string or char) for option Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/b5d13226177f6a4f8afca2254da4db7c08e9e467 Author: Michael Liebmann Date: 2013-07-04 (Thu, 04 Jul 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 27 +++++++++------------------ src/gui/widget/menue.h | 3 +-- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 63d7d987b..d6693742f 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -1598,8 +1598,7 @@ int CMenuOptionLanguageChooser::paint( bool selected ) //------------------------------------------------------------------------------------------------------------------------------- CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, const char * const Option, CMenuTarget* Target, const char * const ActionKey, neutrino_msg_t DirectKey, const char * const IconName, const char * const IconName_Info_right) { - option = Option; - option_string = NULL; + option = (Option != NULL) ? (std::string)Option : ""; text=Text; active = Active; jumpTarget = Target; @@ -1611,8 +1610,7 @@ CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, const std::string &Option, CMenuTarget* Target, const char * const ActionKey, neutrino_msg_t DirectKey, const char * const IconName, const char * const IconName_Info_right) { - option = NULL; - option_string = &Option; + option = Option; text=Text; active = Active; jumpTarget = Target; @@ -1652,10 +1650,8 @@ int CMenuForwarder::getWidth(void) int tw = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(text), true); const char * option_text = NULL; - if (option) - option_text = option; - else if (option_string) - option_text = option_string->c_str(); + if (!option.empty()) + option_text = option.c_str(); if (option_text != NULL) @@ -1678,13 +1674,10 @@ int CMenuForwarder::exec(CMenuTarget* parent) const char * CMenuForwarder::getOption(void) { - if (option) - return option; + if (!option.empty()) + return option.c_str(); else - if (option_string) - return option_string->c_str(); - else - return NULL; + return NULL; } const char * CMenuForwarder::getName(void) @@ -1756,10 +1749,8 @@ int CMenuForwarderNonLocalized::getWidth(void) { int tw = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(the_text, true); const char * option_text = NULL; - if (option) - option_text = option; - else if (option_string) - option_text = option_string->c_str(); + if (!option.empty()) + option_text = option.c_str(); if (option_text != NULL) tw += 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(option_text, true); diff --git a/src/gui/widget/menue.h b/src/gui/widget/menue.h index 9d9eb92a1..ac4c9584f 100644 --- a/src/gui/widget/menue.h +++ b/src/gui/widget/menue.h @@ -198,8 +198,7 @@ class CMenuForwarder : public CMenuItem std::string actionKey; protected: - const char * option; - const std::string * option_string; + std::string option; CMenuTarget * jumpTarget; neutrino_locale_t text; From c037349ef8cf2a5face175ff7c9a97e7e95d664b Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Wed, 3 Jul 2013 22:11:04 +0200 Subject: [PATCH 54/63] CRecordInstance::GetRecordString(): Fix calculation of duration - Use locales for time string - Show recording duration right aligned in stop menu Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/0ce25a86d5a971fc6f2676c10583c2827fecf986 Author: Michael Liebmann Date: 2013-07-03 (Wed, 03 Jul 2013) ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 3 +++ data/locale/english.locale | 3 +++ src/driver/record.cpp | 30 +++++++++++++++++------------- src/driver/record.h | 2 +- src/system/locals.h | 3 +++ src/system/locals_intern.h | 3 +++ 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index c1d8e446b..66280ee4d 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1578,6 +1578,9 @@ rclock.unlockmsg Fernbedienung reaktiviert... recording.is_running Folgende Aufnahme läuft bereits! Neue Aufnahme starten? recording.start Starte Aufnahme, bitte warten...! recording.stop Beende Aufnahme, bitte warten...! +recording.time_hour Stunde +recording.time_hours Stunden +recording.time_min Min recordingmenu.apids Tonspuren recordingmenu.apids_ac3 AC3 Tonspuren aufnehmen recordingmenu.apids_alt Alternative Tonspuren aufn. diff --git a/data/locale/english.locale b/data/locale/english.locale index a56761b7c..3ae35dc9a 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -1578,6 +1578,9 @@ rclock.unlockmsg Remote control reactivated. recording.is_running This channel already recording. Start new record? recording.start Start recording, please wait...! recording.stop Stop recording, please wait...! +recording.time_hour hour +recording.time_hours hours +recording.time_min min recordingmenu.apids Audio streams recordingmenu.apids_ac3 record AC3 streams recordingmenu.apids_alt record alternative streams diff --git a/src/driver/record.cpp b/src/driver/record.cpp index 6f86c9e7e..e2f5a5cbd 100644 --- a/src/driver/record.cpp +++ b/src/driver/record.cpp @@ -665,7 +665,7 @@ record_error_msg_t CRecordInstance::MakeFileName(CZapitChannel * channel) return RECORD_OK; } -void CRecordInstance::GetRecordString(std::string &str) +void CRecordInstance::GetRecordString(std::string &str, std::string &dur) { CZapitChannel * channel = CServiceManager::getInstance()->FindChannel(channel_id); if(channel == NULL) { @@ -676,12 +676,14 @@ void CRecordInstance::GetRecordString(std::string &str) char stime[15]; int err = GetStatus(); strftime(stime, sizeof(stime), "%H:%M:%S ", localtime(&start_time)); - time_t duration = time(0) - start_time; + time_t duration = (time(0) - start_time) / 60; char dtime[20]; - int h = duration/3600; - int m = duration/60; - snprintf(dtime, sizeof(dtime), " (%02d %s %02d min)", h, h == 1 ? "hour" : "hours", m); - str = stime + channel->getName() + ": " + GetEpgTitle() + ((err & REC_STATUS_OVERFLOW) ? " [!]" : "") + dtime; + int h = duration / 60; + int m = duration - (h * 60); + snprintf(dtime, sizeof(dtime), "(%d %s %02d %s)", h, h == 1 ? g_Locale->getText(LOCALE_RECORDING_TIME_HOUR) : g_Locale->getText(LOCALE_RECORDING_TIME_HOURS), + m, g_Locale->getText(LOCALE_RECORDING_TIME_MIN)); + str = stime + channel->getName() + ": " + GetEpgTitle() + ((err & REC_STATUS_OVERFLOW) ? " [!] " : " "); + dur = dtime; } //------------------------------------------------------------------------- @@ -1372,8 +1374,9 @@ int CRecordManager::exec(CMenuTarget* parent, const std::string & actionKey ) bool tostart = true; CRecordInstance * inst = FindInstance(live_channel_id); if (inst) { - std::string title; - inst->GetRecordString(title); + std::string title, duration; + inst->GetRecordString(title, duration); + title += duration; tostart = (ShowMsgUTF(LOCALE_RECORDING_IS_RUNNING, title.c_str(), CMessageBox::mbrYes, CMessageBox::mbYes | CMessageBox::mbNo, NULL, 450, 30, false) == CMessageBox::mbrYes); } @@ -1449,8 +1452,8 @@ bool CRecordManager::ShowMenu(void) channel_ids[i] = inst->GetChannelId(); recording_ids[i] = inst->GetRecordingId(); - std::string title; - inst->GetRecordString(title); + std::string title, duration; + inst->GetRecordString(title, duration); const char* mode_icon = NULL; //if (inst->tshift_mode) @@ -1465,7 +1468,7 @@ bool CRecordManager::ShowMenu(void) rc_key = CRCInput::RC_stop; btn_icon = NEUTRINO_ICON_BUTTON_STOP; } - item = new CMenuForwarderNonLocalized(title.c_str(), true, NULL, selector, cnt, rc_key, NULL, mode_icon); + item = new CMenuForwarderNonLocalized(title.c_str(), true, duration, selector, cnt, rc_key, NULL, mode_icon); item->setItemButton(btn_icon, true); //if only one recording is running, set the focus to this menu item @@ -1508,7 +1511,7 @@ bool CRecordManager::ShowMenu(void) bool CRecordManager::AskToStop(const t_channel_id channel_id, const int recid) { //int recording_id = 0; - std::string title; + std::string title, duration; CRecordInstance * inst; mutex.lock(); @@ -1519,7 +1522,8 @@ bool CRecordManager::AskToStop(const t_channel_id channel_id, const int recid) if(inst) { //recording_id = inst->GetRecordingId(); - inst->GetRecordString(title); + inst->GetRecordString(title, duration); + title += duration; } mutex.unlock(); if(inst == NULL) diff --git a/src/driver/record.h b/src/driver/record.h index b854f8876..4d71cca0f 100644 --- a/src/driver/record.h +++ b/src/driver/record.h @@ -120,7 +120,7 @@ class CRecordInstance t_channel_id GetChannelId(void) { return channel_id; }; std::string GetEpgTitle(void) { return epgTitle; }; MI_MOVIE_INFO * GetMovieInfo(void) { return recMovieInfo; }; - void GetRecordString(std::string& str); + void GetRecordString(std::string& str, std::string &dur); const char * GetFileName() { return filename; }; bool Timeshift() { return autoshift; }; int tshift_mode; diff --git a/src/system/locals.h b/src/system/locals.h index e2c795a09..a9ae03de6 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -1605,6 +1605,9 @@ typedef enum LOCALE_RECORDING_IS_RUNNING, LOCALE_RECORDING_START, LOCALE_RECORDING_STOP, + LOCALE_RECORDING_TIME_HOUR, + LOCALE_RECORDING_TIME_HOURS, + LOCALE_RECORDING_TIME_MIN, LOCALE_RECORDINGMENU_APIDS, LOCALE_RECORDINGMENU_APIDS_AC3, LOCALE_RECORDINGMENU_APIDS_ALT, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 4fbfb8e5a..54cdb4686 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -1605,6 +1605,9 @@ const char * locale_real_names[] = "recording.is_running", "recording.start", "recording.stop", + "recording.time_hour", + "recording.time_hours", + "recording.time_min", "recordingmenu.apids", "recordingmenu.apids_ac3", "recordingmenu.apids_alt", From 2dae834a1111ff964138272a775554e5fa58cbc4 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Thu, 4 Jul 2013 03:27:38 +0200 Subject: [PATCH 55/63] Revert "CMenuForwarder: Use std::string (not pointer to std::string or char) for option" This reverts commit 1c1cec1ddeebc2b0553f5638ecc62190741842db. Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/5f4d598b1e97accb312e31f38fb8496bde6a05d6 Author: Michael Liebmann Date: 2013-07-04 (Thu, 04 Jul 2013) ------------------ This commit was generated by Migit --- src/gui/widget/menue.cpp | 27 ++++++++++++++++++--------- src/gui/widget/menue.h | 3 ++- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index d6693742f..63d7d987b 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -1598,7 +1598,8 @@ int CMenuOptionLanguageChooser::paint( bool selected ) //------------------------------------------------------------------------------------------------------------------------------- CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, const char * const Option, CMenuTarget* Target, const char * const ActionKey, neutrino_msg_t DirectKey, const char * const IconName, const char * const IconName_Info_right) { - option = (Option != NULL) ? (std::string)Option : ""; + option = Option; + option_string = NULL; text=Text; active = Active; jumpTarget = Target; @@ -1610,7 +1611,8 @@ CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, CMenuForwarder::CMenuForwarder(const neutrino_locale_t Text, const bool Active, const std::string &Option, CMenuTarget* Target, const char * const ActionKey, neutrino_msg_t DirectKey, const char * const IconName, const char * const IconName_Info_right) { - option = Option; + option = NULL; + option_string = &Option; text=Text; active = Active; jumpTarget = Target; @@ -1650,8 +1652,10 @@ int CMenuForwarder::getWidth(void) int tw = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(g_Locale->getText(text), true); const char * option_text = NULL; - if (!option.empty()) - option_text = option.c_str(); + if (option) + option_text = option; + else if (option_string) + option_text = option_string->c_str(); if (option_text != NULL) @@ -1674,10 +1678,13 @@ int CMenuForwarder::exec(CMenuTarget* parent) const char * CMenuForwarder::getOption(void) { - if (!option.empty()) - return option.c_str(); + if (option) + return option; else - return NULL; + if (option_string) + return option_string->c_str(); + else + return NULL; } const char * CMenuForwarder::getName(void) @@ -1749,8 +1756,10 @@ int CMenuForwarderNonLocalized::getWidth(void) { int tw = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(the_text, true); const char * option_text = NULL; - if (!option.empty()) - option_text = option.c_str(); + if (option) + option_text = option; + else if (option_string) + option_text = option_string->c_str(); if (option_text != NULL) tw += 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(option_text, true); diff --git a/src/gui/widget/menue.h b/src/gui/widget/menue.h index ac4c9584f..9d9eb92a1 100644 --- a/src/gui/widget/menue.h +++ b/src/gui/widget/menue.h @@ -198,7 +198,8 @@ class CMenuForwarder : public CMenuItem std::string actionKey; protected: - std::string option; + const char * option; + const std::string * option_string; CMenuTarget * jumpTarget; neutrino_locale_t text; From 8c24f815a63d1567193bf4ec4555d904f0ef23dd Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Thu, 4 Jul 2013 07:38:32 +0200 Subject: [PATCH 56/63] CRecordManager::ShowMenu: Fix display durations - Save Option for CMenuForwarderNonLocalized in vector Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/84ab2cb555e4d63484c9ee1e7961509aaa32f961 Author: Michael Liebmann Date: 2013-07-04 (Thu, 04 Jul 2013) ------------------ This commit was generated by Migit --- src/driver/record.cpp | 6 +++++- src/driver/record.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/driver/record.cpp b/src/driver/record.cpp index e2f5a5cbd..ed3b6a5ed 100644 --- a/src/driver/record.cpp +++ b/src/driver/record.cpp @@ -699,6 +699,7 @@ CRecordManager::CRecordManager() //recordingstatus = 0; recmap.clear(); nextmap.clear(); + durations.clear(); autoshift = false; shift_timer = 0; check_timer = 0; @@ -719,6 +720,7 @@ CRecordManager::~CRecordManager() delete[] (unsigned char *) (*it); } nextmap.clear(); + durations.clear(); } CRecordManager * CRecordManager::getInstance() @@ -1416,6 +1418,7 @@ bool CRecordManager::ShowMenu(void) CMenuForwarder * iteml; t_channel_id channel_ids[RECORD_MAX_COUNT] = { 0 }; /* initialization avoids false "might */ int recording_ids[RECORD_MAX_COUNT] = { 0 }; /* be used uninitialized" warning */ + durations.clear(); CMenuSelectorTarget * selector = new CMenuSelectorTarget(&select); @@ -1454,6 +1457,7 @@ bool CRecordManager::ShowMenu(void) std::string title, duration; inst->GetRecordString(title, duration); + durations.push_back(duration); const char* mode_icon = NULL; //if (inst->tshift_mode) @@ -1468,7 +1472,7 @@ bool CRecordManager::ShowMenu(void) rc_key = CRCInput::RC_stop; btn_icon = NEUTRINO_ICON_BUTTON_STOP; } - item = new CMenuForwarderNonLocalized(title.c_str(), true, duration, selector, cnt, rc_key, NULL, mode_icon); + item = new CMenuForwarderNonLocalized(title.c_str(), true, durations[i].c_str(), selector, cnt, rc_key, NULL, mode_icon); item->setItemButton(btn_icon, true); //if only one recording is running, set the focus to this menu item diff --git a/src/driver/record.h b/src/driver/record.h index 4d71cca0f..d427ccc0c 100644 --- a/src/driver/record.h +++ b/src/driver/record.h @@ -146,6 +146,7 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/ nextmap_t nextmap; std::string Directory; std::string TimeshiftDirectory; + std::vector durations; bool StreamVTxtPid; bool StreamSubtitlePids; bool StreamPmtPid; From eadb8475b1786fd37d76277fd22abfd8ec530f2f Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Fri, 28 Jun 2013 14:50:53 +0200 Subject: [PATCH 57/63] start wizard: add german locale Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/082b301d64c24c7a8de36ea3fbf762d7caf71b24 Author: Michael Liebmann Date: 2013-06-28 (Fri, 28 Jun 2013) ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- data/locale/deutsch.locale | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 66280ee4d..156bc8bea 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -1938,6 +1938,11 @@ videomenu.videoformat_43 4:3 videomenu.videomode Videosystem wizard.initial_settings Grundeinstellungen gefunden wizard.install_settings Kanalliste für Astra 19.2°E installieren? +wizard.setup Erste Installation +wizard.setup_advanced Erweitert +wizard.setup_easy Einfach +wizard.setup_type Installationstyp +wizard.setup_type_hint Wählen Sie einfache Grundeinstellungen oder erweiterte Auswahlmöglichkeiten für die Installation wizard.welcome_head Willkommen zur Ersteinrichtung Ihres Receivers! wizard.welcome_text Wir gratulieren Ihnen zum Kauf Ihrer CST. In den nun folgenden\nSchritten begleiten wir Sie durch die Erstinstallation des Gerätes.\nWir wünschen Ihnen viel Freude mit dem wohl einzigartigsten Receiver!\nBeachten Sie: Ihre CST Set-Top-Box lässt sich bequem per Webinterface\nsteuern, um zum Beispiel die Timer-Verwaltung zu nutzen oder Live-TV im Web-Browser zu schauen.\nAchten Sie darauf, dass Ihre Gerät nicht von aussen zugänglich ist,\nda sonst ein Zugriff über das Internet nicht ausgeschlossen werden kann!\nNächster Schritt? word.from ab From 5394e251b88333f65d184d1d211a4c200d4d1178 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Thu, 4 Jul 2013 22:51:39 +0200 Subject: [PATCH 58/63] COsdSetup: Fix segfault due 'double free or corruption' (glibc) - remove 'delete mfFontFile' & 'delete mfTtxFontFile' from destructor - initialize variables mfFontFile & mfTtxFontFile Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/dfd5c29371024ac600a7ccfbe92ca1bec756750c Author: Michael Liebmann Date: 2013-07-04 (Thu, 04 Jul 2013) ------------------ This commit was generated by Migit --- src/gui/osd_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/osd_setup.cpp b/src/gui/osd_setup.cpp index d66e92d80..4c7b70c31 100644 --- a/src/gui/osd_setup.cpp +++ b/src/gui/osd_setup.cpp @@ -70,6 +70,8 @@ COsdSetup::COsdSetup(bool wizard_mode) fontsizenotifier = new CFontSizeNotifier; osd_menu = NULL; submenu_menus = NULL; + mfFontFile = NULL; + mfTtxFontFile = NULL; is_wizard = wizard_mode; @@ -82,8 +84,6 @@ COsdSetup::~COsdSetup() { delete colorSetupNotifier; delete fontsizenotifier; - delete mfFontFile; - delete mfTtxFontFile; } //font settings From 4bc07e73f11de720e843c3c16bda35d4210ad113 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 5 Jul 2013 13:35:08 +0200 Subject: [PATCH 59/63] yweb: fix fallback path to extentions.txt Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/431ec5141959fa21fe64469534bd4ed64b098f20 Author: vanhofen Date: 2013-07-05 (Fri, 05 Jul 2013) Origin message was: ------------------ - yweb: fix fallback path to extentions.txt ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Ext_Menue.yhtm | 2 +- src/nhttpd/web/Y_Ext_Settings.yhtm | 2 +- src/nhttpd/web/Y_Version.txt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nhttpd/web/Y_Ext_Menue.yhtm b/src/nhttpd/web/Y_Ext_Menue.yhtm index 7981d982d..678e4ea5c 100644 --- a/src/nhttpd/web/Y_Ext_Menue.yhtm +++ b/src/nhttpd/web/Y_Ext_Menue.yhtm @@ -1,4 +1,4 @@ -{=var-set:extension={=if-file-exists:/var/tuxbox/config/extentions.txt~/var/tuxbox/config/extentions.txt~{=if-file-exists:/var/httpd/extentions.txt~/var/httpd/extentions.txt~/share/tuxbox/neutrino/httpd-y/extentions.txt=}=}=} +{=var-set:extension={=if-file-exists:/var/tuxbox/config/extentions.txt~/var/tuxbox/config/extentions.txt~{=if-file-exists:/var/httpd/extentions.txt~/var/httpd/extentions.txt~/share/tuxbox/neutrino/httpd/extentions.txt=}=}=} {=var-set:management={=if-equal:{=func:get_request_data client_addr=}~{=ini-get:/var/tuxbox/config/Y-Web.conf;management_ip;{=func:get_request_data client_addr=}=}~1~=}{=if-equal:{=func:get_request_data client_addr=}~{=ini-get:/var/tuxbox/config/Y-Web.conf;management_ip2=}~1~=}=} {=include-block:Y_Blocks.txt;head=} diff --git a/src/nhttpd/web/Y_Ext_Settings.yhtm b/src/nhttpd/web/Y_Ext_Settings.yhtm index 73472ed91..f9a9f906d 100644 --- a/src/nhttpd/web/Y_Ext_Settings.yhtm +++ b/src/nhttpd/web/Y_Ext_Settings.yhtm @@ -23,7 +23,7 @@ function do_submit(){ - +
 

diff --git a/src/nhttpd/web/Y_Version.txt b/src/nhttpd/web/Y_Version.txt index 754e880b9..2090f5078 100644 --- a/src/nhttpd/web/Y_Version.txt +++ b/src/nhttpd/web/Y_Version.txt @@ -1,4 +1,4 @@ -version=2.8.0.36 -date=28.06.2013 +version=2.8.0.37 +date=05.07.2013 type=Release info=Port CST From 9f53d05ac87ded3c2ad13d3fa881aebc06193cb4 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 5 Jul 2013 13:37:11 +0200 Subject: [PATCH 60/63] yweb: don't add undefined info urls to extentions page Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/9e90a1ac56f40d6b739aabb608a782d34b2f0cc9 Author: vanhofen Date: 2013-07-05 (Fri, 05 Jul 2013) Origin message was: ------------------ - yweb: don't add undefined info urls to extentions page ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Ext_Update.js | 9 ++++++--- src/nhttpd/web/Y_Version.txt | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/nhttpd/web/Y_Ext_Update.js b/src/nhttpd/web/Y_Ext_Update.js index 53ace0604..0a212f0e3 100644 --- a/src/nhttpd/web/Y_Ext_Update.js +++ b/src/nhttpd/web/Y_Ext_Update.js @@ -45,7 +45,7 @@ function update_list_addRow(_body, i, your_version, ext_item) var mycurrent_row = y_add_row_to_table(_body, ((i % 2) ==0)?"a":"b" ); var check=''; - var info=""; + var info=" "; var etype=""; switch (ext.upd_version){ @@ -56,7 +56,8 @@ function update_list_addRow(_body, i, your_version, ext_item) var yweb_version=ext_item.get('yweb_version'); if (!yweb.require(yweb_version)) check = ""; - info=""; + if (typeof(ext_item.get('info_url')) != 'undefined') + info=""; break; } switch(ext_item.get('type')){ @@ -180,7 +181,9 @@ function uninstall_list_addRow(_body, i, ext_item, has_uninstall) // var check=''; var etype=""; - var info=""; + var info=" "; + if (typeof(ext_item.get('info_url')) != 'undefined') + info=""; var uninst=""; if(!has_uninstall) uninst=" "; switch(ext_item.get('type')){ diff --git a/src/nhttpd/web/Y_Version.txt b/src/nhttpd/web/Y_Version.txt index 2090f5078..21f61c8ad 100644 --- a/src/nhttpd/web/Y_Version.txt +++ b/src/nhttpd/web/Y_Version.txt @@ -1,4 +1,4 @@ -version=2.8.0.37 +version=2.8.0.38 date=05.07.2013 type=Release info=Port CST From 27f8e2ef696c32f2b9bbe7fd313ee527c050bf1f Mon Sep 17 00:00:00 2001 From: vanhofen Date: Fri, 5 Jul 2013 16:08:30 +0200 Subject: [PATCH 61/63] yweb: add new function 'add_yExtensions()' to avoid duplicate code * remove prefix '-' from added items * add class 'y_menu_sec_ext' to added items * rename unused class 'y_menu_prim_item' to 'y_menu_prim_ext' Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/a78fcbc6a9c9fa53660a86909570060586b1d543 Author: vanhofen Date: 2013-07-05 (Fri, 05 Jul 2013) Origin message was: ------------------ - yweb: add new function 'add_yExtensions()' to avoid duplicate code * remove prefix '-' from added items * add class 'y_menu_sec_ext' to added items * rename unused class 'y_menu_prim_item' to 'y_menu_prim_ext' ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Boxcontrol_Menue.yhtm | 12 +--------- src/nhttpd/web/Y_Info_Menue.yhtm | 11 +-------- src/nhttpd/web/Y_Live_Menue.yhtm | 33 +++----------------------- src/nhttpd/web/Y_Main.css | 10 ++++++-- src/nhttpd/web/Y_Menue.yhtm | 11 +-------- src/nhttpd/web/Y_Settings_Menue.yhtm | 33 +++----------------------- src/nhttpd/web/Y_Tools_Menue.yhtm | 33 +++----------------------- src/nhttpd/web/Y_Version.txt | 2 +- src/nhttpd/web/Y_yweb.js | 16 +++++++++++++ 9 files changed, 37 insertions(+), 124 deletions(-) diff --git a/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm b/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm index 536cd1dc7..cc6da366d 100644 --- a/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm +++ b/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm @@ -56,17 +56,7 @@ function set_mode(_mode){ function init(){ volumen_set_audiobar(volumen_get()); set_mute_button(); - var menu=ext.select_menu('boxcontrol'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_boxcontrol').insert({'bottom':el}); - }); - + add_yExtensions('boxcontrol', 'secmenu_boxcontrol'); } //]]> diff --git a/src/nhttpd/web/Y_Info_Menue.yhtm b/src/nhttpd/web/Y_Info_Menue.yhtm index c549d5ffc..3ea5dab60 100644 --- a/src/nhttpd/web/Y_Info_Menue.yhtm +++ b/src/nhttpd/web/Y_Info_Menue.yhtm @@ -5,16 +5,7 @@ diff --git a/src/nhttpd/web/Y_Live_Menue.yhtm b/src/nhttpd/web/Y_Live_Menue.yhtm index a92bb0d90..89457120f 100644 --- a/src/nhttpd/web/Y_Live_Menue.yhtm +++ b/src/nhttpd/web/Y_Live_Menue.yhtm @@ -22,36 +22,9 @@ function epg_plus_popup() { window.open("Y_EPG_Plus.yhtm","_blank","resizable=yes,scrollbars=yes"); } function init(){ - var menu=ext.select_menu('live'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_live').insert({'bottom':el}); - }); - var menu=ext.select_menu('epg'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_epg').insert({'bottom':el}); - }); - var menu=ext.select_menu('timer'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_timer').insert({'bottom':el}); - }); + add_yExtensions('live', 'secmenu_live'); + add_yExtensions('epg', 'secmenu_epg'); + add_yExtensions('timer', 'secmenu_timer'); } //]]> diff --git a/src/nhttpd/web/Y_Main.css b/src/nhttpd/web/Y_Main.css index 7f4f979a1..1d3a39aa8 100644 --- a/src/nhttpd/web/Y_Main.css +++ b/src/nhttpd/web/Y_Main.css @@ -177,8 +177,6 @@ tr { font-weight: normal; padding: 0em 0.3em; } -.y_menu_prim_item { -} .y_menu_prim li a { font-size: 11pt; text-decoration: none; @@ -191,6 +189,10 @@ tr { .y_menu_prim li a:hover { color: #FF6600; } +/*extensions*/ +.y_menu_prim_ext { +} + #box_name { font-weight:normal; font-size:10pt; @@ -280,6 +282,10 @@ tr { .y_menu_sec ul li:first-child { margin-top: 5px; } +/*extensions*/ +.y_menu_sec_ext { +} + .y_menu_popup_link { float: right; margin-right: 15px; diff --git a/src/nhttpd/web/Y_Menue.yhtm b/src/nhttpd/web/Y_Menue.yhtm index 0ba6a9ad0..121d3e5b7 100644 --- a/src/nhttpd/web/Y_Menue.yhtm +++ b/src/nhttpd/web/Y_Menue.yhtm @@ -46,16 +46,7 @@ function i_start(){ g_i_counter = 0; i_clock(); g_i_active = window.setInterval('i_interval()', 1000); - var mainmenu=ext.select_menu('main'); - mainmenu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'class':'y_menu_prim_item', 'target':'base', - 'title': e.get('desc'), - 'href': e.get('file') - }).update(e.get('menuitem')) - ); - $('menu_prim').insert({'bottom':el}); - }); + add_yExtensions('main', 'menu_prim'); } function i_stop(){ window.clearInterval(g_i_active); diff --git a/src/nhttpd/web/Y_Settings_Menue.yhtm b/src/nhttpd/web/Y_Settings_Menue.yhtm index 2769674bf..72d4f9f20 100644 --- a/src/nhttpd/web/Y_Settings_Menue.yhtm +++ b/src/nhttpd/web/Y_Settings_Menue.yhtm @@ -5,36 +5,9 @@ diff --git a/src/nhttpd/web/Y_Tools_Menue.yhtm b/src/nhttpd/web/Y_Tools_Menue.yhtm index 6cf1ac3e5..aa4a47799 100644 --- a/src/nhttpd/web/Y_Tools_Menue.yhtm +++ b/src/nhttpd/web/Y_Tools_Menue.yhtm @@ -7,36 +7,9 @@ function cmd_popup(){ window.open('Y_Tools_Cmd.yhtm','cmd','width=720,height=470,resizable=yes'); } function init(){ - var menu=ext.select_menu('tools'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_tools').insert({'bottom':el}); - }); - var menu=ext.select_menu('expert'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_expert').insert({'bottom':el}); - }); - var menu=ext.select_menu('yweb'); - menu.each(function(e){ - var el=new Element('li').update( - new Element('a', {'target':'work', - 'title': e.get('desc'), - 'href': e.get('file') - }).update("-"+e.get('menuitem')) - ); - $('secmenu_yweb').insert({'bottom':el}); - }); + add_yExtensions('tools', 'secmenu_tools'); + add_yExtensions('expert', 'secmenu_expert'); + add_yExtensions('yweb', 'secmenu_yweb'); } diff --git a/src/nhttpd/web/Y_Version.txt b/src/nhttpd/web/Y_Version.txt index 21f61c8ad..31639c62c 100644 --- a/src/nhttpd/web/Y_Version.txt +++ b/src/nhttpd/web/Y_Version.txt @@ -1,4 +1,4 @@ -version=2.8.0.38 +version=2.8.0.39 date=05.07.2013 type=Release info=Port CST diff --git a/src/nhttpd/web/Y_yweb.js b/src/nhttpd/web/Y_yweb.js index a73bdd7a1..ecd729d2a 100644 --- a/src/nhttpd/web/Y_yweb.js +++ b/src/nhttpd/web/Y_yweb.js @@ -182,6 +182,22 @@ Object.extend(Y.extension.prototype, { },this); } }); + +function add_yExtensions(_ymenu, _id) { + var menu=ext.select_menu(_ymenu); + menu.each(function(e){ + var el=new Element('li').update( + new Element('a', { + 'class': (_ymenu == 'main') ? 'y_menu_prim_ext' : 'y_menu_sec_ext', + 'target': (_ymenu == 'main') ? 'base' : 'work', + 'title': e.get('desc'), + 'href': e.get('file') + }).update(e.get('menuitem')) + ); + $(_id).insert({'bottom':el}); + }); +} + /* singleton pattern*/ if (window == top.top_main.prim_menu) { var ext = new Y.extension(); From e4599aac06ca4ca03337b02c4de407982f3f0181 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 6 Jul 2013 08:41:07 +0200 Subject: [PATCH 62/63] yweb: split links to screenshot pages to different list rows Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/2c1477f46c54df3c0b9129dd8d257b066dcb3429 Author: vanhofen Date: 2013-07-06 (Sat, 06 Jul 2013) Origin message was: ------------------ - yweb: split links to screenshot pages to different list rows ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Y_Boxcontrol_Menue.yhtm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm b/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm index cc6da366d..993857228 100644 --- a/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm +++ b/src/nhttpd/web/Y_Boxcontrol_Menue.yhtm @@ -91,6 +91,8 @@ function init(){ ~=}

  • OSD-{=L:bc.menue.screenshot=} +
  • +
  • TV-{=L:bc.menue.screenshot=}
  • From 6fda429273549849b7bc0d1af3d474946e7bc9b0 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sat, 6 Jul 2013 08:43:43 +0200 Subject: [PATCH 63/63] yweb: remove obsolete Y_Settings.yhtm Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/af662827d5af78ce1234b34bdf0ee0175e868b6b Author: vanhofen Date: 2013-07-06 (Sat, 06 Jul 2013) Origin message was: ------------------ - yweb: remove obsolete Y_Settings.yhtm ------------------ No further description and justification available within origin commit message! ------------------ This commit was generated by Migit --- src/nhttpd/web/Makefile.am | 1 - src/nhttpd/web/Y_Settings.yhtm | 17 ----------------- 2 files changed, 18 deletions(-) delete mode 100644 src/nhttpd/web/Y_Settings.yhtm diff --git a/src/nhttpd/web/Makefile.am b/src/nhttpd/web/Makefile.am index 858dbdf7d..a7b0dff3f 100644 --- a/src/nhttpd/web/Makefile.am +++ b/src/nhttpd/web/Makefile.am @@ -65,7 +65,6 @@ install_DATA = channels.js \ Y_Settings_video_audio.yhtm \ Y_Settings_VNC.yhtm \ Y_Settings_wol.yhtm \ - Y_Settings.yhtm \ Y_Settings_yWeb.yhtm \ Y_Settings_zapit.yhtm \ Y_StreamInfo.yhtm \ diff --git a/src/nhttpd/web/Y_Settings.yhtm b/src/nhttpd/web/Y_Settings.yhtm deleted file mode 100644 index 3f4ec1dbd..000000000 --- a/src/nhttpd/web/Y_Settings.yhtm +++ /dev/null @@ -1,17 +0,0 @@ -{=var-set:cancache=yPyes=} - - - - - - - - - - <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0"> - <p>Diese Seite verwendet Frames. Frames werden von Ihrem Browser aber nicht unterst&uuml;zt.</p> - </body> - - - -