X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/550343399aa1355469ffed72c8cf84c732dcf98b..467e04791c0d5914dc8ed8e535af607f7fc1dfe1:/src/common/fileconf.cpp diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index 022a830255..1b0eb091a3 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -287,7 +287,7 @@ wxString wxFileConfig::GetGlobalDir() #elif defined(__DOS__) // There's no such thing as global cfg dir in MS-DOS, let's return // current directory (FIXME_MGL?) - return wxT(".\\"); + strDir = wxT(".\\"); #elif defined(__WXWINCE__) strDir = wxT("\\Windows\\"); #else // Windows @@ -308,18 +308,22 @@ wxString wxFileConfig::GetLocalDir() #if defined(__WXMAC__) || defined(__DOS__) // no local dir concept on Mac OS 9 or MS-DOS - return GetGlobalDir() ; + strDir << GetGlobalDir() ; #else wxGetHomeDir(&strDir); -#ifdef __UNIX__ -#ifdef __VMS - if (strDir.Last() != wxT(']')) -#endif - if (strDir.Last() != wxT('/')) strDir << wxT('/'); -#else - if (strDir.Last() != wxT('\\')) strDir << wxT('\\'); -#endif + #ifdef __UNIX__ + if ( + (strDir.Last() != wxT('/')) + #ifdef __VMS + && (strDir.Last() != wxT(']')) + #endif + ) + strDir << wxT('/'); + #else + if (strDir.Last() != wxT('\\')) + strDir << wxT('\\'); + #endif #endif return strDir; @@ -390,7 +394,7 @@ void wxFileConfig::Init() { wxTextFile fileGlobal(m_strGlobalFile); - if ( fileGlobal.Open(m_conv/*ignored in ANSI build*/) ) + if ( fileGlobal.Open(*m_conv/*ignored in ANSI build*/) ) { Parse(fileGlobal, false /* global */); SetRootPath(); @@ -405,7 +409,7 @@ void wxFileConfig::Init() if ( !m_strLocalFile.empty() && wxFile::Exists(m_strLocalFile) ) { wxTextFile fileLocal(m_strLocalFile); - if ( fileLocal.Open(m_conv/*ignored in ANSI build*/) ) + if ( fileLocal.Open(*m_conv/*ignored in ANSI build*/) ) { Parse(fileLocal, true /* local */); SetRootPath(); @@ -422,12 +426,13 @@ void wxFileConfig::Init() // constructor supports creation of wxFileConfig objects of any type wxFileConfig::wxFileConfig(const wxString& appName, const wxString& vendorName, const wxString& strLocal, const wxString& strGlobal, - long style, wxMBConv& conv) + long style, + const wxMBConv& conv) : wxConfigBase(::GetAppName(appName), vendorName, strLocal, strGlobal, style), m_strLocalFile(strLocal), m_strGlobalFile(strGlobal), - m_conv(conv) + m_conv(conv.Clone()) { // Make up names for files if empty if ( m_strLocalFile.empty() && (style & wxCONFIG_USE_LOCAL_FILE) ) @@ -470,8 +475,8 @@ wxFileConfig::wxFileConfig(const wxString& appName, const wxString& vendorName, #if wxUSE_STREAMS -wxFileConfig::wxFileConfig(wxInputStream &inStream, wxMBConv& conv) - : m_conv(conv) +wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv) + : m_conv(conv.Clone()) { // always local_file when this constructor is called (?) SetStyle(GetStyle() | wxCONFIG_USE_LOCAL_FILE); @@ -551,21 +556,21 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, wxMBConv& conv) void wxFileConfig::CleanUp() { - delete m_pRootGroup; + delete m_pRootGroup; - wxFileConfigLineList *pCur = m_linesHead; - while ( pCur != NULL ) { - wxFileConfigLineList *pNext = pCur->Next(); - delete pCur; - pCur = pNext; - } + wxFileConfigLineList *pCur = m_linesHead; + while ( pCur != NULL ) { + wxFileConfigLineList *pNext = pCur->Next(); + delete pCur; + pCur = pNext; + } } wxFileConfig::~wxFileConfig() { - Flush(); + Flush(); - CleanUp(); + CleanUp(); } // ---------------------------------------------------------------------------- @@ -738,59 +743,59 @@ void wxFileConfig::Parse(const wxTextBuffer& buffer, bool bLocal) void wxFileConfig::SetRootPath() { - m_strPath.Empty(); - m_pCurrentGroup = m_pRootGroup; + m_strPath.Empty(); + m_pCurrentGroup = m_pRootGroup; } bool wxFileConfig::DoSetPath(const wxString& strPath, bool createMissingComponents) { - wxArrayString aParts; + wxArrayString aParts; - if ( strPath.empty() ) { - SetRootPath(); - return true; - } + if ( strPath.empty() ) { + SetRootPath(); + return true; + } - if ( strPath[0] == wxCONFIG_PATH_SEPARATOR ) { - // absolute path - wxSplitPath(aParts, strPath); - } - else { - // relative path, combine with current one - wxString strFullPath = m_strPath; - strFullPath << wxCONFIG_PATH_SEPARATOR << strPath; - wxSplitPath(aParts, strFullPath); - } + if ( strPath[0] == wxCONFIG_PATH_SEPARATOR ) { + // absolute path + wxSplitPath(aParts, strPath); + } + else { + // relative path, combine with current one + wxString strFullPath = m_strPath; + strFullPath << wxCONFIG_PATH_SEPARATOR << strPath; + wxSplitPath(aParts, strFullPath); + } - // change current group - size_t n; - m_pCurrentGroup = m_pRootGroup; - for ( n = 0; n < aParts.Count(); n++ ) { - wxFileConfigGroup *pNextGroup = m_pCurrentGroup->FindSubgroup(aParts[n]); - if ( pNextGroup == NULL ) - { - if ( !createMissingComponents ) - return false; + // change current group + size_t n; + m_pCurrentGroup = m_pRootGroup; + for ( n = 0; n < aParts.Count(); n++ ) { + wxFileConfigGroup *pNextGroup = m_pCurrentGroup->FindSubgroup(aParts[n]); + if ( pNextGroup == NULL ) + { + if ( !createMissingComponents ) + return false; - pNextGroup = m_pCurrentGroup->AddSubgroup(aParts[n]); - } + pNextGroup = m_pCurrentGroup->AddSubgroup(aParts[n]); + } - m_pCurrentGroup = pNextGroup; - } + m_pCurrentGroup = pNextGroup; + } - // recombine path parts in one variable - m_strPath.Empty(); - for ( n = 0; n < aParts.Count(); n++ ) { - m_strPath << wxCONFIG_PATH_SEPARATOR << aParts[n]; - } + // recombine path parts in one variable + m_strPath.Empty(); + for ( n = 0; n < aParts.Count(); n++ ) { + m_strPath << wxCONFIG_PATH_SEPARATOR << aParts[n]; + } - return true; + return true; } void wxFileConfig::SetPath(const wxString& strPath) { - DoSetPath(strPath, true /* create missing path components */); + DoSetPath(strPath, true /* create missing path components */); } // ---------------------------------------------------------------------------- @@ -799,66 +804,66 @@ void wxFileConfig::SetPath(const wxString& strPath) bool wxFileConfig::GetFirstGroup(wxString& str, long& lIndex) const { - lIndex = 0; - return GetNextGroup(str, lIndex); + lIndex = 0; + return GetNextGroup(str, lIndex); } bool wxFileConfig::GetNextGroup (wxString& str, long& lIndex) const { - if ( size_t(lIndex) < m_pCurrentGroup->Groups().Count() ) { - str = m_pCurrentGroup->Groups()[(size_t)lIndex++]->Name(); - return true; - } - else - return false; + if ( size_t(lIndex) < m_pCurrentGroup->Groups().Count() ) { + str = m_pCurrentGroup->Groups()[(size_t)lIndex++]->Name(); + return true; + } + else + return false; } bool wxFileConfig::GetFirstEntry(wxString& str, long& lIndex) const { - lIndex = 0; - return GetNextEntry(str, lIndex); + lIndex = 0; + return GetNextEntry(str, lIndex); } bool wxFileConfig::GetNextEntry (wxString& str, long& lIndex) const { - if ( size_t(lIndex) < m_pCurrentGroup->Entries().Count() ) { - str = m_pCurrentGroup->Entries()[(size_t)lIndex++]->Name(); - return true; - } - else - return false; + if ( size_t(lIndex) < m_pCurrentGroup->Entries().Count() ) { + str = m_pCurrentGroup->Entries()[(size_t)lIndex++]->Name(); + return true; + } + else + return false; } size_t wxFileConfig::GetNumberOfEntries(bool bRecursive) const { - size_t n = m_pCurrentGroup->Entries().Count(); - if ( bRecursive ) { - wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; - size_t nSubgroups = m_pCurrentGroup->Groups().Count(); - for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { - CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; - n += GetNumberOfEntries(true); - CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + size_t n = m_pCurrentGroup->Entries().Count(); + if ( bRecursive ) { + wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + size_t nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfEntries(true); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } } - } - return n; + return n; } size_t wxFileConfig::GetNumberOfGroups(bool bRecursive) const { - size_t n = m_pCurrentGroup->Groups().Count(); - if ( bRecursive ) { - wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; - size_t nSubgroups = m_pCurrentGroup->Groups().Count(); - for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { - CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; - n += GetNumberOfGroups(true); - CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + size_t n = m_pCurrentGroup->Groups().Count(); + if ( bRecursive ) { + wxFileConfigGroup *pOldCurrentGroup = m_pCurrentGroup; + size_t nSubgroups = m_pCurrentGroup->Groups().Count(); + for ( size_t nGroup = 0; nGroup < nSubgroups; nGroup++ ) { + CONST_CAST m_pCurrentGroup = m_pCurrentGroup->Groups()[nGroup]; + n += GetNumberOfGroups(true); + CONST_CAST m_pCurrentGroup = pOldCurrentGroup; + } } - } - return n; + return n; } // ---------------------------------------------------------------------------- @@ -867,28 +872,28 @@ size_t wxFileConfig::GetNumberOfGroups(bool bRecursive) const bool wxFileConfig::HasGroup(const wxString& strName) const { - // special case: DoSetPath("") does work as it's equivalent to DoSetPath("/") - // but there is no group with empty name so treat this separately - if ( strName.empty() ) - return false; + // special case: DoSetPath("") does work as it's equivalent to DoSetPath("/") + // but there is no group with empty name so treat this separately + if ( strName.empty() ) + return false; - const wxString pathOld = GetPath(); + const wxString pathOld = GetPath(); - wxFileConfig *self = wx_const_cast(wxFileConfig *, this); - const bool - rc = self->DoSetPath(strName, false /* don't create missing components */); + wxFileConfig *self = wx_const_cast(wxFileConfig *, this); + const bool + rc = self->DoSetPath(strName, false /* don't create missing components */); - self->SetPath(pathOld); + self->SetPath(pathOld); - return rc; + return rc; } bool wxFileConfig::HasEntry(const wxString& strName) const { - wxConfigPathChanger path(this, strName); + wxConfigPathChanger path(this, strName); - wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); - return pEntry != NULL; + wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); + return pEntry != NULL; } // ---------------------------------------------------------------------------- @@ -897,16 +902,16 @@ bool wxFileConfig::HasEntry(const wxString& strName) const bool wxFileConfig::DoReadString(const wxString& key, wxString* pStr) const { - wxConfigPathChanger path(this, key); + wxConfigPathChanger path(this, key); - wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); - if (pEntry == NULL) { - return false; - } + wxFileConfigEntry *pEntry = m_pCurrentGroup->FindEntry(path.Name()); + if (pEntry == NULL) { + return false; + } - *pStr = pEntry->Value(); + *pStr = pEntry->Value(); - return true; + return true; } bool wxFileConfig::DoReadLong(const wxString& key, long *pl) const @@ -1007,7 +1012,7 @@ bool wxFileConfig::Flush(bool /* bCurrentOnly */) { wxString line = p->Text(); line += wxTextFile::GetEOL(); - if ( !file.Write(line, m_conv) ) + if ( !file.Write(line, *m_conv) ) { wxLogError(_("can't write user configuration file.")); return false; @@ -1032,7 +1037,7 @@ bool wxFileConfig::Flush(bool /* bCurrentOnly */) #if wxUSE_STREAMS -bool wxFileConfig::Save(wxOutputStream& os, wxMBConv& conv) +bool wxFileConfig::Save(wxOutputStream& os, const wxMBConv& conv) { // save unconditionally, even if not dirty for ( wxFileConfigLineList *p = m_linesHead; p != NULL; p = p->Next() ) @@ -1156,9 +1161,6 @@ bool wxFileConfig::DeleteAll() m_strLocalFile.c_str()); return false; } - - m_strLocalFile = - m_strGlobalFile = wxEmptyString; } Init(); @@ -2026,8 +2028,11 @@ static wxString FilterInEntryName(const wxString& str) strResult.Alloc(str.Len()); for ( const wxChar *pc = str.c_str(); *pc != '\0'; pc++ ) { - if ( *pc == wxT('\\') ) - pc++; + if ( *pc == wxT('\\') ) { + // we need to test it here or we'd skip past the NUL in the loop line + if ( *++pc == _T('\0') ) + break; + } strResult += *pc; }