X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cdbcd6c12f499b58f7d92904b45690912938a98f..3222fc18c9363f4339937bac1f92705ee6cfcd7c:/src/common/fileconf.cpp?ds=sidebyside diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp index ab3c4a0f49..09a66cf6b1 100644 --- a/src/common/fileconf.cpp +++ b/src/common/fileconf.cpp @@ -245,6 +245,7 @@ public: // get the last line belonging to an entry/subgroup of this group wxFileConfigLineList *GetGroupLine(); // line which contains [group] + // may be NULL for "/" only wxFileConfigLineList *GetLastEntryLine(); // after which our subgroups start wxFileConfigLineList *GetLastGroupLine(); // after which the next group starts @@ -372,7 +373,16 @@ void wxFileConfig::Init() } else { - wxLogWarning(_("can't open user configuration file '%s'."), m_fnLocalFile.GetFullPath().c_str() ); + const wxString path = m_fnLocalFile.GetFullPath(); + wxLogWarning(_("can't open user configuration file '%s'."), + path.c_str()); + + if ( m_fnLocalFile.FileExists() ) + { + wxLogWarning(_("Changes won't be saved to avoid overwriting the existing file \"%s\""), + path.c_str()); + m_fnLocalFile.Clear(); + } } } @@ -458,7 +468,7 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv) #if wxUSE_UNICODE size_t len; - cbuf = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen(), &len); + cbuf = conv.cMB2WC((char *)buf.GetData(), buf.GetDataLen() + 1, &len); if ( !len && buf.GetDataLen() ) { wxLogError(_("Failed to read config options.")); @@ -479,7 +489,8 @@ wxFileConfig::wxFileConfig(wxInputStream &inStream, const wxMBConv& conv) // notice that we throw away the original EOL kind here, maybe we // should preserve it? - memText.AddLine(wxString(s, e)); + if ( e != s ) + memText.AddLine(wxString(s, e)); if ( *e == '\0' ) break; @@ -540,16 +551,8 @@ void wxFileConfig::Parse(const wxTextBuffer& buffer, bool bLocal) // add the line to linked list if ( bLocal ) - { LineListAppend(strLine); - // let the root group have its start line as well - if ( !n ) - { - m_pCurrentGroup->SetLine(m_linesTail); - } - } - // skip leading spaces for ( pStart = buf; wxIsspace(*pStart); pStart++ ) @@ -917,7 +920,7 @@ bool wxFileConfig::DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const if ( !Read(key, &str) ) return false; - *buf = wxBase64Decode(str.ToAscii()); + *buf = wxBase64Decode(str); return true; } @@ -948,8 +951,8 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue) SetDirty(); - // this will add a line for this group if it didn't have it before - + // this will add a line for this group if it didn't have it before (or + // do nothing for the root but it's ok as it always exists anyhow) (void)m_pCurrentGroup->GetGroupLine(); } else @@ -1309,9 +1312,6 @@ void wxFileConfig::LineListRemove(wxFileConfigLineList *pLine) else pNext->SetPrev(pPrev); - if ( m_pRootGroup->GetGroupLine() == pLine ) - m_pRootGroup->SetLine(m_linesHead); - wxLogTrace( FILECONF_TRACE_MASK, _T(" head: %s"), ((m_linesHead) ? (const wxChar*)m_linesHead->Text().c_str() @@ -1800,29 +1800,21 @@ bool wxFileConfigGroup::DeleteEntry(const wxString& name) // our last entry is being deleted - find the last one which stays wxASSERT( m_pLine != NULL ); // if we have an entry with !NULL pLine... - // go back until we find another entry or reach the group's line + // find the previous entry (if any) wxFileConfigEntry *pNewLast = NULL; - size_t n, nEntries = m_aEntries.GetCount(); - wxFileConfigLineList *pl; - for ( pl = pLine->Prev(); pl != m_pLine; pl = pl->Prev() ) { - // is it our subgroup? - for ( n = 0; (pNewLast == NULL) && (n < nEntries); n++ ) { - if ( m_aEntries[n]->GetLine() == m_pLine ) - pNewLast = m_aEntries[n]; - } - - if ( pNewLast != NULL ) // found? + const wxFileConfigLineList * const + pNewLastLine = m_pLastEntry->GetLine()->Prev(); + const size_t nEntries = m_aEntries.GetCount(); + for ( size_t n = 0; n < nEntries; n++ ) { + if ( m_aEntries[n]->GetLine() == pNewLastLine ) { + pNewLast = m_aEntries[n]; break; + } } - if ( pl == m_pLine ) { - wxASSERT( !pNewLast ); // how comes it has the same line as we? - - // we've reached the group line without finding any subgroups - m_pLastEntry = NULL; - } - else - m_pLastEntry = pNewLast; + // pNewLast can be NULL here -- it's ok and can happen if we have no + // entries left + m_pLastEntry = pNewLast; } m_pConfig->LineListRemove(pLine);