// ScopeMap.h - Create a map of Scope items. // // History: a-jsari 10/7/97 Initial version // // Copyright (c) 1998-1999 Microsoft Corporation #pragma once #include #include "DataSrc.h" #include "ViewObj.h" #include "Consts.h" // This hack is required because we may be building in an environment // which doesn't have a late enough version of rpcndr.h #if __RPCNDR_H_VERSION__ < 440 #define __RPCNDR_H_VERSION__ 440 #define MIDL_INTERFACE(x) interface #endif #ifndef __mmc_h__ #include #endif // __mmc_h__ /* * CScopeItem - an object which can be inserted in a CMapStringToOb which contains * an HSCOPEITEM * * History: a-jsari 12/16/97 Initial version. */ class CScopeItem : public CObject { public: CScopeItem() {} CScopeItem(HSCOPEITEM hsiNew) :m_hsiValue(hsiNew) { } CScopeItem(const CScopeItem &siCopy) :m_hsiValue(siCopy.m_hsiValue) { } ~CScopeItem() {} const CScopeItem &operator=(const CScopeItem &siCopy) { if (&siCopy != this) SetValue(siCopy.GetValue()); return *this; } void SetValue(HSCOPEITEM hsiSet) { m_hsiValue = hsiSet; } HSCOPEITEM GetValue() const { return m_hsiValue; } private: HSCOPEITEM m_hsiValue; }; /* * CScopeItemMap - Wrapper function for two cross-mappings of HSCOPEITEM and * CViewObject pairs. * * History: a-jsari 10/7/97 Initial version. */ class CScopeItemMap { public: CScopeItemMap() :m_mapScopeToView(MapIncrement), m_mapViewToScope(MapIncrement) { m_mapScopeToView.InitHashTable(HashSize); m_mapViewToScope.InitHashTable(HashSize); } ~CScopeItemMap() { Clear(); } CFolder *CategoryFromScope(HSCOPEITEM hsiNode) const; void InsertRoot(CViewObject *pvoRootData, HSCOPEITEM hsiNode); void Insert(CViewObject *pvoData, HSCOPEITEM hsiNode); BOOL ScopeFromView(CViewObject *pvoNode, HSCOPEITEM &hsiNode) const; BOOL ScopeFromName(const CString &strName, HSCOPEITEM &hsiNode) const; void Clear(); private: static const int MapIncrement; static const int HashSize; CMap m_mapScopeToView; CMap m_mapViewToScope; CMapStringToOb m_mapNameToScope; }; /* * CategoryFromScope - Return the CDataCategory pointer, given the hsiNode. * Note: Do not free the resultant pointer. * * History: a-jsari 10/7/97 */ inline CFolder *CScopeItemMap::CategoryFromScope(HSCOPEITEM hsiNode) const { CViewObject *pvoData; if (m_mapScopeToView.Lookup(hsiNode, pvoData) == 0) return NULL; // Root category. return pvoData->Category(); } /* * Insert - Inserts the pvoData <-> hsiNode pairing into the maps. * * History: a-jsari 10/8/97 */ inline void CScopeItemMap::Insert(CViewObject *pvoData, HSCOPEITEM hsiNode) { CString strName; m_mapScopeToView.SetAt(hsiNode, pvoData); m_mapViewToScope.SetAt(pvoData, hsiNode); pvoData->Category()->InternalName(strName); m_mapNameToScope.SetAt(strName, new CScopeItem(hsiNode)); } /* * InsertRoot - Special case insertion for the ROOT node (which always has * a Cookie of Zero), but which we want to have a legitamate object for * the Node. * * History: a-jsari 10/10/97 */ inline void CScopeItemMap::InsertRoot(CViewObject *pvoData, HSCOPEITEM hsiNode) { CString strValue = cszRootName; CViewObject *pvoNullCookie = NULL; m_mapScopeToView.SetAt(hsiNode, pvoData); // Insert the NULL cookie as the index for the HSCOPEITEM m_mapViewToScope.SetAt(pvoNullCookie, hsiNode); m_mapNameToScope.SetAt(strValue, new CScopeItem(hsiNode)); } /* * ScopeFromView - Return the HSCOPEITEM pvoNode maps to, in hsiNode. * * Return Codes: * TRUE - Successful completion * FALSE - pvoNode could not be found in the map. * * History: a-jsari 10/8/97 */ inline BOOL CScopeItemMap::ScopeFromView(CViewObject *pvoNode, HSCOPEITEM &hsiNode) const { return m_mapViewToScope.Lookup(pvoNode, hsiNode); } /* * ScopeFromName - Return the scope item * * History: a-jsari 12/11/97 */ inline BOOL CScopeItemMap::ScopeFromName(const CString &strName, HSCOPEITEM &hsiNode) const { BOOL fReturn; CScopeItem *psiNode; fReturn = m_mapNameToScope.Lookup(strName, (CObject * &)psiNode); if (fReturn) hsiNode = psiNode->GetValue(); return fReturn; } /* * clear - Remove all map items and free the CViewObject pointers * * History: a-jsari 10/7/97 */ inline void CScopeItemMap::Clear() { if (m_mapScopeToView.IsEmpty()) { ASSERT(m_mapViewToScope.IsEmpty()); return; } CViewObject *pvoIterator; CString strIterator; CScopeItem *psiIterator; HSCOPEITEM hsiIterator; POSITION posCurrent; posCurrent = m_mapScopeToView.GetStartPosition(); while (posCurrent != NULL) { m_mapScopeToView.GetNextAssoc(posCurrent, hsiIterator, pvoIterator); VERIFY(m_mapScopeToView.RemoveKey(hsiIterator)); delete pvoIterator; } posCurrent = m_mapNameToScope.GetStartPosition(); while (posCurrent != NULL) { m_mapNameToScope.GetNextAssoc(posCurrent, strIterator, (CObject * &)psiIterator); VERIFY(m_mapNameToScope.RemoveKey(strIterator)); delete psiIterator; } ASSERT(m_mapScopeToView.IsEmpty()); m_mapViewToScope.RemoveAll(); }