fixed deletion of last group in the config file (bugs 849088 and 902147)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29642 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -75,6 +75,8 @@
|
|||||||
#define MAX_PATH 512
|
#define MAX_PATH 512
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define FILECONF_TRACE_MASK _T("fileconf")
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global functions declarations
|
// global functions declarations
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -891,7 +893,7 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue)
|
|||||||
wxConfigPathChanger path(this, key);
|
wxConfigPathChanger path(this, key);
|
||||||
wxString strName = path.Name();
|
wxString strName = path.Name();
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Writing String '%s' = '%s' to Group '%s'"),
|
_T(" Writing String '%s' = '%s' to Group '%s'"),
|
||||||
strName.c_str(),
|
strName.c_str(),
|
||||||
szValue.c_str(),
|
szValue.c_str(),
|
||||||
@@ -905,7 +907,7 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue)
|
|||||||
|
|
||||||
// ... except if it's empty in which case it's a way to force it's creation
|
// ... except if it's empty in which case it's a way to force it's creation
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Creating group %s"),
|
_T(" Creating group %s"),
|
||||||
m_pCurrentGroup->Name().c_str() );
|
m_pCurrentGroup->Name().c_str() );
|
||||||
|
|
||||||
@@ -929,13 +931,13 @@ bool wxFileConfig::DoWriteString(const wxString& key, const wxString& szValue)
|
|||||||
|
|
||||||
if ( pEntry == 0 )
|
if ( pEntry == 0 )
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Adding Entry %s"),
|
_T(" Adding Entry %s"),
|
||||||
strName.c_str() );
|
strName.c_str() );
|
||||||
pEntry = m_pCurrentGroup->AddEntry(strName);
|
pEntry = m_pCurrentGroup->AddEntry(strName);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Setting value %s"),
|
_T(" Setting value %s"),
|
||||||
szValue.c_str() );
|
szValue.c_str() );
|
||||||
pEntry->SetValue(szValue);
|
pEntry->SetValue(szValue);
|
||||||
@@ -1133,13 +1135,13 @@ bool wxFileConfig::DeleteAll()
|
|||||||
|
|
||||||
wxFileConfigLineList *wxFileConfig::LineListAppend(const wxString& str)
|
wxFileConfigLineList *wxFileConfig::LineListAppend(const wxString& str)
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" ** Adding Line '%s'"),
|
_T(" ** Adding Line '%s'"),
|
||||||
str.c_str() );
|
str.c_str() );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1159,10 +1161,10 @@ wxFileConfigLineList *wxFileConfig::LineListAppend(const wxString& str)
|
|||||||
|
|
||||||
m_linesTail = pLine;
|
m_linesTail = pLine;
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1173,14 +1175,14 @@ wxFileConfigLineList *wxFileConfig::LineListAppend(const wxString& str)
|
|||||||
wxFileConfigLineList *wxFileConfig::LineListInsert(const wxString& str,
|
wxFileConfigLineList *wxFileConfig::LineListInsert(const wxString& str,
|
||||||
wxFileConfigLineList *pLine)
|
wxFileConfigLineList *pLine)
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" ** Inserting Line '%s' after '%s'"),
|
_T(" ** Inserting Line '%s' after '%s'"),
|
||||||
str.c_str(),
|
str.c_str(),
|
||||||
((pLine) ? pLine->Text().c_str() : wxEmptyString) );
|
((pLine) ? pLine->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1205,10 +1207,10 @@ wxFileConfigLineList *wxFileConfig::LineListInsert(const wxString& str,
|
|||||||
pLine->SetNext(pNewLine);
|
pLine->SetNext(pNewLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1217,13 +1219,13 @@ wxFileConfigLineList *wxFileConfig::LineListInsert(const wxString& str,
|
|||||||
|
|
||||||
void wxFileConfig::LineListRemove(wxFileConfigLineList *pLine)
|
void wxFileConfig::LineListRemove(wxFileConfigLineList *pLine)
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" ** Removing Line '%s'"),
|
_T(" ** Removing Line '%s'"),
|
||||||
pLine->Text().c_str() );
|
pLine->Text().c_str() );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1244,10 +1246,10 @@ void wxFileConfig::LineListRemove(wxFileConfigLineList *pLine)
|
|||||||
else
|
else
|
||||||
pNext->SetPrev(pPrev);
|
pNext->SetPrev(pPrev);
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" head: %s"),
|
_T(" head: %s"),
|
||||||
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
((m_linesHead) ? m_linesHead->Text().c_str() : wxEmptyString) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" tail: %s"),
|
_T(" tail: %s"),
|
||||||
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
((m_linesTail) ? m_linesTail->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
@@ -1343,13 +1345,13 @@ void wxFileConfigGroup::SetLine(wxFileConfigLineList *pLine)
|
|||||||
// have it or in the very beginning if we're the root group.
|
// have it or in the very beginning if we're the root group.
|
||||||
wxFileConfigLineList *wxFileConfigGroup::GetGroupLine()
|
wxFileConfigLineList *wxFileConfigGroup::GetGroupLine()
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" GetGroupLine() for Group '%s'"),
|
_T(" GetGroupLine() for Group '%s'"),
|
||||||
Name().c_str() );
|
Name().c_str() );
|
||||||
|
|
||||||
if ( !m_pLine )
|
if ( !m_pLine )
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Getting Line item pointer") );
|
_T(" Getting Line item pointer") );
|
||||||
|
|
||||||
wxFileConfigGroup *pParent = Parent();
|
wxFileConfigGroup *pParent = Parent();
|
||||||
@@ -1357,7 +1359,7 @@ wxFileConfigLineList *wxFileConfigGroup::GetGroupLine()
|
|||||||
// this group wasn't present in local config file, add it now
|
// this group wasn't present in local config file, add it now
|
||||||
if ( pParent )
|
if ( pParent )
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" checking parent '%s'"),
|
_T(" checking parent '%s'"),
|
||||||
pParent->Name().c_str() );
|
pParent->Name().c_str() );
|
||||||
|
|
||||||
@@ -1403,7 +1405,7 @@ wxFileConfigLineList *wxFileConfigGroup::GetLastGroupLine()
|
|||||||
// one immediately after the group line itself.
|
// one immediately after the group line itself.
|
||||||
wxFileConfigLineList *wxFileConfigGroup::GetLastEntryLine()
|
wxFileConfigLineList *wxFileConfigGroup::GetLastEntryLine()
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" GetLastEntryLine() for Group '%s'"),
|
_T(" GetLastEntryLine() for Group '%s'"),
|
||||||
Name().c_str() );
|
Name().c_str() );
|
||||||
|
|
||||||
@@ -1579,121 +1581,91 @@ bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup)
|
|||||||
{
|
{
|
||||||
wxCHECK_MSG( pGroup, false, _T("deleting non existing group?") );
|
wxCHECK_MSG( pGroup, false, _T("deleting non existing group?") );
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T("Deleting group '%s' from '%s'"),
|
_T("Deleting group '%s' from '%s'"),
|
||||||
pGroup->Name().c_str(),
|
pGroup->Name().c_str(),
|
||||||
Name().c_str() );
|
Name().c_str() );
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" (m_pLine) = prev: %p, this %p, next %p"),
|
_T(" (m_pLine) = prev: %p, this %p, next %p"),
|
||||||
((m_pLine) ? m_pLine->Prev() : 0),
|
((m_pLine) ? m_pLine->Prev() : 0),
|
||||||
m_pLine,
|
m_pLine,
|
||||||
((m_pLine) ? m_pLine->Next() : 0) );
|
((m_pLine) ? m_pLine->Next() : 0) );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" text: '%s'"),
|
_T(" text: '%s'"),
|
||||||
((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
|
((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
// delete all entries
|
// delete all entries...
|
||||||
size_t nCount = pGroup->m_aEntries.Count();
|
size_t nCount = pGroup->m_aEntries.Count();
|
||||||
|
|
||||||
wxLogTrace(_T("wxFileConfig"),
|
wxLogTrace(FILECONF_TRACE_MASK,
|
||||||
_T("Removing %lu Entries"),
|
_T("Removing %lu entries"), (unsigned long)nCount );
|
||||||
(unsigned long)nCount );
|
|
||||||
|
|
||||||
for ( size_t nEntry = 0; nEntry < nCount; nEntry++ )
|
for ( size_t nEntry = 0; nEntry < nCount; nEntry++ )
|
||||||
{
|
{
|
||||||
wxFileConfigLineList *pLine = pGroup->m_aEntries[nEntry]->GetLine();
|
wxFileConfigLineList *pLine = pGroup->m_aEntries[nEntry]->GetLine();
|
||||||
|
|
||||||
if ( pLine != 0 )
|
if ( pLine )
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" '%s'"),
|
_T(" '%s'"),
|
||||||
pLine->Text().c_str() );
|
pLine->Text().c_str() );
|
||||||
m_pConfig->LineListRemove(pLine);
|
m_pConfig->LineListRemove(pLine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// and subgroups of this subgroup
|
// ...and subgroups of this subgroup
|
||||||
|
|
||||||
nCount = pGroup->m_aSubgroups.Count();
|
nCount = pGroup->m_aSubgroups.Count();
|
||||||
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T("Removing %lu SubGroups"),
|
_T("Removing %lu subgroups"), (unsigned long)nCount );
|
||||||
(unsigned long)nCount );
|
|
||||||
|
|
||||||
for ( size_t nGroup = 0; nGroup < nCount; nGroup++ )
|
for ( size_t nGroup = 0; nGroup < nCount; nGroup++ )
|
||||||
{
|
{
|
||||||
pGroup->DeleteSubgroup(pGroup->m_aSubgroups[0]);
|
pGroup->DeleteSubgroup(pGroup->m_aSubgroups[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// finally the group itself
|
// and then finally the group itself
|
||||||
|
wxFileConfigLineList *pLine = pGroup->m_pLine;
|
||||||
wxFileConfigLineList *pLine = pGroup->m_pLine;
|
if ( pLine )
|
||||||
|
|
||||||
if ( pLine != 0 )
|
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Removing line entry for Group '%s' : '%s'"),
|
_T(" Removing line for group '%s' : '%s'"),
|
||||||
pGroup->Name().c_str(),
|
pGroup->Name().c_str(),
|
||||||
pLine->Text().c_str() );
|
pLine->Text().c_str() );
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" Removing from Group '%s' : '%s'"),
|
_T(" Removing from group '%s' : '%s'"),
|
||||||
Name().c_str(),
|
Name().c_str(),
|
||||||
((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
|
((m_pLine) ? m_pLine->Text().c_str() : wxEmptyString) );
|
||||||
|
|
||||||
// notice that we may do this test inside the previous "if"
|
// notice that we may do this test inside the previous "if"
|
||||||
// because the last entry's line is surely !NULL
|
// because the last entry's line is surely !NULL
|
||||||
|
|
||||||
if ( pGroup == m_pLastGroup )
|
if ( pGroup == m_pLastGroup )
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" ------- Removing last group -------") );
|
_T(" Removing last group") );
|
||||||
|
|
||||||
// our last entry is being deleted, so find the last one which stays.
|
// our last entry is being deleted, so find the last one which
|
||||||
// go back until we find a subgroup or reach the group's line, unless
|
// stays by going back until we find a subgroup or reach the
|
||||||
// we are the root group, which we'll notice shortly.
|
// group line
|
||||||
|
const size_t nSubgroups = m_aSubgroups.Count();
|
||||||
|
|
||||||
wxFileConfigGroup *pNewLast = 0;
|
m_pLastGroup = NULL;
|
||||||
size_t nSubgroups = m_aSubgroups.Count();
|
for ( wxFileConfigLineList *pl = pLine->Prev();
|
||||||
wxFileConfigLineList *pl;
|
pl && pl != m_pLine && !m_pLastGroup;
|
||||||
|
pl = pl->Prev() )
|
||||||
for ( pl = pLine->Prev(); pl != m_pLine; pl = pl->Prev() )
|
|
||||||
{
|
{
|
||||||
// is it our subgroup?
|
// does this line belong to our subgroup?
|
||||||
|
for ( size_t n = 0; n < nSubgroups; n++ )
|
||||||
for ( size_t n = 0; (pNewLast == 0) && (n < nSubgroups); n++ )
|
|
||||||
{
|
{
|
||||||
// do _not_ call GetGroupLine! we don't want to add it to the local
|
// do _not_ call GetGroupLine! we don't want to add it to
|
||||||
// file if it's not already there
|
// the local file if it's not already there
|
||||||
|
if ( m_aSubgroups[n]->m_pLine == pl )
|
||||||
if ( m_aSubgroups[n]->m_pLine == m_pLine )
|
{
|
||||||
pNewLast = m_aSubgroups[n];
|
m_pLastGroup = m_aSubgroups[n];
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pNewLast != 0 ) // found?
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( pl == m_pLine || m_pParent == 0 )
|
|
||||||
{
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
|
||||||
_T(" ------- No previous group found -------") );
|
|
||||||
|
|
||||||
wxASSERT_MSG( !pNewLast || m_pLine == 0,
|
|
||||||
_T("how comes it has the same line as we?") );
|
|
||||||
|
|
||||||
// we've reached the group line without finding any subgroups,
|
|
||||||
// or realised we removed the last group from the root.
|
|
||||||
|
|
||||||
m_pLastGroup = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
|
||||||
_T(" ------- Last Group set to '%s' -------"),
|
|
||||||
pNewLast->Name().c_str() );
|
|
||||||
|
|
||||||
m_pLastGroup = pNewLast;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1701,7 +1673,7 @@ bool wxFileConfigGroup::DeleteSubgroup(wxFileConfigGroup *pGroup)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxLogTrace( _T("wxFileConfig"),
|
wxLogTrace( FILECONF_TRACE_MASK,
|
||||||
_T(" No line entry for Group '%s'?"),
|
_T(" No line entry for Group '%s'?"),
|
||||||
pGroup->Name().c_str() );
|
pGroup->Name().c_str() );
|
||||||
}
|
}
|
||||||
@@ -2043,5 +2015,3 @@ static wxString GetAppName(const wxString& appName)
|
|||||||
|
|
||||||
#endif // wxUSE_CONFIG
|
#endif // wxUSE_CONFIG
|
||||||
|
|
||||||
|
|
||||||
// vi:sts=4:sw=4:et
|
|
||||||
|
|||||||
Reference in New Issue
Block a user