202 lines
6 KiB
C
202 lines
6 KiB
C
|
//=============================================================================
|
||
|
// The CUndoLog is used to implement a log of undo entries to allow MSConfig
|
||
|
// to reverse any changes it may have made. Each tab object is responsible for
|
||
|
// writing a string when it makes changes - this string can be used to undo
|
||
|
// the changes the tab made.
|
||
|
//
|
||
|
// The undo log file will look like this:
|
||
|
//
|
||
|
// [timestamp tabname "description" <SHOW|FINAL>]
|
||
|
// tab specific string - any line starting with a "[" will have a
|
||
|
// backslash preceding it
|
||
|
//
|
||
|
// The entries will be arranged in chronological order (most recent first).
|
||
|
// The "description" field will be the only one shown to the user - so it
|
||
|
// will be the only one which needs to be localized. The tab is responsible
|
||
|
// for supplying this text.
|
||
|
//=============================================================================
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// This class encapsulates an undo entry (instance of this class will be
|
||
|
// saved in a list).
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
class CUndoLogEntry
|
||
|
{
|
||
|
public:
|
||
|
CUndoLogEntry(const CString & strTab, const CString & strDescription, const CString & strEntry, BOOL fFinal, const COleDateTime & timestamp)
|
||
|
: m_strTab(strTab),
|
||
|
m_strDescription(strDescription),
|
||
|
m_strEntry(strEntry),
|
||
|
m_timestamp(timestamp),
|
||
|
m_fFinal(fFinal)
|
||
|
{};
|
||
|
|
||
|
CUndoLogEntry(const CString & strTab, const CString & strDescription, const CString & strEntry, BOOL fFinal)
|
||
|
: m_strTab(strTab),
|
||
|
m_strDescription(strDescription),
|
||
|
m_strEntry(strEntry),
|
||
|
m_timestamp(COleDateTime::GetCurrentTime()),
|
||
|
m_fFinal(fFinal)
|
||
|
{};
|
||
|
|
||
|
|
||
|
~CUndoLogEntry() {};
|
||
|
|
||
|
CString m_strTab;
|
||
|
CString m_strDescription;
|
||
|
CString m_strEntry;
|
||
|
COleDateTime m_timestamp;
|
||
|
BOOL m_fFinal;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// This class implements the undo log.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
class CUndoLog
|
||
|
{
|
||
|
public:
|
||
|
CUndoLog();
|
||
|
~CUndoLog()
|
||
|
{
|
||
|
while (!m_entrylist.IsEmpty())
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = (CUndoLogEntry *)m_entrylist.RemoveHead();
|
||
|
if (pEntry)
|
||
|
delete pEntry;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// These functions will load the undo log from a file, or save to a file.
|
||
|
// Note - saving to a file will overwrite the contents of the file with
|
||
|
// the contents of the undo log.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL LoadFromFile(LPCTSTR szFilename);
|
||
|
BOOL SaveToFile(LPCTSTR szFilename);
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// How many undo entries are in this log?
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
int GetUndoEntryCount()
|
||
|
{
|
||
|
int iCount = 0;
|
||
|
|
||
|
for (POSITION pos = m_entrylist.GetHeadPosition(); pos != NULL;)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = (CUndoLogEntry *)m_entrylist.GetNext(pos);
|
||
|
if (pEntry != NULL && !pEntry->m_fFinal)
|
||
|
iCount += 1;
|
||
|
}
|
||
|
|
||
|
return iCount;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Get information about a specific entry (returns FALSE for bad index).
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL GetUndoEntryInfo(int iIndex, CString & strDescription, COleDateTime & timestamp)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = GetEntryByIndex(iIndex);
|
||
|
if (pEntry != NULL)
|
||
|
{
|
||
|
strDescription = pEntry->m_strDescription;
|
||
|
timestamp = pEntry->m_timestamp;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Get the entry data (to pass to a tab to undo). FALSE for bad index.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL GetUndoEntry(int iIndex, CString & strTab, CString & strEntry)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = GetEntryByIndex(iIndex);
|
||
|
if (pEntry != NULL)
|
||
|
{
|
||
|
strTab = pEntry->m_strTab;
|
||
|
strEntry = pEntry->m_strEntry;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Mark an entry as final (stays in the file, but marked so it won't
|
||
|
// appear in the undo log). FALSE for bad index.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL MarkUndoEntryFinal(int iIndex)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = GetEntryByIndex(iIndex);
|
||
|
if (pEntry != NULL)
|
||
|
{
|
||
|
pEntry->m_fFinal = TRUE;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Delete all entries in the log that are older than
|
||
|
// timestampOlderThanThis. The entries will be gone, purged from the file.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL DeleteOldUndoEntries(const COleDateTime & timestampOlderThanThis)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Create a new undo entry, using the current time, and add it to the
|
||
|
// end of the undo log. Shouldn't return FALSE unless there is no memory.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
BOOL AddUndoEntry(const CString & strTab, const CString & strDescription, const CString & strEntry)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = new CUndoLogEntry(strTab, strDescription, strEntry, FALSE);
|
||
|
if (pEntry == NULL)
|
||
|
return FALSE;
|
||
|
|
||
|
m_entrylist.AddTail((void *)pEntry);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
CUndoLogEntry * GetEntryByIndex(int iIndex)
|
||
|
{
|
||
|
CUndoLogEntry * pEntry = NULL;
|
||
|
POSITION pos = m_entrylist.GetHeadPosition();
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (pos == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
pEntry = (CUndoLogEntry *)m_entrylist.GetNext(pos);
|
||
|
if (pEntry != NULL && !pEntry->m_fFinal)
|
||
|
iIndex -= 1;
|
||
|
} while (iIndex >= 0);
|
||
|
|
||
|
return pEntry;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
// Member variables.
|
||
|
//-------------------------------------------------------------------------
|
||
|
|
||
|
CPtrList m_entrylist; // list of CUndoLogEntry pointers
|
||
|
};
|