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.
260 lines
6.3 KiB
260 lines
6.3 KiB
/*++
|
|
Module Name:
|
|
DfsRep.cpp
|
|
|
|
Abstract:
|
|
This COM Class provides method to get information of Dfs replica.
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include "DfsCore.h"
|
|
#include "DfsRep.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDfsReplica
|
|
|
|
CDfsReplica::CDfsReplica()
|
|
{
|
|
dfsDebugOut((_T("CDfsReplica::CDfsReplica this=%p\n"), this));
|
|
}
|
|
|
|
CDfsReplica::~CDfsReplica()
|
|
{
|
|
dfsDebugOut((_T("CDfsReplica::~CDfsReplica this=%p\n"), this));
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// get_State
|
|
|
|
STDMETHODIMP CDfsReplica :: get_State
|
|
(
|
|
long* pVal
|
|
)
|
|
{
|
|
if (!pVal)
|
|
return E_INVALIDARG;
|
|
|
|
*pVal = m_lDfsReferralState;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// put_State
|
|
|
|
|
|
STDMETHODIMP CDfsReplica :: put_State
|
|
(
|
|
long newVal
|
|
)
|
|
{
|
|
DFS_INFO_101 DfsInfoLevel101 = {0};
|
|
|
|
if (DFS_REFERRAL_STATE_OFFLINE == newVal)
|
|
DfsInfoLevel101.State = DFS_STORAGE_STATE_OFFLINE;
|
|
else if (DFS_REFERRAL_STATE_ONLINE == newVal)
|
|
DfsInfoLevel101.State = DFS_STORAGE_STATE_ONLINE;
|
|
else
|
|
return E_INVALIDARG;
|
|
|
|
NET_API_STATUS nstatRetVal = NetDfsSetInfo (
|
|
m_bstrEntryPath,
|
|
m_bstrStorageServerName,
|
|
m_bstrStorageShareName,
|
|
101,
|
|
(LPBYTE) &DfsInfoLevel101
|
|
);
|
|
|
|
dfsDebugOut((_T("NetDfsSetInfo entry=%s, server=%s, share=%s, level 101 for State, nRet=%d\n"),
|
|
m_bstrEntryPath, m_bstrStorageServerName, m_bstrStorageShareName, nstatRetVal));
|
|
|
|
|
|
if (NERR_Success == nstatRetVal)
|
|
m_lDfsReferralState = newVal;
|
|
|
|
return HRESULT_FROM_WIN32 (nstatRetVal);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// get_StorageServerName
|
|
|
|
|
|
STDMETHODIMP CDfsReplica :: get_StorageServerName
|
|
(
|
|
BSTR* pVal
|
|
)
|
|
{
|
|
if (!pVal)
|
|
return E_INVALIDARG;
|
|
|
|
*pVal = m_bstrStorageServerName.Copy ();
|
|
if (!*pVal)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// get_StorageShareName
|
|
|
|
|
|
STDMETHODIMP CDfsReplica :: get_StorageShareName
|
|
(
|
|
BSTR* pVal
|
|
)
|
|
{
|
|
if (!pVal)
|
|
return E_INVALIDARG;
|
|
|
|
*pVal = m_bstrStorageShareName.Copy ();
|
|
if (!*pVal)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Initialize
|
|
|
|
|
|
STDMETHODIMP CDfsReplica :: Initialize
|
|
(
|
|
BSTR i_szEntryPath,
|
|
BSTR i_szStorageServerName,
|
|
BSTR i_szStorageShareName,
|
|
long i_lDfsStorageState
|
|
)
|
|
{
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the DfsReplica object. Should be called after CoCreateInstance.
|
|
If initialisation fails all properties will be NULL.
|
|
|
|
Arguments:
|
|
|
|
i_szEntryPath - The entry path to the Replica.
|
|
i_szStorageServerName - The name of the server which hosts the share the replica exists on.
|
|
i_szStorageShareName - The name of the share.
|
|
--*/
|
|
|
|
if (!i_szEntryPath || !i_szStorageServerName || !i_szStorageShareName)
|
|
return E_INVALIDARG;
|
|
|
|
_FreeMemberVariables ();
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
do {
|
|
m_bstrEntryPath = i_szEntryPath;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)m_bstrEntryPath, &hr);
|
|
m_bstrStorageServerName = i_szStorageServerName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)m_bstrStorageServerName, &hr);
|
|
m_bstrStorageShareName = i_szStorageShareName;
|
|
BREAK_OUTOFMEMORY_IF_NULL((BSTR)m_bstrStorageShareName, &hr);
|
|
|
|
if (DFS_STORAGE_STATE_ONLINE == i_lDfsStorageState)
|
|
{
|
|
m_lDfsReferralState = DFS_REFERRAL_STATE_ONLINE;
|
|
} else if (DFS_STORAGE_STATE_OFFLINE == i_lDfsStorageState)
|
|
{
|
|
m_lDfsReferralState = DFS_REFERRAL_STATE_OFFLINE;
|
|
} else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
break;
|
|
}
|
|
|
|
} while (0);
|
|
|
|
if (FAILED(hr))
|
|
_FreeMemberVariables ();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// get_EntryPath
|
|
|
|
|
|
STDMETHODIMP CDfsReplica :: get_EntryPath
|
|
(
|
|
BSTR* pVal
|
|
)
|
|
{
|
|
if (!pVal)
|
|
return E_INVALIDARG;
|
|
|
|
*pVal = m_bstrEntryPath.Copy ();
|
|
|
|
if (!*pVal)
|
|
return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// FindTarget
|
|
|
|
|
|
STDMETHODIMP CDfsReplica::FindTarget
|
|
(
|
|
)
|
|
{
|
|
PDFS_INFO_3 pDfsInfo = NULL;
|
|
NET_API_STATUS nstatRetVal = NetDfsGetInfo (
|
|
m_bstrEntryPath,
|
|
m_bstrStorageServerName,
|
|
m_bstrStorageShareName,
|
|
3,
|
|
(LPBYTE*)&pDfsInfo
|
|
);
|
|
|
|
dfsDebugOut((_T("NetDfsGetInfo entry=%s, server=%s, share=%s, level 3 for FindTarget, nRet=%d\n"),
|
|
m_bstrEntryPath, m_bstrStorageServerName, m_bstrStorageShareName, nstatRetVal));
|
|
|
|
if (nstatRetVal != NERR_Success)
|
|
{
|
|
if (nstatRetVal == NERR_DfsNoSuchVolume)
|
|
return S_FALSE;
|
|
else
|
|
return HRESULT_FROM_WIN32(nstatRetVal);
|
|
}
|
|
|
|
BOOL bFound = FALSE;
|
|
LPDFS_STORAGE_INFO pStorageInfo = pDfsInfo->Storage;
|
|
|
|
for (UINT i=0; i < pDfsInfo->NumberOfStorages; i++, pStorageInfo++)
|
|
{
|
|
if ( !lstrcmpi(pStorageInfo->ServerName, m_bstrStorageServerName) &&
|
|
!lstrcmpi(pStorageInfo->ShareName, m_bstrStorageShareName) )
|
|
{
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
NetApiBufferFree(pDfsInfo);
|
|
|
|
return (bFound ? S_OK : S_FALSE);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// _FreeMemberVariables
|
|
|
|
|
|
void CDfsReplica :: _FreeMemberVariables ()
|
|
{
|
|
m_bstrEntryPath.Empty();
|
|
m_bstrStorageServerName.Empty();
|
|
m_bstrStorageShareName.Empty();
|
|
m_lDfsReferralState = DFS_REFERRAL_STATE_OFFLINE;
|
|
}
|