///////////////////////////////////////////////////////////////////////////////
// Name: config.cpp
-// Purpose: implementation of wxConfig class
+// Purpose: implementation of wxConfigBase class
// Author: Vadim Zeitlin
// Modified by:
// Created: 07.04.98
#include <wx/textfile.h>
#include <wx/config.h>
-// we must include (one of) these files for wxConfig::Create
+// we must include (one of) these files for wxConfigBase::Create
#if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
#ifdef __WIN32__
#include <wx/msw/regconf.h>
// global and class static variables
// ----------------------------------------------------------------------------
-wxConfig *wxConfig::ms_pConfig = NULL;
+wxConfigBase *wxConfigBase::ms_pConfig = NULL;
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
-// wxConfig
+// wxConfigBase
// ----------------------------------------------------------------------------
-wxConfig *wxConfig::Set(wxConfig *pConfig)
+wxConfigBase *wxConfigBase::Set(wxConfigBase *pConfig)
{
- wxConfig *pOld = ms_pConfig;
+ wxConfigBase *pOld = ms_pConfig;
ms_pConfig = pConfig;
return pOld;
}
-wxConfig *wxConfig::Create()
+wxConfigBase *wxConfigBase::Create()
{
return ms_pConfig =
-#if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
- #ifdef __WIN32__
- new wxRegConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
- #else //WIN16
- #error "Sorry, no wxIniConfig yet..."
- //new wxIniConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+ #if defined(__MSWIN__) && defined(wxCONFIG_WIN32_NATIVE)
+ #ifdef __WIN32__
+ new wxRegConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+ #else //WIN16
+ #error "Sorry, no wxIniConfig yet..."
+ //new wxIniConfig(wxTheApp->GetAppName(), wxTheApp->GetVendorName());
+ #endif
+ #else // either we're under Unix or wish to use files even under Windows
+ new wxFileConfig(wxTheApp->GetAppName());
#endif
-#else // either we're under Unix or wish to use files even under Windows
- new wxFileConfig(wxTheApp->GetAppName());
-#endif
}
-const char *wxConfig::Read(const char *szKey, const char *szDefault) const
+const char *wxConfigBase::Read(const char *szKey, const char *szDefault) const
{
static char s_szBuf[1024];
wxString s;
// Config::PathChanger
// ----------------------------------------------------------------------------
-wxConfig::PathChanger::PathChanger(const wxConfig *pContainer,
+wxConfigBase::PathChanger::PathChanger(const wxConfigBase *pContainer,
const wxString& strEntry)
{
- m_pContainer = (wxConfig *)pContainer;
+ m_pContainer = (wxConfigBase *)pContainer;
wxString strPath = strEntry.Before(wxCONFIG_PATH_SEPARATOR);
// special case of "/keyname" when there is nothing before "/"
}
}
-wxConfig::PathChanger::~PathChanger()
+wxConfigBase::PathChanger::~PathChanger()
{
// only restore path if it was changed
if ( m_bChanged ) {
str << szFile;
#ifdef __WXMSW__
- str << ".ini";
+ if ( strchr(szFile, '.') == NULL )
+ str << ".ini";
#endif
return str;
// enumeration
// ----------------------------------------------------------------------------
-bool wxFileConfig::GetFirstGroup(wxString& str, long& lIndex)
+bool wxFileConfig::GetFirstGroup(wxString& str, long& lIndex) const
{
lIndex = 0;
return GetNextGroup(str, lIndex);
}
-bool wxFileConfig::GetNextGroup (wxString& str, long& lIndex)
+bool wxFileConfig::GetNextGroup (wxString& str, long& lIndex) const
{
if ( uint(lIndex) < m_pCurrentGroup->Groups().Count() ) {
str = m_pCurrentGroup->Groups()[lIndex++]->Name();
return FALSE;
}
-bool wxFileConfig::GetFirstEntry(wxString& str, long& lIndex)
+bool wxFileConfig::GetFirstEntry(wxString& str, long& lIndex) const
{
lIndex = 0;
return GetNextEntry(str, lIndex);
}
-bool wxFileConfig::GetNextEntry (wxString& str, long& lIndex)
+bool wxFileConfig::GetNextEntry (wxString& str, long& lIndex) const
{
if ( uint(lIndex) < m_pCurrentGroup->Entries().Count() ) {
str = m_pCurrentGroup->Entries()[lIndex++]->Name();
if ( m_pCurrentGroup != m_pRootGroup ) {
ConfigGroup *pGroup = m_pCurrentGroup;
SetPath(".."); // changes m_pCurrentGroup!
- m_pCurrentGroup->DeleteSubgroup(pGroup->Name());
+ m_pCurrentGroup->DeleteSubgroupByName(pGroup->Name());
}
//else: never delete the root group
}
{
PathChanger path(this, szKey);
- return m_pCurrentGroup->DeleteSubgroup(path.Name());
+ return m_pCurrentGroup->DeleteSubgroupByName(path.Name());
}
bool wxFileConfig::DeleteAll()
delete several of them.
*/
-bool wxFileConfig::ConfigGroup::DeleteSubgroup(const char *szName)
+bool wxFileConfig::ConfigGroup::DeleteSubgroupByName(const char *szName)
+{
+ return DeleteSubgroup(FindSubgroup(szName));
+}
+
+// doesn't delete the subgroup itself, but does remove references to it from
+// all other data structures (and normally the returned pointer should be
+// deleted a.s.a.p. because there is nothing much to be done with it anyhow)
+bool wxFileConfig::ConfigGroup::DeleteSubgroup(ConfigGroup *pGroup)
{
- ConfigGroup *pGroup = FindSubgroup(szName);
wxCHECK( pGroup != NULL, FALSE ); // deleting non existing group?
// delete all entries
m_pConfig->LineListRemove(pLine);
}
+ // and subgroups of this sungroup
+ nCount = pGroup->m_aSubgroups.Count();
+ for ( uint nGroup = 0; nGroup < nCount; nGroup++ ) {
+ pGroup->DeleteSubgroup(pGroup->m_aSubgroups[nGroup]);
+ }
+
LineList *pLine = pGroup->m_pLine;
if ( pLine != NULL ) {
// notice that we may do this test inside the previous "if" because the