Leaked source code of windows server 2003
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.
 
 
 
 
 
 

152 lines
4.5 KiB

//+-------------------------------------------------------------------------
// Microsoft OLE
// Copyright (C) Microsoft Corporation, 1992 - 1996.
// All rights reserved.
//
// File: chancend.cxx
//
// Contents: Implementation for ChanceNode objects.
//
// Classes: ChanceNode
//
// Functions: ChanceNode
// ~ChanceNode
// AppendChildStorage
// AppendSisterStorage
//
// History: DeanE 12-Mar-96 Created
//--------------------------------------------------------------------------
#include <dfheader.hxx>
#pragma hdrstop
// Debug object declaration
//
DH_DECLARE;
//+--------------------------------------------------------------------------
// Member: ChanceNode::ChanceNode, public
//
// Synopsis: Constructor. Initializes object with the values passed.
//
// Arguments: [cStg] - Number of direct child storages of this node
// [cStm] - Number of streams to create in this node
// [cbStmMin] - Minimum number of bytes/stream.
// [cbStmMax] - Maximum number of bytes/stream.
//
// Returns: Nothing.
//
// History: DeanE 12-Mar-96 Created
//---------------------------------------------------------------------------
ChanceNode::ChanceNode(
ULONG cStg,
ULONG cStm,
ULONG cbStmMin,
ULONG cbStmMax) : _pcnChild(NULL),
_pcnSister(NULL),
_pcnParent(NULL),
_cStorages(cStg),
_cStreams(cStm),
_cbMinStream(cbStmMin),
_cbMaxStream(cbStmMax)
{
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("ChanceNode ctor"));
DH_ASSERT(cbStmMin <= cbStmMax);
}
//+--------------------------------------------------------------------------
// Member: ChanceNode::~ChanceNode, public
//
// Synopsis: Destructor. Deletes any children and sisters.
//
// Arguments: None.
//
// Returns: Nothing.
//
// History: DeanE 12-Mar-96 Created
//---------------------------------------------------------------------------
ChanceNode::~ChanceNode()
{
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("ChanceNode dtor"));
delete _pcnChild;
delete _pcnSister;
}
//+--------------------------------------------------------------------------
// Member: ChanceNode::AppendChildStorage, public
//
// Synopsis: Appends the node passed to the end of this nodes' child
// node chain.
//
// Arguments: [pcnNew] - The new node to append.
//
// Returns: S_OK for success or an error code.
//
// History: DeanE 12-Mar-96 Created
//---------------------------------------------------------------------------
HRESULT ChanceNode::AppendChildStorage(ChanceNode *pcnNew)
{
ChanceNode *pcnTrav = this;
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("ChanceNode::AppendChildStorage"));
// Find the last child in the structure
//
while (NULL != pcnTrav->_pcnChild)
{
pcnTrav = pcnTrav->_pcnChild;
}
// Append the new node as a child of the last node,
// increase the number of storages of the last node,
// and make the new node point to the last node as it's parent
//
pcnTrav->_pcnChild = pcnNew;
pcnTrav->_cStorages++;
pcnNew->_pcnParent = pcnTrav;
return(S_OK);
}
//+--------------------------------------------------------------------------
// Member: ChanceNode::AppendSisterStorage, public
//
// Synopsis: Appends the node passed to the end of this nodes' sister
// node chain.
//
// Arguments: [pcnNew] - The new node to append.
//
// Returns: S_OK for success or an error code.
//
// History: DeanE 12-Mar-96 Created
//---------------------------------------------------------------------------
HRESULT ChanceNode::AppendSisterStorage(ChanceNode *pcnNew)
{
ChanceNode *pcnTrav = this;
DH_FUNCENTRY(NULL, DH_LVL_DFLIB, _TEXT("ChanceNode::AppendSisterStorage"));
// Find the last sister of this node
//
while (NULL != pcnTrav->_pcnSister)
{
pcnTrav = pcnTrav->_pcnSister;
}
// Append the new node as a sister of the last node,
// increase the number of storages of this nodes' parent,
// and make the new node point to this nodes parent as it's parent
//
pcnTrav->_pcnSister = pcnNew;
pcnTrav->_pcnParent->_cStorages++;
pcnNew->_pcnParent = pcnTrav->_pcnParent;
return(S_OK);
}