void ThemeChooser::Init(void) { QString curTheme = gCoreContext->GetSetting("Theme"); ThemeInfo *themeinfo = NULL; ThemeInfo *curThemeInfo = NULL; MythUIButtonListItem *item = NULL; m_themes->Reset(); for( QFileInfoList::iterator it = m_infoList.begin(); it != m_infoList.end(); ++it ) { QFileInfo &theme = *it; if (!m_themeFileNameInfos.contains(theme.filePath())) continue; themeinfo = m_themeFileNameInfos[theme.filePath()]; if (!themeinfo) continue; QString buttonText = QString("%1 %2.%3") .arg(themeinfo->GetName()) .arg(themeinfo->GetMajorVersion()) .arg(themeinfo->GetMinorVersion()); item = new MythUIButtonListItem(m_themes, buttonText); if (item) { if (themeinfo->GetDownloadURL().isEmpty()) item->DisplayState("local", "themelocation"); else item->DisplayState("remote", "themelocation"); item->DisplayState(themeinfo->GetAspect(), "aspectstate"); item->DisplayState(m_themeStatuses[themeinfo->GetName()], "themestatus"); QHash<QString, QString> infomap; themeinfo->ToMap(infomap); item->SetTextFromMap(infomap); item->SetData(qVariantFromValue(themeinfo)); QString thumbnail = themeinfo->GetPreviewPath(); QFileInfo fInfo(thumbnail); // Downloadable themeinfos have thumbnail copies of their preview images if (!themeinfo->GetDownloadURL().isEmpty()) thumbnail = thumbnail.append(".thumb.jpg"); item->SetImage(thumbnail); if (curTheme == themeinfo->GetDirectoryName()) curThemeInfo = themeinfo; } else delete item; } SetFocusWidget(m_themes); if (curThemeInfo) m_themes->SetValueByData(qVariantFromValue(curThemeInfo)); MythUIButtonListItem *current = m_themes->GetItemCurrent(); if (current) itemChanged(current); }
void ThemeUpdateChecker::checkForUpdate(void) { if (GetMythUI()->GetCurrentLocation(false, true) != "mainmenu") return; if (RemoteFile::Exists(m_infoPackage)) { QString remoteThemeDir = gCoreContext->GenMythURL(gCoreContext->GetSetting("MasterServerIP"), 0, QString("%1/%2").arg(m_mythVersion).arg(GetMythUI()->GetThemeName()), "Temp"); QString infoXML = remoteThemeDir; infoXML.append("/themeinfo.xml"); if (RemoteFile::Exists(infoXML)) { ThemeInfo *remoteTheme = new ThemeInfo(remoteThemeDir); if (!remoteTheme) { LOG(VB_GENERAL, LOG_ERR, QString("ThemeUpdateChecker::checkForUpdate(): " "Unable to create ThemeInfo for %1") .arg(infoXML)); return; } ThemeInfo *localTheme = new ThemeInfo(GetMythUI()->GetThemeDir()); if (!localTheme) { LOG(VB_GENERAL, LOG_ERR, "ThemeUpdateChecker::checkForUpdate(): " "Unable to create ThemeInfo for current theme"); return; } int rmtMaj = remoteTheme->GetMajorVersion(); int rmtMin = remoteTheme->GetMinorVersion(); int locMaj = localTheme->GetMajorVersion(); int locMin = localTheme->GetMinorVersion(); if ((rmtMaj > locMaj) || ((rmtMaj == locMaj) && (rmtMin > locMin))) { m_lastKnownThemeVersion = QString("%1-%2.%3").arg(GetMythUI()->GetThemeName()) .arg(rmtMaj).arg(rmtMin); QString status = gCoreContext->GetSetting("ThemeUpdateStatus"); QString currentLocation = GetMythUI()->GetCurrentLocation(false, true); if ((!status.startsWith(m_lastKnownThemeVersion)) && (currentLocation == "mainmenu")) { m_currentVersion = QString("%1.%2").arg(locMaj).arg(locMin); m_newVersion = QString("%1.%2").arg(rmtMaj).arg(rmtMin); gCoreContext->SaveSetting("ThemeUpdateStatus", m_lastKnownThemeVersion + " notified"); QString message = tr("Version %1 of the %2 theme is now " "available in the Theme Chooser. The " "currently installed version is %3.") .arg(m_newVersion) .arg(GetMythUI()->GetThemeName()) .arg(m_currentVersion); ShowOkPopup(message); } } delete remoteTheme; delete localTheme; } } }
void ThemeChooser::Load(void) { SetBusyPopupMessage(tr("Loading Installed Themes")); QString MythVersion = MYTH_SOURCE_PATH; QStringList themesSeen; QDir themes(GetConfDir() + "/themes"); themes.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); themes.setSorting(QDir::Name | QDir::IgnoreCase); // FIXME: For now, treat git master the same as svn trunk if (MythVersion == "master") MythVersion = "trunk"; if (MythVersion != "trunk") { MythVersion = MYTH_BINARY_VERSION; // Example: 0.25.20101017-1 MythVersion.replace(QRegExp("\\.[0-9]{8,}.*"), ""); } m_infoList = themes.entryInfoList(); for( QFileInfoList::iterator it = m_infoList.begin(); it != m_infoList.end(); ++it ) { if (loadThemeInfo(*it)) { themesSeen << (*it).fileName(); m_themeStatuses[(*it).fileName()] = "default"; } } themes.setPath(GetThemesParentDir()); QFileInfoList sharedThemes = themes.entryInfoList(); for( QFileInfoList::iterator it = sharedThemes.begin(); it != sharedThemes.end(); ++it ) { if ((!themesSeen.contains((*it).fileName())) && (loadThemeInfo(*it))) { m_infoList << *it; themesSeen << (*it).fileName(); m_themeStatuses[(*it).fileName()] = "default"; } } QString remoteThemesFile = GetConfDir(); remoteThemesFile.append("/tmp/themes.zip"); QString themeSite = QString("%1/%2") .arg(gCoreContext->GetSetting("ThemeRepositoryURL", "http://themes.mythtv.org/themes/repository")).arg(MythVersion); int downloadFailures = gCoreContext->GetNumSetting("ThemeInfoDownloadFailures", 0); if (QFile::exists(remoteThemesFile)) { QFileInfo finfo(remoteThemesFile); if (finfo.lastModified() < mythCurrentDateTime().addSecs(-600)) { LOG(VB_GUI, LOG_INFO, LOC + QString("%1 is over 10 minutes old, forcing " "remote theme list download").arg(remoteThemesFile)); m_refreshDownloadableThemes = true; } } else if (downloadFailures < 2) // (and themes.zip does not exist) { LOG(VB_GUI, LOG_INFO, LOC + QString("%1 does not exist, forcing remote theme " "list download").arg(remoteThemesFile)); m_refreshDownloadableThemes = true; } if (m_refreshDownloadableThemes) { SetBusyPopupMessage(tr("Refreshing Downloadable Themes Information")); QString url = themeSite; url.append("/themes.zip"); QString destdir = GetMythUI()->GetThemeCacheDir(); destdir.append("/themechooser"); QString versiondir = QString("%1/%2").arg(destdir).arg(MythVersion); removeThemeDir(versiondir); QDir dir; dir.mkpath(destdir); bool result = GetMythDownloadManager()->download(url, remoteThemesFile); SetBusyPopupMessage(tr("Extracting Downloadable Themes Information")); if (!result || !extractZIP(remoteThemesFile, destdir)) { QFile::remove(remoteThemesFile); downloadFailures++; gCoreContext->SaveSetting("ThemeInfoDownloadFailures", downloadFailures); } } QDir remoteThemesDir(GetMythUI()->GetThemeCacheDir() .append("/themechooser/").append(MythVersion)); if ((QFile::exists(remoteThemesFile)) && (remoteThemesDir.exists())) { SetBusyPopupMessage(tr("Loading Downloadable Themes")); LOG(VB_GUI, LOG_INFO, LOC + QString("%1 and %2 exist, using cached remote themes list") .arg(remoteThemesFile).arg(remoteThemesDir.absolutePath())); QString themesPath = remoteThemesDir.absolutePath(); themes.setPath(themesPath); QFileInfoList downloadableThemes = themes.entryInfoList(); for( QFileInfoList::iterator it = downloadableThemes.begin(); it != downloadableThemes.end(); ++it ) { QString dirName = (*it).fileName(); QString themeName = dirName; QString remoteDir = themeSite; remoteDir.append("/").append(dirName); QString localDir = themes.absolutePath(); localDir.append("/").append(dirName); if (themesSeen.contains(dirName)) { ThemeInfo remoteTheme((*it).absoluteFilePath()); ThemeInfo *localTheme = m_themeNameInfos[dirName]; themeName = remoteTheme.GetName(); int rmtMaj = remoteTheme.GetMajorVersion(); int rmtMin = remoteTheme.GetMinorVersion(); int locMaj = localTheme->GetMajorVersion(); int locMin = localTheme->GetMinorVersion(); if ((rmtMaj > locMaj) || ((rmtMaj == locMaj) && (rmtMin > locMin))) { if (loadThemeInfo(*it)) { m_infoList << *it; m_themeStatuses[themeName] = "updateavailable"; QFileInfo finfo(remoteTheme.GetPreviewPath()); GetMythDownloadManager()->queueDownload( remoteDir.append("/").append(finfo.fileName()), localDir.append("/").append(finfo.fileName()), NULL); } } else if ((rmtMaj == locMaj) && (rmtMin == locMin)) { m_themeStatuses[themeName] = "uptodate"; } } else { ThemeInfo *remoteTheme = loadThemeInfo(*it); if (remoteTheme) { themeName = remoteTheme->GetName(); themesSeen << dirName; m_infoList << *it; m_themeStatuses[themeName] = "updateavailable"; QFileInfo finfo(remoteTheme->GetPreviewPath()); GetMythDownloadManager()->queueDownload( remoteDir.append("/").append(finfo.fileName()), localDir.append("/").append(finfo.fileName()), NULL); } } } } ResetBusyPopup(); qSort(m_infoList.begin(), m_infoList.end(), sortThemeNames); }