Exemple #1
0
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;
}