TEST(TestAsyncFileCopy, General) { CAsyncFileCopy c; XFILE::CFile *f1, *f2; char vardata[sizeof(refdata)]; ASSERT_TRUE((f1 = XBMC_CREATETEMPFILE(""))); ASSERT_TRUE((f2 = XBMC_CREATETEMPFILE(".copy"))); EXPECT_EQ((int)sizeof(refdata), f1->Write(refdata, sizeof(refdata))); f1->Close(); f2->Close(); EXPECT_TRUE(c.Copy(XBMC_TEMPFILEPATH(f1), XBMC_TEMPFILEPATH(f2), "")); EXPECT_TRUE(f2->Open(XBMC_TEMPFILEPATH(f2))); EXPECT_EQ(sizeof(refdata), f2->Read(vardata, sizeof(refdata))); f2->Close(); EXPECT_TRUE(!memcmp(vardata, refdata, sizeof(refdata))); EXPECT_TRUE(XBMC_DELETETEMPFILE(f1)); EXPECT_TRUE(XBMC_DELETETEMPFILE(f2)); }
// Allow user to select a Fanart void CGUIDialogVideoInfo::OnGetFanart() { CFileItemList items; CFileItem item(*m_movieItem->GetVideoInfoTag()); CStdString cachedThumb(item.GetCachedFanart()); if (CFile::Exists(cachedThumb)) { CFileItemPtr itemCurrent(new CFileItem("fanart://Current",false)); itemCurrent->SetThumbnailImage(cachedThumb); itemCurrent->SetLabel(g_localizeStrings.Get(20440)); items.Add(itemCurrent); } // ensure the fanart is unpacked m_movieItem->GetVideoInfoTag()->m_fanart.Unpack(); // Grab the thumbnails from the web for (unsigned int i = 0; i < m_movieItem->GetVideoInfoTag()->m_fanart.GetNumFanarts(); i++) { CStdString strItemPath; strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); CStdString thumb = m_movieItem->GetVideoInfoTag()->m_fanart.GetPreviewURL(i); item->SetThumbnailImage(CTextureCache::GetWrappedThumbURL(thumb)); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20441)); // TODO: Do we need to clear the cached image? // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } CStdString strLocal = item.GetLocalFanart(); if (!strLocal.IsEmpty()) { CFileItemPtr itemLocal(new CFileItem("fanart://Local",false)); itemLocal->SetThumbnailImage(strLocal); itemLocal->SetLabel(g_localizeStrings.Get(20438)); // TODO: Do we need to clear the cached image? CTextureCache::Get().ClearCachedImage(strLocal); items.Add(itemLocal); } else { CFileItemPtr itemNone(new CFileItem("fanart://None", false)); itemNone->SetIconImage("DefaultVideo.png"); itemNone->SetLabel(g_localizeStrings.Get(20439)); items.Add(itemNone); } CStdString result; VECSOURCES sources(g_settings.m_videoSources); g_mediaManager.GetLocalDrives(sources); bool flip=false; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20437), result, &flip, 20445) || result.Equals("fanart://Current")) return; // user cancelled CTextureCache::Get().ClearCachedImage(cachedThumb, true); if (result.Equals("fanart://Local")) result = strLocal; if (result.Left(15) == "fanart://Remote") { int iFanart = atoi(result.Mid(15).c_str()); // set new primary fanart, and update our database accordingly m_movieItem->GetVideoInfoTag()->m_fanart.SetPrimaryFanart(iFanart); CVideoDatabase db; if (db.Open()) { db.UpdateFanart(*m_movieItem, (VIDEODB_CONTENT_TYPE)m_movieItem->GetVideoContentType()); db.Close(); } // download the fullres fanart image CStdString tempFile = "special://temp/fanart_download.jpg"; CAsyncFileCopy downloader; bool succeeded = downloader.Copy(m_movieItem->GetVideoInfoTag()->m_fanart.GetImageURL(), tempFile, g_localizeStrings.Get(13413)); if (succeeded) { if (flip) CPicture::ConvertFile(tempFile, cachedThumb,0,1920,-1,100,true); else CPicture::CacheFanart(tempFile, cachedThumb); } CFile::Delete(tempFile); if (!succeeded) return; // failed or cancelled download, so don't do anything } else if (CFile::Exists(result)) { // local file if (flip) CPicture::ConvertFile(result, cachedThumb,0,1920,-1,100,true); else CPicture::CacheFanart(result, cachedThumb); } CUtil::DeleteVideoDatabaseDirectoryCache(); // to get them new thumbs to show if (CFile::Exists(cachedThumb)) m_movieItem->SetProperty("fanart_image", cachedThumb); else m_movieItem->ClearProperty("fanart_image"); m_hasUpdatedThumb = true; // Update our screen Update(); }
// Allow user to select a Fanart void CGUIDialogMusicInfo::OnGetFanart() { CFileItemList items; CStdString cachedThumb(CThumbnailCache::GetThumb(m_artist.strArtist,g_settings.GetMusicFanartFolder())); if (CFile::Exists(cachedThumb)) { CFileItemPtr itemCurrent(new CFileItem("fanart://Current",false)); itemCurrent->SetThumbnailImage(cachedThumb); itemCurrent->SetLabel(g_localizeStrings.Get(20440)); items.Add(itemCurrent); } // Grab the thumbnails from the web for (unsigned int i = 0; i < m_artist.fanart.GetNumFanarts(); i++) { CStdString strItemPath; strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); CStdString thumb = m_artist.fanart.GetPreviewURL(i); item->SetThumbnailImage(CTextureCache::GetWrappedThumbURL(thumb)); item->SetIconImage("DefaultPicture.png"); item->SetLabel(g_localizeStrings.Get(20441)); // TODO: Do we need to clear the cached image? // CTextureCache::Get().ClearCachedImage(thumb); items.Add(item); } // Grab a local thumb CMusicDatabase database; database.Open(); CStdString strArtistPath; database.GetArtistPath(m_artist.idArtist,strArtistPath); CFileItem item(strArtistPath,true); CStdString strLocal = item.GetLocalFanart(); if (!strLocal.IsEmpty()) { CFileItemPtr itemLocal(new CFileItem("fanart://Local",false)); itemLocal->SetThumbnailImage(strLocal); itemLocal->SetLabel(g_localizeStrings.Get(20438)); // TODO: Do we need to clear the cached image? CTextureCache::Get().ClearCachedImage(strLocal); items.Add(itemLocal); } else { CFileItemPtr itemNone(new CFileItem("fanart://None", false)); itemNone->SetIconImage("DefaultArtist.png"); itemNone->SetLabel(g_localizeStrings.Get(20439)); items.Add(itemNone); } CStdString result; VECSOURCES sources(g_settings.m_musicSources); g_mediaManager.GetLocalDrives(sources); bool flip=false; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20437), result, &flip, 20445)) return; // user cancelled // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail if (result.Equals("fanart://Current")) return; if (result.Equals("fanart://Local")) result = strLocal; CTextureCache::Get().ClearCachedImage(cachedThumb, true); if (!result.Equals("fanart://None")) { // local file if (result.Left(15) == "fanart://Remote") { int iFanart = atoi(result.Mid(15).c_str()); m_artist.fanart.SetPrimaryFanart(iFanart); // download the fullres fanart image CStdString tempFile = "special://temp/fanart_download.jpg"; CAsyncFileCopy downloader; if (!downloader.Copy(m_artist.fanart.GetImageURL(), tempFile, g_localizeStrings.Get(13413))) return; result = tempFile; } if (flip) CPicture::ConvertFile(result, cachedThumb,0,1920,-1,100,true); else CPicture::CacheFanart(result, cachedThumb); m_albumItem->SetProperty("fanart_image",cachedThumb); m_hasUpdatedThumb = true; } // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_windowManager.SendMessage(msg); // Update our screen Update(); }
bool CGUIWindowFileManager::DoProcessFile(int iAction, const CStdString& strFile, const CStdString& strDestFile) { CStdString strShortSourceFile; CStdString strShortDestFile; CURL(strFile).GetURLWithoutUserDetails(strShortSourceFile); CURL(strDestFile).GetURLWithoutUserDetails(strShortDestFile); switch (iAction) { case ACTION_COPY: { CLog::Log(LOGDEBUG,"FileManager: copy %s->%s\n", strFile.c_str(), strDestFile.c_str()); CURL url(strFile); if (url.GetProtocol() == "rar") { g_RarManager.SetWipeAtWill(false); CStdString strOriginalCachePath = g_advancedSettings.m_cachePath; CStdString strDestPath; CUtil::GetDirectory(strDestFile,strDestPath); g_advancedSettings.m_cachePath = strDestPath; CLog::Log(LOGDEBUG, "CacheRarredFile: dest=%s, file=%s",strDestPath.c_str(), url.GetFileName().c_str()); bool bResult = g_RarManager.CacheRarredFile(strDestPath,url.GetHostName(),url.GetFileName(),0,strDestPath,-2); g_advancedSettings.m_cachePath = strOriginalCachePath; g_RarManager.SetWipeAtWill(true); return bResult; } else { CAsyncFileCopy copier; if (!copier.Copy(strFile, strDestFile, g_localizeStrings.Get(115))) return false; } } break; case ACTION_MOVE: { CLog::Log(LOGDEBUG,"FileManager: move %s->%s\n", strFile.c_str(), strDestFile.c_str()); #ifndef _LINUX if (strFile[1] == ':' && strFile[0] == strDestFile[0]) { // quick move on same drive CFile::Rename(strFile, strDestFile); } else { CAsyncFileCopy copier; if (copier.Copy(strFile, strDestFile, g_localizeStrings.Get(116))) { CFile::Delete(strFile); } else return false; } #else CFile::Rename(strFile, strDestFile); #endif } break; case ACTION_DELETE: { CLog::Log(LOGDEBUG,"FileManager: delete %s\n", strFile.c_str()); CFile::Delete(strFile); if (m_dlgProgress) { m_dlgProgress->SetLine(0, 117); m_dlgProgress->SetLine(1, strShortSourceFile); m_dlgProgress->SetLine(2, ""); m_dlgProgress->Progress(); } } break; case ACTION_DELETEFOLDER: { CLog::Log(LOGDEBUG,"FileManager: delete folder %s\n", strFile.c_str()); CDirectory::Remove(strFile); if (m_dlgProgress) { m_dlgProgress->SetLine(0, 117); m_dlgProgress->SetLine(1, strShortSourceFile); m_dlgProgress->SetLine(2, ""); m_dlgProgress->Progress(); } } break; case ACTION_CREATEFOLDER: { CLog::Log(LOGDEBUG,"FileManager: create folder %s\n", strFile.c_str()); CDirectory::Create(strFile); if (m_dlgProgress) { m_dlgProgress->SetLine(0, 119); m_dlgProgress->SetLine(1, strShortSourceFile); m_dlgProgress->SetLine(2, ""); m_dlgProgress->Progress(); } } break; } bool bResult = true; if (m_dlgProgress) { m_dlgProgress->Progress(); bResult = !m_dlgProgress->IsCanceled(); } return bResult; }
// Allow user to select a Fanart void CGUIWindowVideoInfo::OnGetFanart() { CFileItemList items; // ensure the fanart is unpacked m_movieItem->GetVideoInfoTag()->m_fanart.Unpack(); // Grab the thumbnails from the web CStdString strPath; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath,"fanartthumbs",strPath); CUtil::WipeDir(strPath); DIRECTORY::CDirectory::Create(strPath); for (unsigned int i = 0; i < m_movieItem->GetVideoInfoTag()->m_fanart.GetNumFanarts(); i++) { CStdString strItemPath; strItemPath.Format("fanart://Remote%i",i); CFileItemPtr item(new CFileItem(strItemPath, false)); item->SetThumbnailImage("http://this.is/a/thumb/from/the/web"); item->SetIconImage("defaultPicture.png"); item->GetVideoInfoTag()->m_fanart = m_movieItem->GetVideoInfoTag()->m_fanart; item->SetProperty("fanart_number", (int)i); item->SetLabel(g_localizeStrings.Get(415)); item->SetProperty("labelonthumbload", g_localizeStrings.Get(20015)); // make sure any previously cached thumb is removed if (CFile::Exists(item->GetCachedPictureThumb())) CFile::Delete(item->GetCachedPictureThumb()); items.Add(item); } CFileItem item(*m_movieItem->GetVideoInfoTag()); CStdString cachedThumb(item.GetCachedFanart()); CStdString strLocal = item.CacheFanart(true); if (!strLocal.IsEmpty()) { CFileItemPtr itemLocal(new CFileItem("fanart://Local",false)); itemLocal->SetThumbnailImage(strLocal); itemLocal->SetLabel(g_localizeStrings.Get(20017)); items.Add(itemLocal); } if (CFile::Exists(cachedThumb)) { CFileItemPtr itemCurrent(new CFileItem("fanart://Current",false)); itemCurrent->SetThumbnailImage(cachedThumb); itemCurrent->SetLabel(g_localizeStrings.Get(20016)); items.Add(itemCurrent); } CFileItemPtr itemNone(new CFileItem("fanart://None", false)); itemNone->SetThumbnailImage("defaultVideoBig.png"); itemNone->SetLabel(g_localizeStrings.Get(20018)); items.Add(itemNone); CStdString result; VECSOURCES sources(g_settings.m_videoSources); g_mediaManager.GetLocalDrives(sources); bool flip=false; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, sources, g_localizeStrings.Get(20019), result, &flip) || result.Equals("fanart://Current")) return; // user cancelled if (CFile::Exists(cachedThumb)) CFile::Delete(cachedThumb); if (result.Equals("fanart://Local")) result = strLocal; if (result.Left(15) == "fanart://Remote") { int iFanart = atoi(result.Mid(15).c_str()); // set new primary fanart, and update our database accordingly m_movieItem->GetVideoInfoTag()->m_fanart.SetPrimaryFanart(iFanart); CVideoDatabase db; if (db.Open()) { db.UpdateFanart(*m_movieItem, GetContentType(m_movieItem.get())); db.Close(); } // download the fullres fanart image CStdString tempFile = "special://temp/fanart_download.jpg"; CAsyncFileCopy downloader; bool succeeded = downloader.Copy(m_movieItem->GetVideoInfoTag()->m_fanart.GetImageURL(), tempFile, g_localizeStrings.Get(13413)); if (succeeded) { CPicture pic; if (flip) pic.ConvertFile(tempFile, cachedThumb,0,1920,-1,100,true); else pic.CacheImage(tempFile, cachedThumb); } CFile::Delete(tempFile); if (!succeeded) return; // failed or cancelled download, so don't do anything } else if (CFile::Exists(result)) { // local file CPicture pic; if (flip) pic.ConvertFile(result, cachedThumb,0,1920,-1,100,true); else pic.CacheImage(result, cachedThumb); } CUtil::DeleteVideoDatabaseDirectoryCache(); // to get them new thumbs to show if (CFile::Exists(cachedThumb)) m_movieItem->SetProperty("fanart_image", cachedThumb); else m_movieItem->ClearProperty("fanart_image"); m_hasUpdatedThumb = true; // Update our screen Update(); }