224 lines
6.5 KiB
C++
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
|