windows-nt/Source/XPSP1/NT/admin/pchealth/sysinfo/msconfig/control/undolog.h
2020-09-26 16:20:57 +08:00

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
};