WindowsXP-SP1/base/fs/dfs/dfsm/server/svclist.hxx
2020-09-30 16:53:49 +02:00

224 lines
6.5 KiB
C++

//+----------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation
//
// File: svclist.hxx
//
// Contents: A CDfsServiceList class to make things easy for other code.
// This class manipulates the ServiceList on the volume object.
//
// Classes:
//
// Functions:
//
// History: 27-Jan-93 SudK Created.
//
//-----------------------------------------------------------------------------
#ifndef __DFS_SERVICE_LIST_INCLUDED
#define __DFS_SERVICE_LIST_INCLUDED
#include "service.hxx"
//+-------------------------------------------------------------------------
//
// Name: CDfsServiceList
//
// Synopsis: Wrapper for the ServiceList(s) on the volume objects. All
// operations on the ServiecList property should be done through
// this class.
//
// Methods: ~CDfsServiceList
// CDfsServiceList
// InitializeServiceList
// GetServiceCount
// GetService
// GetServiceFromPrincipalName
// SetNewService
// DeleteService
// GetFirstService
// GetNextService
//
// History: 27-Jan-93 SudK Created.
//
//--------------------------------------------------------------------------
class CDfsServiceList
{
friend class CDfsVolume;
private:
//
// This is a list of class instances of CDfsService which
// we get from the volume object itself.
//
CDfsService *_pDfsSvcList;
ULONG _cSvc;
CDfsService *_pDeletedSvcList;
ULONG _cDeletedSvc;
BYTE *_SvcListBuffer;
ULONG _cbSvcListBuffer;
GUID _ReplicaSetID;
CStorage *_pPSStg;
BOOLEAN _fInitialised;
public:
//
// Destructor for Class
//
~CDfsServiceList();
//
// Constructor for Class
//
CDfsServiceList();
DWORD InitializeServiceList(
CStorage *pPSStg);
DWORD SetNullSvcList(
CStorage *pPSStg);
ULONG GetServiceCount(void) {
return(_cSvc);
}
DWORD GetService(
PDFS_REPLICA_INFO pReplicaInfo,
CDfsService **ppDfsSvc);
DWORD GetDeletedService(
PDFS_REPLICA_INFO pReplicaInfo,
CDfsService **ppDfsSvc);
DWORD GetServiceFromPrincipalName(
WCHAR CONST *pwszSvcName,
CDfsService **ppDfsSvc);
DWORD SetNewService(
CDfsService *pService);
DWORD DeleteService(
CDfsService *pService,
CONST BOOLEAN fAddToDeletedList = TRUE);
CDfsService * GetFirstService() {
return(_pDfsSvcList);
}
CDfsService * GetNextService(CDfsService *pService) {
return(pService->Next == _pDfsSvcList ? NULL : pService->Next);
}
private:
//
// Private methods which are used by the above methods are
// defined here.
//
DWORD ReadServiceListProperty(void);
DWORD DeSerializeBuffer(
PBYTE pBuffer,
ULONG *pcSvc,
CDfsService **ppSvcList,
ULONG *pcDeletedSvc,
CDfsService **ppDeletedSvcList);
DWORD DeSerializeSvcList(void);
DWORD DeSerializeReconcileList(
MARSHAL_BUFFER *pMarshalBuffer,
ULONG *pcSvc,
CDfsService **ppSvcList,
ULONG *pcDeletedSvc,
CDfsService **ppDeletedSvcList);
DWORD SerializeSvcList(void);
DWORD SetServiceListProperty(BOOLEAN bCreate);
DWORD ReconcileSvcList(
ULONG cSvc,
CDfsService *pSvcList,
ULONG cDeletedSvc,
CDfsService *pDeletedSvcList);
void InsertNewService(CDfsService *pService) {
InsertServiceInList( _pDfsSvcList, pService );
_cSvc++;
}
void RemoveService(CDfsService *pService) {
RemoveServiceFromList( _pDfsSvcList, pService );
_cSvc--;
}
void InsertDeletedService(CDfsService *pService) {
DWORD dwErr;
CDfsService *pExistingSvc;
dwErr = GetDeletedService(
&pService->_DfsReplicaInfo,
&pExistingSvc);
if (dwErr == ERROR_SUCCESS) {
pExistingSvc->_ftModification = pService->_ftModification;
} else {
InsertServiceInList( _pDeletedSvcList, pService );
_cDeletedSvc++;
}
}
void RemoveDeletedService(CDfsService *pService) {
RemoveServiceFromList( _pDeletedSvcList, pService );
_cDeletedSvc--;
}
CDfsService * GetFirstDeletedService() {
return(_pDeletedSvcList);
}
CDfsService * GetNextDeletedService(CDfsService *pService) {
return(pService->Next == _pDeletedSvcList ? NULL : pService->Next);
}
DWORD GetDeletedServiceFromPrincipalName(
WCHAR CONST *pwszSvcName,
CDfsService **ppDfsSvc);
void InsertServiceInList(CDfsService *&pSvcList, CDfsService *&pSvc) {
if (pSvcList == NULL) {
pSvcList = pSvc;
pSvc->Next = pSvc;
pSvc->Prev = pSvc;
} else {
pSvc->Next = pSvcList;
pSvc->Prev = pSvcList->Prev;
pSvcList->Prev->Next = pSvc;
pSvcList->Prev = pSvc;
pSvcList = pSvc;
}
}
void RemoveServiceFromList(CDfsService *&pSvcList, CDfsService *&pSvc) {
if (pSvc->Next != pSvc) {
if (pSvcList == pSvc) {
pSvcList = pSvc->Next;
}
pSvc->Prev->Next = pSvc->Next;
pSvc->Next->Prev = pSvc->Prev;
} else {
pSvcList = NULL;
}
}
};
#endif