bool CGUIDialogProfileSettings::ShowForProfile(unsigned int iProfile, bool firstLogin) { CProfilesManager &profileManager = CServiceBroker::GetProfileManager(); if (firstLogin && iProfile > profileManager.GetNumberOfProfiles()) return false; CGUIDialogProfileSettings *dialog = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogProfileSettings>(WINDOW_DIALOG_PROFILE_SETTINGS); if (dialog == NULL) return false; dialog->m_needsSaving = false; dialog->m_isDefault = iProfile == 0; dialog->m_showDetails = !firstLogin; const CProfile *profile = profileManager.GetProfile(iProfile); if (profile == NULL) { dialog->m_name.clear(); dialog->m_dbMode = 2; dialog->m_sourcesMode = 2; dialog->m_locks = CProfile::CLock(); bool bLock = profileManager.GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; dialog->m_locks.addonManager = bLock; dialog->m_locks.settings = (bLock) ? LOCK_LEVEL::ALL : LOCK_LEVEL::NONE; dialog->m_locks.files = bLock; dialog->m_directory.clear(); dialog->m_thumb.clear(); // prompt for a name std::string profileName; if (!CGUIKeyboardFactory::ShowAndGetInput(profileName, CVariant{g_localizeStrings.Get(20093)}, false) || profileName.empty()) return false; dialog->m_name = profileName; // create a default path std::string defaultDir = URIUtils::AddFileToFolder("profiles", CUtil::MakeLegalFileName(dialog->m_name)); URIUtils::AddSlashAtEnd(defaultDir); XFILE::CDirectory::Create(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); // prompt for the user to change it if they want std::string userDir = defaultDir; if (GetProfilePath(userDir, false)) // can't be the master user { if (!URIUtils::PathHasParent(userDir, defaultDir)) // user chose a different folder XFILE::CDirectory::Remove(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); } dialog->m_directory = userDir; dialog->m_needsSaving = true; } else { dialog->m_name = profile->getName(); dialog->m_thumb = profile->getThumb(); dialog->m_directory = profile->getDirectory(); dialog->m_dbMode = profile->canWriteDatabases() ? 0 : 1; if (profile->hasDatabases()) dialog->m_dbMode += 2; dialog->m_sourcesMode = profile->canWriteSources() ? 0 : 1; if (profile->hasSources()) dialog->m_sourcesMode += 2; dialog->m_locks = profile->GetLocks(); } dialog->Open(); if (dialog->m_needsSaving) { if (iProfile >= profileManager.GetNumberOfProfiles()) { if (dialog->m_name.empty() || dialog->m_directory.empty()) return false; /*std::string strLabel; strLabel.Format(g_localizeStrings.Get(20047),dialog->m_strName); if (!CGUIDialogYesNo::ShowAndGetInput(20058, strLabel, dialog->m_strDirectory, "")) { CDirectory::Remove(URIUtils::AddFileToFolder(profileManager.GetUserDataFolder(), dialog->m_strDirectory)); return false; }*/ // check for old profile settings CProfile profile(dialog->m_directory, dialog->m_name, profileManager.GetNextProfileId()); profileManager.AddProfile(profile); bool exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory, "guisettings.xml")); if (exists && !CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20104})) exists = false; if (!exists) { // copy masterprofile guisettings to new profile guisettings // If the user selects 'start fresh', do nothing as a fresh // guisettings.xml will be created on first profile use. if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20048}, CVariant{""}, CVariant{""}, CVariant{20044}, CVariant{20064})) { XFILE::CFile::Copy(URIUtils::AddFileToFolder("special://masterprofile/", "guisettings.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory, "guisettings.xml")); } } exists = XFILE::CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory, "sources.xml")); if (exists && !CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20106})) exists = false; if (!exists) { if ((dialog->m_sourcesMode & 2) == 2) // prompt user to copy masterprofile's sources.xml file // If 'start fresh' (no) is selected, do nothing. if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20058}, CVariant{20071}, CVariant{""}, CVariant{""}, CVariant{20044}, CVariant{20064})) { XFILE::CFile::Copy(URIUtils::AddFileToFolder("special://masterprofile/", "sources.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_directory, "sources.xml")); } } } /*if (!dialog->m_bIsNewUser) if (!CGUIDialogYesNo::ShowAndGetInput(20067, 20103)) return false;*/ CProfile *profile = profileManager.GetProfile(iProfile); assert(profile); profile->setName(dialog->m_name); profile->setDirectory(dialog->m_directory); profile->setThumb(dialog->m_thumb); profile->setWriteDatabases(!((dialog->m_dbMode & 1) == 1)); profile->setWriteSources(!((dialog->m_sourcesMode & 1) == 1)); profile->setDatabases((dialog->m_dbMode & 2) == 2); profile->setSources((dialog->m_sourcesMode & 2) == 2); profile->SetLocks(dialog->m_locks); profileManager.Save(); return true; } return dialog->m_needsSaving; }
bool CGUIDialogProfileSettings::ShowForProfile(unsigned int iProfile, bool firstLogin) { CGUIDialogProfileSettings *dialog = (CGUIDialogProfileSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_PROFILE_SETTINGS); if (!dialog) return false; if (iProfile == 0) dialog->m_bIsDefault = true; else dialog->m_bIsDefault = false; if (firstLogin && iProfile > CProfilesManager::Get().GetNumberOfProfiles()) return false; dialog->m_bNeedSave = false; dialog->m_bShowDetails = !firstLogin; dialog->SetProperty("heading", g_localizeStrings.Get(firstLogin ? 20255 : 20067)); const CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); if (!profile) { // defaults dialog->m_strName.Empty(); dialog->m_iDbMode = 2; dialog->m_iSourcesMode = 2; dialog->m_locks = CProfile::CLock(); bool bLock = CProfilesManager::Get().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE && !g_passwordManager.bMasterUser; dialog->m_locks.addonManager = bLock; dialog->m_locks.settings = (bLock) ? LOCK_LEVEL::ALL : LOCK_LEVEL::NONE; dialog->m_locks.files = bLock; dialog->m_strDirectory.Empty(); dialog->m_strThumb.Empty(); // prompt for a name if (!CGUIKeyboardFactory::ShowAndGetInput(dialog->m_strName,g_localizeStrings.Get(20093),false) || dialog->m_strName.IsEmpty()) return false; // create a default path CStdString defaultDir = URIUtils::AddFileToFolder("profiles",CUtil::MakeLegalFileName(dialog->m_strName)); URIUtils::AddSlashAtEnd(defaultDir); CDirectory::Create(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); // prompt for the user to change it if they want CStdString userDir = defaultDir; if (dialog->OnProfilePath(userDir, false)) // can't be the master user { if (userDir.Left(defaultDir.GetLength()) != defaultDir) // user chose a different folder CDirectory::Remove(URIUtils::AddFileToFolder("special://masterprofile/", defaultDir)); } dialog->m_strDirectory = userDir; dialog->m_bNeedSave = true; } else { dialog->m_strName = profile->getName(); dialog->m_strThumb = profile->getThumb(); dialog->m_strDirectory = profile->getDirectory(); dialog->m_iDbMode = profile->canWriteDatabases()?0:1; dialog->m_iSourcesMode = profile->canWriteSources()?0:1; if (profile->hasDatabases()) dialog->m_iDbMode += 2; if (profile->hasSources()) dialog->m_iSourcesMode += 2; dialog->m_locks = profile->GetLocks(); } dialog->DoModal(); if (dialog->m_bNeedSave) { if (iProfile >= CProfilesManager::Get().GetNumberOfProfiles()) { if (dialog->m_strName.IsEmpty() || dialog->m_strDirectory.IsEmpty()) return false; /*CStdString strLabel; strLabel.Format(g_localizeStrings.Get(20047),dialog->m_strName); if (!CGUIDialogYesNo::ShowAndGetInput(g_localizeStrings.Get(20058),strLabel,dialog->m_strDirectory,"")) { CDirectory::Remove(URIUtils::AddFileToFolder(CProfilesManager::Get().GetUserDataFolder(), dialog->m_strDirectory)); return false; }*/ // check for old profile settings CProfile profile(dialog->m_strDirectory, dialog->m_strName, CProfilesManager::Get().GetNextProfileId()); CProfilesManager::Get().AddProfile(profile); bool bExists = CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_strDirectory+"/guisettings.xml")); if (bExists) if (!CGUIDialogYesNo::ShowAndGetInput(20058,20104,20105,20022)) bExists = false; if (!bExists) { // save new profile guisettings if (CGUIDialogYesNo::ShowAndGetInput(20058,20048,20102,20022,20044,20064)) { CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/","guisettings.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_strDirectory+"/guisettings.xml")); } else { // create some new settings CStdString path = URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_strDirectory); path = URIUtils::AddFileToFolder(path, "guisettings.xml"); CSettings settings; settings.Initialize(); settings.Save(path); } } bExists = CFile::Exists(URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_strDirectory+"/sources.xml")); if (bExists) if (!CGUIDialogYesNo::ShowAndGetInput(20058,20106,20105,20022)) bExists = false; if (!bExists) { if ((dialog->m_iSourcesMode & 2) == 2) if (CGUIDialogYesNo::ShowAndGetInput(20058,20071,20102,20022,20044,20064)) { CFile::Cache(URIUtils::AddFileToFolder("special://masterprofile/","sources.xml"), URIUtils::AddFileToFolder("special://masterprofile/", dialog->m_strDirectory+"/sources.xml")); } } } /*if (!dialog->m_bIsNewUser) if (!CGUIDialogYesNo::ShowAndGetInput(20067,20103,20022,20022)) return false;*/ CProfile *profile = CProfilesManager::Get().GetProfile(iProfile); assert(profile); profile->setName(dialog->m_strName); profile->setDirectory(dialog->m_strDirectory); profile->setThumb(dialog->m_strThumb); profile->setWriteDatabases(!((dialog->m_iDbMode & 1) == 1)); profile->setWriteSources(!((dialog->m_iSourcesMode & 1) == 1)); profile->setDatabases((dialog->m_iDbMode & 2) == 2); profile->setSources((dialog->m_iSourcesMode & 2) == 2); profile->SetLocks(dialog->m_locks); CProfilesManager::Get().Save(); return true; } return !dialog->m_bNeedSave; }