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.
 
 
 
 
 
 

262 lines
5.6 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999.
//
// File: B I N D I N G S . H
//
// Contents: The basic datatypes for binding objects. Bindpaths are
// ordered collections of component pointers. Bindsets
// are a collection of bindpaths. This module declares the
// objects which represent them.
//
// Notes:
//
// Author: shaunco 15 Jan 1999
//
//----------------------------------------------------------------------------
#pragma once
#include "comp.h"
class CComponentList;
// A bindpath is an ordered collection of pointers to components.
// The order in the collection is the order of the components on
// the bindpath from top to bottom.
// e.g.
// a, b, c, and d represent components.
// a bindpath of a -> b -> c -> d is represented in this data
// structure by a vector:
// vector offset: 0 1 2 3
// vector data : a b c d
// hence, the zeroth element in this data structure is the top-most
// (first) component in the bindpath. The last element in this
// data structure is the bottom-most (last) component.
//
// vector was chosen as the base class because it implements
// contiguous storage with fast inserts at the end. Since, we only
// build bindpaths by inserting components at the end, it was a
// natural choice. list uses non-contiguous storage which tends to
// fragment the heap -- especially with lots of small allocations.
// We create many CBindPath instances, and since each node is a pointer,
// using vector over list is much easier on the heap.
//
// For a bindpath to be valid, it must not be empty and it must not
// contain any dupliate component pointers.
//
class CBindPath : public vector<CComponent*>
{
public:
bool
operator< (
const CBindPath& OtherPath) const;
bool
operator> (
const CBindPath& OtherPath) const;
VOID
Clear ()
{
clear ();
}
UINT
CountComponents () const
{
return size();
}
BOOL
FAllComponentsLoadedOkayIfLoadedAtAll () const;
BOOL
FContainsComponent (
IN const CComponent* pComponent) const
{
return (find (begin(), end(), pComponent) != end());
}
BOOL
FGetPathToken (
OUT PWSTR pszToken,
IN OUT ULONG* pcchToken) const;
BOOL
FIsEmpty () const
{
return empty();
}
BOOL
FIsSameBindPathAs (
IN const CBindPath* pOtherPath) const;
BOOL
FIsSubPathOf (
IN const CBindPath* pOtherPath) const;
HRESULT
HrAppendBindPath (
IN const CBindPath* pBindPath);
HRESULT
HrAppendComponent (
IN const CComponent* pComponent);
HRESULT
HrGetComponentsInBindPath (
IN OUT CComponentList* pComponents) const;
HRESULT
HrInsertComponent (
IN const CComponent* pComponent);
HRESULT
HrReserveRoomForComponents (
IN UINT cComponents);
CComponent*
PGetComponentAtIndex (
IN UINT unIndex) const
{
return (unIndex < size()) ? (*this)[unIndex] : NULL;
}
CComponent*
POwner () const
{
AssertH (CountComponents() > 1);
AssertH (front());
return front();
}
CComponent*
PLastComponent () const
{
AssertH (CountComponents() > 1);
AssertH (back());
return back();
}
CComponent*
RemoveFirstComponent ()
{
CComponent* pComponent = NULL;
if (size() > 0)
{
pComponent = front();
AssertH(pComponent);
erase(begin());
}
return pComponent;
}
CComponent*
RemoveLastComponent ()
{
CComponent* pComponent = NULL;
if (size() > 0)
{
pComponent = back();
AssertH(pComponent);
pop_back();
}
return pComponent;
}
#if DBG
VOID DbgVerifyBindpath ();
#else
VOID DbgVerifyBindpath () {}
#endif
};
// A binding set is a set of bindpaths. Each bindpath in the set
// must be unique and cannot be empty.
//
class CBindingSet : public vector<CBindPath>
{
public:
VOID
Clear ()
{
clear ();
}
UINT
CountBindPaths () const
{
return size();
}
VOID
Printf (
TRACETAGID ttid,
PCSTR pszPrefixLine) const;
BOOL
FContainsBindPath (
IN const CBindPath* pBindPath) const;
BOOL
FContainsComponent (
IN const CComponent* pComponent) const;
BOOL
FIsEmpty () const
{
return empty();
}
HRESULT
HrAppendBindingSet (
IN const CBindingSet* pBindSet);
HRESULT
HrAddBindPath (
IN const CBindPath* pBindPath,
IN DWORD dwFlags /* INS_FLAGS */);
HRESULT
HrAddBindPathsInSet1ButNotInSet2 (
IN const CBindingSet* pSet1,
IN const CBindingSet* pSet2);
HRESULT
HrCopyBindingSet (
IN const CBindingSet* pSourceSet);
HRESULT
HrGetAffectedComponentsInBindingSet (
IN OUT CComponentList* pComponents) const;
HRESULT
HrReserveRoomForBindPaths (
IN UINT cBindPaths);
CBindPath*
PGetBindPathAtIndex (
IN UINT unIndex)
{
return (unIndex < size()) ? (begin() + unIndex) : end();
}
VOID
RemoveBindPath (
IN const CBindPath* pBindPath);
VOID
RemoveBindPathsWithComponent (
IN const CComponent* pComponent);
VOID
RemoveSubpaths ();
VOID
SortForPnpBind ();
VOID
SortForPnpUnbind ();
};