Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

184 lines
5.0 KiB

// 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 <afxtempl.h>
#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 <mmc.h>
#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<HSCOPEITEM, HSCOPEITEM &, CViewObject *, CViewObject * &> m_mapScopeToView;
CMap<CViewObject *, CViewObject * &, HSCOPEITEM, HSCOPEITEM &> 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();
}