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.
232 lines
6.2 KiB
232 lines
6.2 KiB
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 2001, Microsoft Corporation
|
|
//
|
|
// File: DfsServerSiteInfo.hxx
|
|
//
|
|
// Contents: the Dfs Site Information class.
|
|
//
|
|
// Classes: DfsServerSiteInfo
|
|
//
|
|
// History: Jan. 8 2001, Author: udayh
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef __DFS_SITE_SUPPORT__
|
|
#define __DFS_SITE_SUPPORT__
|
|
|
|
#include "DfsGeneric.hxx"
|
|
#include "DfsServerSiteInfo.hxx"
|
|
#include "dfsnametable.h"
|
|
|
|
class DfsServerSiteInfo;
|
|
|
|
class DfsSiteSupport: public DfsGeneric
|
|
{
|
|
private:
|
|
struct _DFS_NAME_TABLE *_pServerTable;
|
|
|
|
public:
|
|
|
|
~DfsSiteSupport(void)
|
|
{
|
|
|
|
}
|
|
|
|
DFSSTATUS
|
|
DfsInitializeSiteSupport(void)
|
|
{
|
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
|
DFSSTATUS Status = ERROR_SUCCESS;
|
|
|
|
NtStatus = DfsInitializeNameTable ( 0,
|
|
&_pServerTable );
|
|
Status = RtlNtStatusToDosError(NtStatus);
|
|
|
|
return Status;
|
|
}
|
|
|
|
static DfsSiteSupport *
|
|
DfsCreateSiteSupport(DFSSTATUS * pStatus)
|
|
{
|
|
DFSSTATUS Status = ERROR_SUCCESS;
|
|
DfsSiteSupport * pNewSiteTable = NULL;
|
|
|
|
pNewSiteTable = new DfsSiteSupport();
|
|
if(pNewSiteTable == NULL)
|
|
{
|
|
Status = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
else
|
|
{
|
|
Status = pNewSiteTable->DfsInitializeSiteSupport();
|
|
if(Status != ERROR_SUCCESS)
|
|
{
|
|
pNewSiteTable->ReleaseReference();
|
|
pNewSiteTable = NULL;
|
|
}
|
|
}
|
|
|
|
*pStatus = Status;
|
|
return pNewSiteTable;
|
|
}
|
|
|
|
DFSSTATUS
|
|
LookupServerSiteInfo(
|
|
PUNICODE_STRING pServerName,
|
|
DfsServerSiteInfo **ppServerInfo)
|
|
{
|
|
DFSSTATUS Status = ERROR_SUCCESS;
|
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
|
PVOID pData = NULL;
|
|
|
|
NtStatus = DfsNameTableAcquireReadLock( _pServerTable );
|
|
|
|
if ( NtStatus == STATUS_SUCCESS )
|
|
{
|
|
NtStatus = DfsLookupNameTableLocked( _pServerTable,
|
|
pServerName,
|
|
&pData );
|
|
if (NtStatus == STATUS_SUCCESS)
|
|
{
|
|
Status = ERROR_SUCCESS;
|
|
*ppServerInfo = (DfsServerSiteInfo *)pData;
|
|
(*ppServerInfo)->AcquireReference();
|
|
}
|
|
DfsNameTableReleaseLock( _pServerTable );
|
|
}
|
|
|
|
if ( NtStatus != STATUS_SUCCESS )
|
|
{
|
|
Status = ERROR_NOT_FOUND;
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
|
|
DFSSTATUS
|
|
AddServerSiteInfo(
|
|
PUNICODE_STRING pServerName,
|
|
DfsServerSiteInfo **ppServerInfo)
|
|
{
|
|
DFSSTATUS Status = ERROR_SUCCESS;
|
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
|
DfsServerSiteInfo *pNewServer = NULL;
|
|
|
|
//
|
|
// Create and initialize a ServerSiteInfo instance to insert.
|
|
//
|
|
pNewServer = DfsServerSiteInfo::DfsCreateServerSiteInfo(&Status,
|
|
pServerName );
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
*ppServerInfo = pNewServer;
|
|
|
|
NtStatus = DfsNameTableAcquireWriteLock( _pServerTable );
|
|
|
|
if ( NtStatus == STATUS_SUCCESS )
|
|
{
|
|
NtStatus = DfsReplaceInNameTableLocked( _pServerTable,
|
|
pNewServer->GetServerName(),
|
|
(PVOID *)(&pNewServer));
|
|
if (NtStatus == STATUS_SUCCESS)
|
|
{
|
|
(*ppServerInfo)->AcquireReference();
|
|
|
|
//if we get something back, then release the reference
|
|
if(pNewServer)
|
|
{
|
|
pNewServer->ReleaseReference();
|
|
pNewServer = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pNewServer->ReleaseReference();
|
|
*ppServerInfo = NULL;
|
|
}
|
|
|
|
DfsNameTableReleaseLock( _pServerTable );
|
|
}
|
|
else
|
|
{
|
|
pNewServer->ReleaseReference();
|
|
*ppServerInfo = NULL;
|
|
}
|
|
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
|
|
DFSSTATUS
|
|
GetServerSiteInfo(
|
|
IN PUNICODE_STRING pServerName,
|
|
OUT DfsServerSiteInfo **ppServerInfo,
|
|
OUT BOOLEAN * CacheHit,
|
|
IN BOOLEAN SyncThread )
|
|
{
|
|
DFSSTATUS Status = ERROR_SUCCESS;
|
|
|
|
//
|
|
// See if we have this ServerName-to-Site
|
|
// mapping cached already.
|
|
//
|
|
Status = LookupServerSiteInfo( pServerName,
|
|
ppServerInfo );
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
*CacheHit = TRUE;
|
|
|
|
//
|
|
// If it is time to refresh this entry,
|
|
// get rid of it and add a new one.
|
|
//
|
|
Status = (*ppServerInfo)->Refresh();
|
|
if(SyncThread && (Status == ERROR_SUCCESS))
|
|
{
|
|
(*ppServerInfo)->ReleaseReference();
|
|
|
|
Status = AddServerSiteInfo( pServerName,
|
|
ppServerInfo );
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// We are done. We found what we want in the cache.
|
|
//
|
|
Status = ERROR_SUCCESS;
|
|
}
|
|
} else {
|
|
//
|
|
// Create a new entry and put in the cache.
|
|
//
|
|
Status = AddServerSiteInfo( pServerName,
|
|
ppServerInfo );
|
|
*CacheHit = FALSE;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
|
|
DFSSTATUS
|
|
ReleaseServerSiteInfo(
|
|
DfsServerSiteInfo *pServerInfo )
|
|
{
|
|
pServerInfo->ReleaseReference();
|
|
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
private:
|
|
|
|
DfsSiteSupport() : DfsGeneric(DFS_OBJECT_TYPE_SITE_SUPPORT)
|
|
{
|
|
_pServerTable = NULL;
|
|
}
|
|
};
|
|
|
|
#endif __DFS_SITE_SUPPORT__
|