void CHDDirectory::HandleSearchResult(void* thisPtr, void* itemListPtr, const char* strFilePath) { CHDDirectory* me = (CHDDirectory* )thisPtr; CFileItemList* pItemList = (CFileItemList* )itemListPtr; // Load up a find data. WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(WIN32_FIND_DATA)); // Filename. CStdString strPath = strFilePath; CStdString strFile = CUtil::GetFileName(strPath); strPath = strPath.Left(strPath.length()-strFile.length()); strcpy(wfd.cFileName, strFile.c_str()); // Get the attributes. wfd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL; // Is it a directory? if (strPath[0] == '.') wfd.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; struct stat64 fileStat; if (stat64(strFilePath, &fileStat) != 0) { CLog::Log(LOGERROR, "Error: Smart Folder search, couldn't find file [%s]\n", strFilePath); return; } if (S_ISDIR(fileStat.st_mode)) wfd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; wfd.nFileSizeHigh = (DWORD)(fileStat.st_size >> 32); wfd.nFileSizeLow = (DWORD)fileStat.st_size; TimeTToFileTime(fileStat.st_ctime, &wfd.ftCreationTime); TimeTToFileTime(fileStat.st_atime, &wfd.ftLastAccessTime); TimeTToFileTime(fileStat.st_mtime, &wfd.ftLastWriteTime); CFileItemPtr pItem(me->BuildResolvedFileItem(strPath, wfd)); // If it's allowed, add it to the list. if (pItem && me->IsAllowed(pItem.get(), wfd)) pItemList->Add(pItem); }
void CGUIWindowPrograms::PopulateTrainersList() { CDirectory directory; CFileItemList trainers; CFileItemList archives; CFileItemList inArchives; // first, remove any dead items std::vector<CStdString> vecTrainerPath; m_database.GetAllTrainers(vecTrainerPath); CGUIDialogProgress* m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); m_dlgProgress->SetLine(0,12023); m_dlgProgress->SetLine(1,""); m_dlgProgress->SetLine(2,""); m_dlgProgress->StartModal(); m_dlgProgress->SetHeading(12012); m_dlgProgress->ShowProgressBar(true); m_dlgProgress->Progress(); bool bBreak=false; bool bDatabaseState = m_database.IsOpen(); if (!bDatabaseState) m_database.Open(); m_database.BeginTransaction(); for (unsigned int i=0;i<vecTrainerPath.size();++i) { m_dlgProgress->SetPercentage((int)((float)i/(float)vecTrainerPath.size()*100.f)); CStdString strLine; strLine.Format("%s %i / %i",g_localizeStrings.Get(12013).c_str(), i+1,vecTrainerPath.size()); m_dlgProgress->SetLine(1,strLine); m_dlgProgress->Progress(); if (!CFile::Exists(vecTrainerPath[i]) || vecTrainerPath[i].find(g_guiSettings.GetString("myprograms.trainerpath",false)) == -1) m_database.RemoveTrainer(vecTrainerPath[i]); if (m_dlgProgress->IsCanceled()) { bBreak = true; m_database.RollbackTransaction(); break; } } if (!bBreak) { CLog::Log(LOGDEBUG,"trainerpath %s",g_guiSettings.GetString("myprograms.trainerpath",false).c_str()); directory.GetDirectory(g_guiSettings.GetString("myprograms.trainerpath").c_str(),trainers,".xbtf|.etm"); if (g_guiSettings.GetString("myprograms.trainerpath",false).IsEmpty()) { m_database.RollbackTransaction(); m_dlgProgress->Close(); return; } directory.GetDirectory(g_guiSettings.GetString("myprograms.trainerpath").c_str(),archives,".rar|.zip",false); // TODO: ZIP SUPPORT for( int i=0;i<archives.Size();++i) { if (stricmp(URIUtils::GetExtension(archives[i]->GetPath()),".rar") == 0) { g_RarManager.GetFilesInRar(inArchives,archives[i]->GetPath(),false); CHDDirectory dir; dir.SetMask(".xbtf|.etm"); for (int j=0;j<inArchives.Size();++j) if (dir.IsAllowed(inArchives[j]->GetPath())) { CFileItemPtr item(new CFileItem(*inArchives[j])); CStdString strPathInArchive = item->GetPath(); CStdString path; URIUtils::CreateArchivePath(path, "rar", archives[i]->GetPath(), strPathInArchive,""); item->SetPath(path); trainers.Add(item); } } if (stricmp(URIUtils::GetExtension(archives[i]->GetPath()),".zip")==0) { // add trainers in zip CStdString strZipPath; URIUtils::CreateArchivePath(strZipPath,"zip",archives[i]->GetPath(),""); CFileItemList zipTrainers; directory.GetDirectory(strZipPath,zipTrainers,".etm|.xbtf"); for (int j=0;j<zipTrainers.Size();++j) { CFileItemPtr item(new CFileItem(*zipTrainers[j])); trainers.Add(item); } } } if (!m_dlgProgress) m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); m_dlgProgress->SetPercentage(0); m_dlgProgress->ShowProgressBar(true); CLog::Log(LOGDEBUG,"# trainers %i",trainers.Size()); m_dlgProgress->SetLine(1,""); int j=0; while (j < trainers.Size()) { if (trainers[j]->m_bIsFolder) trainers.Remove(j); else j++; } for (int i=0;i<trainers.Size();++i) { CLog::Log(LOGDEBUG,"found trainer %s",trainers[i]->GetPath().c_str()); m_dlgProgress->SetPercentage((int)((float)(i)/trainers.Size()*100.f)); CStdString strLine; strLine.Format("%s %i / %i",g_localizeStrings.Get(12013).c_str(), i+1,trainers.Size()); m_dlgProgress->SetLine(0,strLine); m_dlgProgress->SetLine(2,""); m_dlgProgress->Progress(); if (m_database.HasTrainer(trainers[i]->GetPath())) // skip existing trainers continue; CTrainer trainer; if (trainer.Load(trainers[i]->GetPath())) { m_dlgProgress->SetLine(1,trainer.GetName()); m_dlgProgress->SetLine(2,""); m_dlgProgress->Progress(); unsigned int iTitle1, iTitle2, iTitle3; trainer.GetTitleIds(iTitle1,iTitle2,iTitle3); if (iTitle1) m_database.AddTrainer(iTitle1,trainers[i]->GetPath()); if (iTitle2) m_database.AddTrainer(iTitle2,trainers[i]->GetPath()); if (iTitle3) m_database.AddTrainer(iTitle3,trainers[i]->GetPath()); } if (m_dlgProgress->IsCanceled()) { m_database.RollbackTransaction(); break; } } } m_database.CommitTransaction(); m_dlgProgress->Close(); if (!bDatabaseState) m_database.Close(); else Update(m_vecItems->GetPath()); }
bool CPlayListDirectory::GetDirectory(const CStdString& strPath, VECFILEITEMS &items) { if ( !CUtil::IsPlayList(strPath) ) { CHDDirectory dirLoader; dirLoader.SetMask(".m3u|.b4s|.pls|.strm"); VECFILEITEMS tmpitems; CStdString strDir = g_stSettings.m_szAlbumDirectory; strDir += "\\playlists"; dirLoader.GetDirectory(strDir, tmpitems); // for each playlist found for (int i = 0; i < (int)tmpitems.size(); ++i) { CFileItem* pItem = tmpitems[i]; CStdString strPlayListName, strPlayList; strPlayList = CUtil::GetFileName( pItem->m_strPath ); strPlayListName = CUtil::GetFileName( strPlayList ); delete pItem; CPlayListFactory factory; CPlayList* pPlayList = factory.Create(strPlayList); if (pPlayList) { if ( pPlayList->Load(strPlayList) ) { CStdString strPlayListName = pPlayList->GetName(); if (strPlayListName.size()) { strPlayListName = strPlayListName; } } delete pPlayList; } // create an entry.... pItem = new CFileItem(strPlayListName); pItem->m_strPath = strPlayList; pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } CUtil::SetThumbs(items); CUtil::FillInDefaultIcons(items); return true; } // yes, first add parent path { CFileItem *pItem = new CFileItem(".."); pItem->m_strPath = ""; pItem->m_bIsFolder = true; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } // open the playlist CPlayListFactory factory; CPlayList* pPlayList = factory.Create(strPath); if (!pPlayList) return false; if ( pPlayList->Load(strPath) ) { for (int i = 0; i < (int)pPlayList->size(); ++i) { const CPlayList::CPlayListItem& playlistItem = (*pPlayList)[i]; CStdString strLabel; strLabel = CUtil::GetFileName( playlistItem.GetFileName() ); CFileItem* pItem = new CFileItem(strLabel); pItem->m_strPath = playlistItem.GetFileName(); pItem->m_bIsFolder = false; pItem->m_bIsShareOrDrive = false; items.push_back(pItem); } } delete pPlayList; CUtil::SetThumbs(items); CUtil::FillInDefaultIcons(items); return true; }