windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/viewpers.cpp

837 lines
26 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: viewpers.cpp
//
// Contents: View Persistence data structures.
//
// History: 04-Apr-99 AnandhaG Created
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#include "viewpers.h"
#include "macros.h"
#include "comdbg.h"
#define MAX_VIEWITEMS_PERSISTED 50
//------------------------------------------------------------------
// class CViewSettingsPersistor
//------------------------------------------------------------------
CViewSettingsPersistor::CViewSettingsPersistor() :
m_dwMaxItems(MAX_VIEWITEMS_PERSISTED), m_bDirty(false)
{
// Now read the registry to see if m_dwMaxItems is specified.
// Check if the settings key exists.
CRegKeyEx rSettingsKey;
if (rSettingsKey.ScOpen (HKEY_LOCAL_MACHINE, SETTINGS_KEY, KEY_READ).IsError())
return;
// Read the values for MaxColDataPersisted.
if (rSettingsKey.IsValuePresent(g_szMaxViewItemsPersisted))
{
DWORD dwType = REG_DWORD;
DWORD dwSize = sizeof(DWORD);
SC sc = rSettingsKey.ScQueryValue (g_szMaxViewItemsPersisted, &dwType,
&m_dwMaxItems, &dwSize);
if (sc)
sc.TraceAndClear();
}
}
//+-------------------------------------------------------------------
//
// Member: ScGetViewSettings
//
// Synopsis: Given the CViewSettingsID return the CViewSettings object.
//
// Arguments: [viewSettingsID] - [in]
// [viewSettings] - [out]
//
// Returns: SC, S_FALSE if none found.
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGetViewSettings(const CViewSettingsID& viewSettingsID,
CViewSettings& viewSettings)
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScGetViewSettings"));
// 1. Look in the map if there is persisted data for given id.
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.find(viewSettingsID);
if (itViewSettingsDataMap == m_mapViewSettingsIDToViewSettings.end())
return (sc = S_FALSE);
// Found the data.
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
// 2. Copy the data.
viewSettings = *itViewSettings;
// 3. Move this item to the front of the queue.
m_listViewSettings.erase(itViewSettings);
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(), viewSettings);
itViewSettingsDataMap->second = itViewSettings;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScSetViewSettings
//
// Synopsis: Modify the persisted view information
// for given view and bookmark (node).
//
// Arguments: [nViewID] - Snapin Guid
// [pBookmark] - Column Set Identifier.
// [viewDataSet] - View ID.
//
// Returns: TRUE - Loaded successfully.
//
// History: 04-26-1999 AnandhaG Created
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetViewSettings(const CViewSettingsID& viewSettingsID,
const CViewSettings& viewSettings,
bool bSetViewDirty)
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScSetViewSettings"));
// 1. Garbage collect if the number of items in the list are 40% more than pre-set limit.
if (m_listViewSettings.size() >= (m_dwMaxItems * (1 + VIEWSETTINGS_MAXLIMIT)) )
{
sc = ScGarbageCollectItems();
if (sc)
sc.TraceAndClear();
}
// 2. Insert the item into the front of the queue.
IteratorToViewSettingsList itViewSettings;
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(), viewSettings);
// 3. See if there is data persisted for this id.
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.find(viewSettingsID);
if (itViewSettingsDataMap == m_mapViewSettingsIDToViewSettings.end()) // not found so insert data.
{
m_mapViewSettingsIDToViewSettings.insert(
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
}
else
{
// found, so replace old settings.
m_listViewSettings.erase(itViewSettingsDataMap->second);
itViewSettingsDataMap->second = itViewSettings;
}
// dirty flag accumulates.
m_bDirty = (m_bDirty || bSetViewDirty);
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScGetTaskpadID
//
// Synopsis: Given the nodetype & viewid get the taskpad id (this
// is for taskpads persisted per nodetype).
//
// Arguments: [nViewID] - [in]
// [guidNodeType] - [in]
// [guidTaskpad] - [out]
//
// Returns: SC, S_FALSE if none found.
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGetTaskpadID (int nViewID, const GUID& guidNodeType ,GUID& guidTaskpad)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetTaskpadID"));
// 1. Init out param.
guidTaskpad = GUID_NULL;
// 2. Construct a CViewSettingsID object with given nodetype & viewid.
CViewSettingsID viewSettingsID(nViewID, guidNodeType);
// 3. Get the viewsettings
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
// If none exists return
if (sc != S_OK)
return sc;
// 4. CViewSettings exists, see if there is valid taskpad-id stored.
sc = viewSettings.ScGetTaskpadID(guidTaskpad);
if (sc) // taskpad-id is not valid.
return (sc = S_FALSE);
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScSetTaskpadID
//
// Synopsis: Given the nodetype & viewid set the taskpad id (this
// is for taskpads persisted per nodetype).
//
// NOTE: NUKE ANY NODE-SPECIFIC TASKPAD-ID THAT IS STORED.
//
// Arguments: [nViewID] - [in]
// [guidNodeType] - [in]
// [bookmark] - [in]
// [guidTaskpad] - [in]
// [bSetDirty] - [in] set the console file dirty
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetTaskpadID (int nViewID, const GUID& guidNodeType,
const CBookmark& bookmark, const GUID& guidTaskpad,
bool bSetDirty)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetTaskpadID"));
// 1. First nuke the the old node specific taskpad-id settings (if any).
// 1.a) Construct a CViewSettingsID object with given nodetype & viewid.
CViewSettingsID viewSettingsIDNodeSpecific(nViewID, bookmark);
// 1.b) Get the viewsettings.
CViewSettings viewSettingsNodeSpecific;
sc = ScGetViewSettings(viewSettingsIDNodeSpecific, viewSettingsNodeSpecific);
if (sc)
return sc;
// data available
if ( (sc == S_OK) &&
(viewSettingsNodeSpecific.IsTaskpadIDValid()) )
{
// 1.c) Set taskpad id invalid.
viewSettingsNodeSpecific.SetTaskpadIDValid(false);
if (sc)
return sc;
// 1.d) Save the data.
sc = ScSetViewSettings(viewSettingsIDNodeSpecific, viewSettingsNodeSpecific, bSetDirty);
}
// 2. Now save the taskpad id for nodetype specific.
// 2.a) Construct a CViewSettingsID object with given nodetype & viewid.
CViewSettingsID viewSettingsID(nViewID, guidNodeType);
// 2.b) The CResultViewType & view-mode data are not stored when CViewSettings is stored
// per nodetype. So just set the taskpad id.
CViewSettings viewSettings;
sc = viewSettings.ScSetTaskpadID(guidTaskpad);
if (sc)
return sc;
// 2.c) Save the viewsettings into the map.
sc = ScSetViewSettings(viewSettingsID, viewSettings, bSetDirty);
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScGetTaskpadID
//
// Synopsis: Given the bookmark & viewid get the taskpad id (this
// is for taskpads persisted per node).
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [guidTaskpad] - [out]
//
// Returns: SC, S_FALSE if none found.
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGetTaskpadID (int nViewID, const CBookmark& bookmark,GUID& guidTaskpad)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetTaskpadID"));
// 1. Init out param.
guidTaskpad = GUID_NULL;
// 2. Construct a CViewSettingsID object with given bookmark & viewid.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 3. Get the viewsettings
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
// If none exists return
if (sc != S_OK)
return sc;
// 4. CViewSettings exists, see if there is valid taskpad-id stored.
sc = viewSettings.ScGetTaskpadID(guidTaskpad);
if (sc) // taskpad-id is not valid.
return (sc = S_FALSE);
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScSetTaskpadID
//
// Synopsis: Given the bookmark & viewid get the taskpad id (this
// is for taskpads persisted per nodetype).
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [guidTaskpad] - [in]
// [bSetDirty] - [in] set the console file dirty
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetTaskpadID (int nViewID, const CBookmark& bookmark,
const GUID& guidTaskpad, bool bSetDirty)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetTaskpadID"));
// 1. Construct a CViewSettingsID object with given bookmark & viewid.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. First get the old settings (if any) and just modify taskpad-id.
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
if (sc)
return sc;
// 3. If persisted data does not exist dont worry (as CResultViewType and
// view mode are invalid), just set taskpad-id.
sc = viewSettings.ScSetTaskpadID(guidTaskpad);
if (sc)
return sc;
// 4. Save the viewsettings into the map.
sc = ScSetViewSettings(viewSettingsID, viewSettings, bSetDirty);
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScGetViewMode
//
// Synopsis: Given the viewid & bookmark (can identify a node), return
// the view mode if any persisted.
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [ulViewMode] - [out]
//
// Returns: SC, S_FALSE if none.
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGetViewMode (int nViewID, const CBookmark& bookmark, ULONG& ulViewMode)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetViewMode"));
// 1. Construct the viewsettings-id.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. see if ViewSettings exist.
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
if (sc != S_OK)
return sc;
sc = viewSettings.ScGetViewMode(ulViewMode);
if (sc)
return (sc = S_FALSE);
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScSetViewMode
//
// Synopsis: Given view-id & bookmark, set the viewmode in a node
// specific viewsettings.
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [ulViewMode] - [in]
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetViewMode (int nViewID, const CBookmark& bookmark, ULONG ulViewMode)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetViewMode"));
// 1. Construct the viewsettings-id.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. First get the old settings (if any) and just modify viewmode.
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
if (sc)
return sc;
// 3. If persisted data does not exist dont worry (as CResultViewType and
// taskpad-id are invalid), just set viewmode.
sc = viewSettings.ScSetViewMode(ulViewMode);
if (sc)
return sc;
// 4. Save the viewsettings into the map.
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ true);
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScGetResultViewType
//
// Synopsis: Given the viewid & bookmark (can identify a node), return
// the CResultViewType if persisted.
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [rvt] - [out]
//
// Returns: SC, S_FALSE if none.
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGetResultViewType (int nViewID, const CBookmark& bookmark, CResultViewType& rvt)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetResultViewType"));
// 1. Construct the viewsettings-id.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. see if ViewSettings exist.
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
if (sc != S_OK)
return sc;
sc = viewSettings.ScGetResultViewType(rvt);
if (sc)
return (sc = S_FALSE);
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScSetResultViewType
//
// Synopsis: Given view-id & bookmark, set the resultviewtype in a node
// specific viewsettings.
//
// Arguments: [nViewID] - [in]
// [bookmark] - [in]
// [nViewMode] - [in]
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetResultViewType (int nViewID, const CBookmark& bookmark, const CResultViewType& rvt)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetResultViewType"));
// 1. Construct the viewsettings-id.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. First get the old settings (if any) and just modify resultviewtype.
CViewSettings viewSettings;
sc = ScGetViewSettings(viewSettingsID, viewSettings);
if (sc)
return sc;
// 3. If persisted data does not exist dont worry (as view-mode and
// taskpad-id are invalid), just set resultviewtype.
sc = viewSettings.ScSetResultViewType(rvt);
if (sc)
return sc;
// 4. Save the viewsettings into the map.
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ true);
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewSettingsPersistor::ScSetFavoriteViewSettings
//
// Synopsis: A favorite is selected and it sets viewsettings
// before re-selecting the node so that after re-selection
// the new settings are set for the view. So dont set the
// console file dirty.
//
// Arguments: [nViewID] -
// [bookmark] -
// [viewSettings] -
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScSetFavoriteViewSettings (int nViewID, const CBookmark& bookmark,
const CViewSettings& viewSettings)
{
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetFavoriteViewSettings"));
// 1. Construct the viewsettings-id.
CViewSettingsID viewSettingsID(nViewID, bookmark);
// 2. Save the viewsettings into the map.
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ false);
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: ScDeleteDataOfView
//
// Synopsis: Delete the data of given view.
//
// Arguments: [nViewID] - View ID.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScDeleteDataOfView( int nViewID)
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScDeleteDataOfView"));
// Find the data for the view.
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
for (itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
itViewSettingsDataMap != m_mapViewSettingsIDToViewSettings.end();
++itViewSettingsDataMap)
{
const CViewSettingsID& viewSettingsID = itViewSettingsDataMap->first;
if (viewSettingsID.get_ViewID() == nViewID)
{
// Delete the item;
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
itViewSettings->SetObjInvalid(TRUE);
}
}
// Delete the invalid items.
sc = ScDeleteMarkedItems();
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScGarbageCollectItems
//
// Synopsis: Free least used data.
//
// Arguments: None.
//
// History: 04-26-1999 AnandhaG Created
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScGarbageCollectItems()
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScGarbageCollectItems"));
INT nItemsToBeRemoved = VIEWSETTINGS_MAXLIMIT * m_dwMaxItems;
// Go thro' the list and set the nItemsToBeRemoved that was least recently
// accessed to be invalid.
INT nIndex = 0;
IteratorToViewSettingsList itViewSettings;
// Skip first m_dwMaxItems.
for (itViewSettings = m_listViewSettings.begin();
( (itViewSettings != m_listViewSettings.end()) && (nIndex <= m_dwMaxItems) );
++itViewSettings, nIndex++)
{
nIndex++;
}
// Mark rest of the items to be garbage.
while (itViewSettings != m_listViewSettings.end())
{
itViewSettings->SetObjInvalid(TRUE);
++itViewSettings;
}
// Delete the invalid items.
sc = ScDeleteMarkedItems();
if (sc)
return sc;
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScDeleteMarkedItems
//
// Synopsis: Delete invalidated items. This involves iterating thro
// the maps to find the invalid items. Then deleting the
// items. If the map becomes empty then delete the map.
//
// History: 04-26-1999 AnandhaG Created
//
//--------------------------------------------------------------------
SC CViewSettingsPersistor::ScDeleteMarkedItems()
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScDeleteMarkedItems"));
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
// Iterate through the map to see if there are
// invalidated items.
while (m_mapViewSettingsIDToViewSettings.end() != itViewSettingsDataMap)
{
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
if (itViewSettings->IsObjInvalid())
{
// Delete the item ref from the map.
// Erase returns iterator to next item.
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.erase(itViewSettingsDataMap);
// Delete the item from the list.
m_listViewSettings.erase(itViewSettings);
}
else
++itViewSettingsDataMap; // Item is valid so get next item.
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: Load
//
// Synopsis: Load the persisted view information.
//
// Arguments: [pStream]- IStream from which view data will be loaded.
//
// Returns: S_OK - Loaded successfully.
//
// History: 04-26-1999 AnandhaG Created
//
//--------------------------------------------------------------------
HRESULT CViewSettingsPersistor::Load (IStream* pStream)
{
HRESULT hr = E_FAIL;
// read the column width information.
try
{
do
{
// Read the version. If it did not match return
INT nVersion = 0;
*pStream >> nVersion;
if (ViewSettingPersistenceVersion != nVersion)
return S_FALSE;
// Read the # of Snapins
DWORD dwNumItems = 0;
*pStream >> dwNumItems;
m_listViewSettings.clear();
m_mapViewSettingsIDToViewSettings.clear();
for (int i = 0; i < dwNumItems; i++)
{
// Read the ID.
CViewSettingsID viewSettingsID;
*pStream >> viewSettingsID;
// Read the data.
CViewSettings viewSettings;
viewSettings.Read(*pStream);
// Insert the data into the list.
IteratorToViewSettingsList itViewSettings;
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(),
viewSettings);
// Insert the data into the map.
m_mapViewSettingsIDToViewSettings.insert(
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
}
m_listViewSettings.sort();
} while (FALSE);
}
catch (_com_error& err)
{
hr = err.Error();
}
catch (...)
{
ASSERT (0 && "Unexpected exception");
throw;
}
return S_OK;
}
//+-------------------------------------------------------------------
//
// Member: Save
//
// Synopsis: Persist the view information.
//
// Arguments: [pStream]- IStream in which data is persisted.
//
// Returns: S_OK - Saved successfully.
//
// History: 04-26-1999 AnandhaG Created
//
//--------------------------------------------------------------------
HRESULT CViewSettingsPersistor::Save (IStream* pStream, BOOL bClearDirty)
{
// absolete method.
// this method is left here since we use IPersistStream to export
// persistence to CONUI side and need to implement it.
// But this interface will never be called to save data
// [we will use CPersistor-based XML saving instead]
// so the method will always fail.
ASSERT(FALSE && "Should never come here");
return E_NOTIMPL;
}
//+-------------------------------------------------------------------
//
// Member: Persist
//
// Synopsis: Persist the view information.
//
// Arguments: [CPersistor]- Persistor in/from which data is persisted.
//
// Returns: void
//
// History: 11-08-1999 AudriusZ Created
//
//--------------------------------------------------------------------
void CViewSettingsPersistor::Persist(CPersistor &persistor)
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::Persist"));
if (persistor.IsStoring())
{
// Give ranking to each CViewSettings instance.
IteratorToViewSettingsList itViewSettings;
DWORD dwRank = 0;
for (itViewSettings = m_listViewSettings.begin();
itViewSettings != m_listViewSettings.end();
++itViewSettings)
{
dwRank++;
itViewSettings->SetUsageRank(dwRank);
}
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
for (itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
itViewSettingsDataMap != m_mapViewSettingsIDToViewSettings.end();
++itViewSettingsDataMap)
{
// Write the ID.
persistor.Persist(*const_cast<CViewSettingsID *>(&itViewSettingsDataMap->first));
// Write the data.
persistor.Persist(*itViewSettingsDataMap->second);
}
}
else
{
// let the base class do the job
// it will call OnNewElement for every element found
XMLMapCollectionBase::Persist(persistor);
// some extra loading actions
m_listViewSettings.sort();
}
// either way we are the same as the file copy
m_bDirty = false;
}
//+-------------------------------------------------------------------
//
// Member: OnNewElement
//
// Synopsis: Called for each new data pair read.
//
// Arguments: [persistKey]- Persistor from which key is to be loaded
// [persistVal]- Persistor from which value is to be loaded
//
// Returns: void
//
// History: 11-08-1999 AudriusZ Created
//
//--------------------------------------------------------------------
void CViewSettingsPersistor::OnNewElement(CPersistor& persistKey,CPersistor& persistVal)
{
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::OnNewElement"));
// Read the ID.
CViewSettingsID viewSettingsID;
persistKey.Persist(viewSettingsID);
// Read the data.
CViewSettings viewSettings;
persistVal.Persist(viewSettings);
// Insert the data into the list.
IteratorToViewSettingsList itViewSettings;
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(),
viewSettings);
// Insert the data into the map.
m_mapViewSettingsIDToViewSettings.insert(
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
}