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.
 
 
 
 
 
 

287 lines
8.5 KiB

/*++
Module Name:
DfsJP.h
Abstract:
This module contains the declaration of the DfsJunctionPoint COM Class. This class
provides methods to get information of a junction point and to enumerate
Replicas of the junction point. It implements IDfsJunctionPoint and provides
an enumerator through get__NewEnum().
--*/
#ifndef _DFSJP_H
#define _DFSJP_H
#include "resource.h" // main symbols
#include "dfsenums.h"
#include <list>
using namespace std;
#define ARRAY_COUNT_FOR_DFS_INFO_3 2
#define ARRAY_COUNT_FOR_DFS_STORAGE_INFO 3
class REPLICAINFO
{
public:
CComBSTR m_bstrServerName;
CComBSTR m_bstrShareName;
long m_lDfsStorageState;
HRESULT Init(BSTR bstrServerName, BSTR bstrShareName, long lDfsStorageState)
{
ReSet();
RETURN_INVALIDARG_IF_TRUE(!bstrServerName);
RETURN_INVALIDARG_IF_TRUE(!bstrShareName);
HRESULT hr = S_OK;
do {
m_bstrServerName = bstrServerName;
BREAK_OUTOFMEMORY_IF_NULL((BSTR)m_bstrServerName, &hr);
m_bstrShareName = bstrShareName;
BREAK_OUTOFMEMORY_IF_NULL((BSTR)m_bstrShareName, &hr);
m_lDfsStorageState = lDfsStorageState;
} while (0);
if (FAILED(hr))
ReSet();
return hr;
}
void ReSet()
{
if (m_bstrServerName) m_bstrServerName.Empty();
if (m_bstrShareName) m_bstrShareName.Empty();
m_lDfsStorageState = DFS_STORAGE_STATE_OFFLINE;
}
REPLICAINFO* Copy()
{
REPLICAINFO* pNew = new REPLICAINFO;
if (pNew)
{
HRESULT hr = S_OK;
do {
pNew->m_bstrServerName = m_bstrServerName;
BREAK_OUTOFMEMORY_IF_NULL((BSTR)pNew->m_bstrServerName, &hr);
pNew->m_bstrShareName = m_bstrShareName;
BREAK_OUTOFMEMORY_IF_NULL((BSTR)pNew->m_bstrShareName, &hr);
pNew->m_lDfsStorageState = m_lDfsStorageState;
} while (0);
if (FAILED(hr))
{
delete pNew;
pNew = NULL;
}
}
return pNew;
}
};
typedef list<REPLICAINFO*> REPLICAINFOLIST;
class ATL_NO_VTABLE CDfsJunctionPoint :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDfsJunctionPoint, &CLSID_DfsJunctionPoint>,
public IDispatchImpl<IDfsJunctionPoint, &IID_IDfsJunctionPoint, &LIBID_DFSCORELib>
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_DFSJP)
BEGIN_COM_MAP(CDfsJunctionPoint)
COM_INTERFACE_ENTRY(IDfsJunctionPoint)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// IDfsJunctionPoint
public:
//Contructor.
CDfsJunctionPoint();
//Destructor.
~CDfsJunctionPoint();
// Returns a DfsReplica Enumerator.
STDMETHOD(get__NewEnum)
(
/*[out, retval]*/
LPUNKNOWN *pVal // The IEnumVARIANT Pointer is returned in this.
);
// Returns the number of replicas for
STDMETHOD(get_CountOfDfsReplicas) // this Junction Point
(
/*[out, retval]*/ long *pVal // The number of replicas.
);
// Intialises a DfsJunctionPoint COM
STDMETHOD(Initialize) // Object. Should be called after CoCreateInstance.
(
/*[in]*/ IUnknown *i_piDfsRoot,
/*[in]*/ BSTR i_szEntryPath, // The junction point Dfs Path. Eg. "//DOM/Dfs/JP".
/*[in]*/ BOOL i_bReplicaSetExist,
/*[in]*/ BSTR i_bstrReplicaSetDN
);
// Gets the comment associated with
STDMETHOD(get_Comment) // the Junctionpoint.
(
/*[out, retval]*/ BSTR *pVal // The Comment.
);
// Sets the comment. Sets in memory as
STDMETHOD(put_Comment) // well in the network PKT.
(
/*[in]*/ BSTR newVal
);
// Gets the Junction Name. Justs gets
// the last part of the entry path.
STDMETHOD(get_JunctionName) // E.g "usa\Products" for "\\DOM\Dfs\usa\Products".
(
/*[in]*/ BOOL i_bDfsNameIncluded,
/*[out, retval]*/ BSTR *pVal // The junction name.
);
// Gets the entry path of the junction
STDMETHOD(get_EntryPath) // point. Eg. "\\Dom\Dfs\usa\Products".
(
/*[out, retval]*/ BSTR *pVal
);
// Get Dfs JuncitonPoint State.
STDMETHOD(get_State)
(
/*[out, retval]*/ long *pVal // The state of the junction point.
);
STDMETHOD(get_ReplicaSetDN) // get the prefix DN of the corresponding replica set.
(
/*[out, retval]*/ BSTR *pVal
);
STDMETHOD(get_ReplicaSetExist)
(
/*[out, retval]*/ BOOL *pVal
);
STDMETHOD(get_ReplicaSetExistEx)
(
/*[out]*/ BSTR* o_pbstrDC,
/*[out, retval]*/ BOOL *pVal
);
STDMETHOD(put_ReplicaSetExist)
(
/*[in]*/ BOOL newVal
);
STDMETHOD( AddReplica ) // Adds a new replica to the junction point.
(
/* [in]*/ BSTR i_szServerName,
/* [in]*/ BSTR i_szShareName,
/* [out, retval]*/ VARIANT* o_pvarReplicaObject
);
STDMETHOD( RemoveReplica ) // Removes a Replica from the Junction Point.
(
/* [in]*/ BSTR i_szServerName,
/* [in]*/ BSTR i_szShareName
);
STDMETHOD( RemoveAllReplicas ) // Delete the Junction Point.
(
);
STDMETHOD( get_Timeout )
(
/*[out, retval]*/ long* pVal
);
// Sets the time out for the junction point.
STDMETHOD( put_Timeout )
(
/*[in]*/ long newVal
);
STDMETHOD( DeleteRootReplica )
(
/*[in]*/ BSTR i_bstrDomainName,
/*[in]*/ BSTR i_bstrDfsName,
/*[in]*/ BSTR i_bstrServerName,
/*[in]*/ BSTR i_bstrShareName,
/*[in]*/ BOOL i_bForce
);
STDMETHOD( GetOneRootReplica )
(
/*[out]*/ BSTR* o_pbstrServerName,
/*[out]*/ BSTR* o_pbstrShareName
);
STDMETHOD(InitializeEx)
(
/*[in]*/ IUnknown *piDfsRoot,
/*[in]*/ VARIANT *pVar,
/*[in]*/ BOOL bReplicaSetExist,
/*[in]*/ BSTR bstrReplicaSetDN
);
protected:
//Member Variables
CComPtr<IDfsRoot> m_spiDfsRoot;
CComBSTR m_bstrEntryPath;
CComBSTR m_bstrJunctionName; // given \\ntbuilds\release\dir1\dir2, it's dir1\dir2
CComBSTR m_bstrJunctionNameEx; // given \\ntbuilds\release\dir1\dir2, it's release\dir1\dir2
CComBSTR m_bstrReplicaSetDN;
BOOL m_bReplicaSetExist;
REPLICAINFOLIST m_Replicas; // List of Replicas.
protected:
//Helper Functions
void _FreeMemberVariables();
HRESULT _GetReplicaSetDN
(
BSTR i_szEntryPath
);
HRESULT _GetDfsType(
OUT DFS_TYPE* o_pdwDfsType,
OUT BSTR* o_pbstrDomainName,
OUT BSTR* o_pbstrDomainDN
);
HRESULT _Init(
PDFS_INFO_3 pDfsInfo,
BOOL bReplicaSetExist,
BSTR bstrReplicaSetDN
);
HRESULT _AddToReplicaList
(
BSTR bstrServerName,
BSTR bstrShareName,
long lDfsStorageState
);
void _DeleteFromReplicaList(BSTR bstrServerName, BSTR bstrShareName);
HRESULT _GetDfsStorageState
(
BSTR i_szServerName,
BSTR i_szShareName,
long* o_pVal
);
};
#endif //_DFSJP_H