///////////////////////////////////////////////////////////////////////////// // Name: configmanager.cpp // Purpose: // Author: Cesar Mauri Loba (cesar at crea-si dot com) // Modified by: // Created: // Copyright: (C) 2009 Cesar Mauri Loba - CREA Software Systems // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// #include "configmanager.h" #include #include #define DEFAULT_PROFILE_KEY _T("currentProfile") #define DEFAULT_PROFILE_GROUP_KEY _T("default") #define DEFAULT_PROFILE_NAME _("default") #define LANGUAGE_KEY _T("language") #define BASE_PATH _T("/settings") CConfigManager::CConfigManager(CConfigBase* configRoot) { assert (configRoot); m_configRoot= configRoot; m_currentProfile= DEFAULT_PROFILE_GROUP_KEY; wxConfigBase::Get()->SetPath (BASE_PATH); assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); } int CConfigManager::ReadLanguage() { wxString language; const wxLanguageInfo *info= NULL; assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); // Load language name wxConfigBase::Get()->Read(LANGUAGE_KEY, &language); if (language.Length()> 0) { // Check if valid info= wxLocale::FindLanguageInfo (language); if (info) { // Ok return info->Language; } } return wxLANGUAGE_DEFAULT; } void CConfigManager::WriteLanguage (const int id) { assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); // Assumes a valid language id if (id== wxLANGUAGE_DEFAULT) { wxConfigBase::Get()->DeleteEntry (LANGUAGE_KEY); } else { const wxLanguageInfo *info= wxLocale::GetLanguageInfo(id); assert (info); wxConfigBase::Get()->Write (LANGUAGE_KEY, info->Description); } } void CConfigManager::ReadAll () { wxConfigBase* pConfObj= wxConfigBase::Get(); pConfObj->Read(DEFAULT_PROFILE_KEY, &m_currentProfile); // If current profile doesn't exists set to default if (!pConfObj->HasGroup(m_currentProfile)) m_currentProfile= DEFAULT_PROFILE_GROUP_KEY; // App wide data m_configRoot->ReadAppData (pConfObj); // Profile related data if (m_currentProfile.Length()== 0) pConfObj->SetPath (DEFAULT_PROFILE_GROUP_KEY); else pConfObj->SetPath (m_currentProfile); m_configRoot->ReadProfileData (pConfObj); pConfObj->SetPath (_T("..")); assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); } void CConfigManager::WriteAll() { assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); wxConfigBase* pConfObj= wxConfigBase::Get(); // App wide data pConfObj->Write(DEFAULT_PROFILE_KEY, m_currentProfile); m_configRoot->WriteAppData (pConfObj); // Profile related data if (m_currentProfile.Length()== 0) pConfObj->SetPath (DEFAULT_PROFILE_GROUP_KEY); else pConfObj->SetPath (m_currentProfile); m_configRoot->WriteProfileData (pConfObj); pConfObj->SetPath (_T("..")); pConfObj->Flush(); assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); } int CConfigManager::GetCurrentProfile() const { if (m_currentProfile== DEFAULT_PROFILE_GROUP_KEY) return 0; wxArrayString pList= GetProfileList (); int index= pList.Index (m_currentProfile); assert (index> 0 && index!= wxNOT_FOUND); return index; } void CConfigManager::ChangeCurrentProfile(int index) { assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); if (index!= GetCurrentProfile()) { if (index== 0) m_currentProfile= DEFAULT_PROFILE_GROUP_KEY; else { wxArrayString pList= GetProfileList (); assert (index>0 && index< (int) pList.GetCount()); m_currentProfile= pList[index]; } // Save new profile before reading again wxConfigBase* pConfObj= wxConfigBase::Get(); pConfObj->Write(DEFAULT_PROFILE_KEY, m_currentProfile); pConfObj->Flush(); ReadAll (); } assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); } // Return 0 is ok, 1 if profile exists or 2 if profile name is invalid int CConfigManager::AddNewProfile(const wxString& name) { assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); if (name== DEFAULT_PROFILE_GROUP_KEY) return 2; if (name== DEFAULT_PROFILE_KEY) return 2; if (name== DEFAULT_PROFILE_NAME) return 2; if (name.Contains(_T("/"))) return 2; if (name.Contains(_T("\\"))) return 2; // Check existence wxConfigBase* pConfObj= wxConfigBase::Get(); if (pConfObj->HasGroup(name)) return 1; // Add the new profile and change to m_currentProfile= name; WriteAll(); assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); return 0; } void CConfigManager::DeleteCurrentProfile() { assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); // Default profile deletion not allowed if (m_currentProfile!= DEFAULT_PROFILE_GROUP_KEY) { wxString oldProfile= m_currentProfile; // Switch to default profile ChangeCurrentProfile(0); // Delete old profile wxConfigBase* pConfObj= wxConfigBase::Get(); pConfObj->DeleteGroup(oldProfile); pConfObj->Flush(); } assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); } wxArrayString CConfigManager::GetProfileList () const { wxArrayString pList; wxConfigBase* pConfObj= wxConfigBase::Get(); wxString str; long dummy; assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); // Add default profile name (is always id=0) pList.Add (DEFAULT_PROFILE_NAME); bool bCont = pConfObj->GetFirstGroup(str, dummy); while (bCont) { // FIXME: this condition ensures that: // 1) the default entry is not already added to the list // 2) another entry in the parent directory called "wxWidgets" // is not added to the list. This only happens with wxConfigFile // and it looks like a wxConfigFile bug if (str!= DEFAULT_PROFILE_GROUP_KEY && str!= _T("wxWidgets")) pList.Add (str); bCont = pConfObj->GetNextGroup(str, dummy); } assert (wxConfigBase::Get()->GetPath().Cmp(BASE_PATH)== 0); return pList; }