void CFileBrowser::addRecursiveDir(CFileList * re_filelist, std::string rpath, bool bRootCall, CProgressWindow * progress) { neutrino_msg_t msg; neutrino_msg_data_t data; int n; //printf("addRecursiveDir %s\n",rpath.c_str()); if (bRootCall) bCancel=false; g_RCInput->getMsg_us(&msg, &data, 1); if (msg==CRCInput::RC_home) { // home key cancel scan bCancel=true; } else if (msg!=CRCInput::RC_timeout) { // other event, save to low priority queue g_RCInput->postMsg( msg, data, false ); } if(bCancel) return; if ((m_Mode != ModeSC) && ((rpath.empty()) || ((*rpath.rbegin()) != '/'))) { rpath += '/'; } CFileList tmplist; if(!readDir(rpath, &tmplist)) { perror(("Recursive scandir: "+rpath).c_str()); } else { n = tmplist.size(); if(progress) { progress->showStatusMessageUTF(FILESYSTEM_ENCODING_TO_UTF8_STRING(rpath)); } for(int i = 0; i < n;i++) { if(progress) { progress->showGlobalStatus(100/n*i); } std::string basename = tmplist[i].Name.substr(tmplist[i].Name.rfind('/')+1); if( basename != ".." ) { if(Filter != NULL && (!S_ISDIR(tmplist[i].Mode)) && use_filter) { if(!Filter->matchFilter(tmplist[i].Name)) { continue; } } if(!S_ISDIR(tmplist[i].Mode)) re_filelist->push_back(tmplist[i]); else addRecursiveDir(re_filelist,tmplist[i].Name, false, progress); } } } }
bool CFileBrowser::exec(const char * const dirname) { neutrino_msg_t msg; neutrino_msg_data_t data; bool res = false; #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) { m_baseurl = base; } else #endif { m_baseurl = "http://" + g_settings.streaming_server_ip + ':' + g_settings.streaming_server_port + "/requests/browse.xml?dir="; } name = dirname; std::replace(name.begin(), name.end(), '\\', '/'); paintHead(); ChangeDir(name); paint(); paintFoot(); int oldselected = selected; unsigned long long timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_FILEBROWSER]); bool loop=true; while (loop) { g_RCInput->getMsgAbsoluteTimeout( &msg, &data, &timeoutEnd ); neutrino_msg_t msg_repeatok = msg & ~CRCInput::RC_Repeat; if ( msg <= CRCInput::RC_MaxRC ) timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_FILEBROWSER]); if(!CRCInput::isNumeric(msg)) { m_SMSKeyInput.resetOldKey(); } if (msg == CRCInput::RC_yellow) { if ((Multi_Select) && (selected < filelist.size())) { if(filelist[selected].getFileName() != "..") { if( (S_ISDIR(filelist[selected].Mode) && Dirs_Selectable) || !S_ISDIR(filelist[selected].Mode) ) { filelist[selected].Marked = !filelist[selected].Marked; paintItem(selected - liststart); } } msg_repeatok = CRCInput::RC_down; // jump to next item } } if ((msg == CRCInput::RC_red) || msg == CRCInput::RC_page_down) { selected += listmaxshow; if (selected >= filelist.size()) { if (((filelist.size() / listmaxshow) + 1) * listmaxshow == filelist.size() + listmaxshow) // last page has full entries selected = 0; else selected = selected < (((filelist.size() / listmaxshow) + 1) * listmaxshow) ? (filelist.size() - 1) : 0; } liststart = (selected / listmaxshow) * listmaxshow; paint(); } else if ((msg == CRCInput::RC_green) || (msg == CRCInput::RC_page_up) ) { if ((int(selected)-int(listmaxshow))<0) selected=filelist.size()-1; else selected -= listmaxshow; liststart = (selected/listmaxshow)*listmaxshow; paint(); } else if (msg_repeatok == CRCInput::RC_up) { int prevselected=selected; if(selected==0) { selected = filelist.size()-1; } else selected--; paintItem(prevselected - liststart); unsigned int oldliststart = liststart; liststart = (selected/listmaxshow)*listmaxshow; if(oldliststart!=liststart) { paint(); } else { paintItem(selected - liststart); } } else if (msg_repeatok == CRCInput::RC_down) { if (!(filelist.empty())) { int prevselected=selected; selected = (selected + 1) % filelist.size(); paintItem(prevselected - liststart); unsigned int oldliststart = liststart; liststart = (selected/listmaxshow)*listmaxshow; if(oldliststart!=liststart) paint(); else paintItem(selected - liststart); } } else if ( ( msg == CRCInput::RC_timeout ) ) { selected = oldselected; loop=false; } else if ( msg == CRCInput::RC_right ) { if (!(filelist.empty())) { if (S_ISDIR(filelist[selected].Mode)) { #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) { ChangeDir(filelist[selected].Url); } else #endif { if (filelist[selected].getFileName() != "..") { selections.push_back(selected); ChangeDir(filelist[selected].Name); } } } } } else if ( msg == CRCInput::RC_left ) { #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) { for(unsigned int i = 0; i < filelist.size();i++) { if (S_ISDIR(filelist[i].Mode) && filelist[i].getFileName() == "..") { ChangeDir(filelist[i].Url); break; } } } else #endif if (selections.size() > 0) { ChangeDir("..",selections.back()); selections.pop_back(); } else { ChangeDir(".."); } } else if ( msg == CRCInput::RC_blue ) { if(Filter != NULL) { use_filter = !use_filter; paintFoot(); ChangeDir(Path); } } else if ( msg == CRCInput::RC_home ) { loop = false; } else if ( msg == CRCInput::RC_spkr && strncmp(Path.c_str(), VLC_URI, strlen(VLC_URI)) != 0) //Not in vlc mode { if(".." !=(filelist[selected].getFileName().substr(0,2))) // do not delete that { std::stringstream _msg; _msg << g_Locale->getText(LOCALE_FILEBROWSER_DODELETE1) << " "; if (filelist[selected].getFileName().length() > 25) { _msg << filelist[selected].getFileName().substr(0, 25) << "..."; } else _msg << filelist[selected].getFileName(); _msg << " " << g_Locale->getText(LOCALE_FILEBROWSER_DODELETE2); if (ShowMsgUTF(LOCALE_FILEBROWSER_DELETE, _msg.str(), CMessageBox::mbrNo, CMessageBox::mbYes|CMessageBox::mbNo)==CMessageBox::mbrYes) { recursiveDelete(filelist[selected].Name.c_str()); if(".ts" ==(filelist[selected].getFileName().substr(filelist[selected].getFileName().length()-3,filelist[selected].getFileName().length())))//if bla.ts { recursiveDelete((filelist[selected].Name.substr(0,filelist[selected].Name.length()-7)+".xml").c_str());//remove bla.xml von bla.ts } ChangeDir(Path); } } } else if (msg == CRCInput::RC_ok) { if (!(filelist.empty())) { if (filelist[selected].getFileName() == "..") { #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) ChangeDir(filelist[selected].Url); else #endif { if (selections.size() > 0) { ChangeDir("..",selections.back()); selections.pop_back(); } else { std::string::size_type pos = Path.substr(0,Path.length()-1).rfind('/'); if (pos != std::string::npos) { ChangeDir(".."); } else { loop = false; res = true; filelist[selected].Name = "/"; } } } } else { std::string filename = filelist[selected].Name; if ( filename.length() > 1 ) { if((!Multi_Select) && S_ISDIR(filelist[selected].Mode) && !Dir_Mode) { #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) ChangeDir(filelist[selected].Url); else #endif ChangeDir(filelist[selected].Name); } else { filelist[selected].Marked = true; loop = false; res = true; } } } } } else if (msg==CRCInput::RC_help) { if (++g_settings.filebrowser_sortmethod >= FILEBROWSER_NUMBER_OF_SORT_VARIANTS) g_settings.filebrowser_sortmethod = 0; sort(filelist.begin(), filelist.end(), sortBy[g_settings.filebrowser_sortmethod]); paint(); paintFoot(); } else if (CRCInput::isNumeric(msg_repeatok)) { if (!(filelist.empty())) SMSInput(msg_repeatok); } else { if ( CNeutrinoApp::getInstance()->handleMsg( msg, data ) & messages_return::cancel_all ) { loop = false; } } } hide(); selected_filelist.clear(); if(res && Multi_Select) { CProgressWindow * progress = new CProgressWindow(); progress->setTitle(LOCALE_FILEBROWSER_SCAN); progress->exec(NULL,""); for(unsigned int i = 0; i < filelist.size();i++) if(filelist[i].Marked) { if(S_ISDIR(filelist[i].Mode)) { #ifdef ENABLE_INTERNETRADIO if (m_Mode == ModeSC) addRecursiveDir(&selected_filelist,filelist[i].Url, true, progress); else #endif addRecursiveDir(&selected_filelist,filelist[i].Name, true, progress); } else selected_filelist.push_back(filelist[i]); } progress->hide(); delete progress; } return res; }
void CFileBrowser::addRecursiveDir(CFileList * re_filelist, std::string rpath, bool bRootCall) { neutrino_msg_t msg; neutrino_msg_data_t data; int n; dprintf(DEBUG_INFO, "CFileBrowser::addRecursiveDir %s\n", rpath.c_str()); if (bRootCall) bCancel = false; g_RCInput->getMsg_us(&msg, &data, 1); if (msg == CRCInput::RC_home) { // home key cancel scan bCancel = true; } else if (msg != CRCInput::RC_timeout) { // other event, save to low priority queue g_RCInput->postMsg( msg, data, false ); } if(bCancel) return; if ( ((rpath.empty()) || ((*rpath.rbegin()) != '/'))) { rpath += '/'; } CFileList tmplist; if(!readDir(rpath, &tmplist)) { perror(("Recursive scandir: " + rpath).c_str()); } else { n = tmplist.size(); for(int i = 0; i < n;i++) { std::string basename = tmplist[i].Name.substr(tmplist[i].Name.rfind('/')+1); if( basename != ".." ) { if(Filter != NULL && (!S_ISDIR(tmplist[i].Mode)) && use_filter) { if(!Filter->matchFilter(tmplist[i].Name)) { continue; } } if(!S_ISDIR(tmplist[i].Mode)) re_filelist->push_back(tmplist[i]); else addRecursiveDir(re_filelist,tmplist[i].Name, false); } } } }