//-------------------------------------------------------------------------- // // Copyright (C) 1999, Microsoft Corporation // // File: dfstarget.cxx // //-------------------------------------------------------------------------- #ifndef __DFS_UTIL_TARGET__ #define __DFS_UTIL_TARGET__ #include "dfsheader.h" #include "dfsmisc.h" #include "dfsutil.hxx" #include "dfsStrings.hxx" #define TARGET_SERVER_ADDED 0x0001 #define TARGET_FOLDER_ADDED 0x0002 #define TARGET_STATE_ADDED 0x0004 #define MARK_TARGET_DELETE 0x0010 #define MARK_TARGET_ADD 0x0020 #define UPDATE_TARGET_STATE 0x0040 extern DWORD GetSites(LPWSTR Target, DfsString *pSite ); class DfsTarget { private: ULONG _Flags; DfsString _Server; DfsString _Folder; DfsString _SiteName; ULONG _State; DfsTarget *_pNextTarget; ULONG _ChangeStatus; public: DfsTarget( ) { _Flags = 0; _State = DFS_STORAGE_STATE_ONLINE; _pNextTarget = NULL; _ChangeStatus = 0; } ~DfsTarget( ) { // // Take care to release all resources // here // } VOID ResetChangeStatus() { _ChangeStatus = 0; } VOID SetChangeStatus(ULONG State) { _ChangeStatus |= State; } DFSSTATUS ValidateTargetName( PUNICODE_STRING pTargetName, PUNICODE_STRING pServerName, PUNICODE_STRING pFolderName ) { DFSSTATUS Status; Status = DfsGetFirstComponent( pTargetName, pServerName, pFolderName ); if (pFolderName->Length == 0) { Status = ERROR_INVALID_PARAMETER; } return Status; } DFSSTATUS SetTargetUNCName( PUNICODE_STRING pTargetName, BOOLEAN SiteAware ) { UNICODE_STRING ServerName; UNICODE_STRING FolderName; DFSSTATUS Status = ERROR_SUCCESS; Status = ValidateTargetName( pTargetName, &ServerName, &FolderName ); if (Status == ERROR_SUCCESS) { Status = SetTargetServer(&ServerName, SiteAware); } if (Status == ERROR_SUCCESS) { Status = SetTargetFolder(&FolderName); } return Status; } DFSSTATUS SetTargetUNCName( LPWSTR Target, BOOLEAN SiteAware ) { UNICODE_STRING TargetName; RtlInitUnicodeString( &TargetName, Target); return SetTargetUNCName(&TargetName, SiteAware); } DFSSTATUS SetTargetServer( PUNICODE_STRING pServerName, BOOLEAN SiteAware ) { DFSSTATUS Status = ERROR_SUCCESS; if (_Flags & TARGET_SERVER_ADDED) { Status = ERROR_INVALID_PARAMETER; } if (Status == ERROR_SUCCESS) { Status = _Server.CreateString(pServerName); if (Status == ERROR_SUCCESS) { _Flags |= TARGET_SERVER_ADDED; } if (SiteAware) { if (Status == ERROR_SUCCESS) { GetSites( _Server.GetString(), &_SiteName); } } } return Status; } DFSSTATUS SetTargetServer( LPWSTR Server, BOOLEAN SiteAware ) { UNICODE_STRING ServerName; RtlInitUnicodeString( &ServerName, Server); return SetTargetServer(&ServerName, SiteAware); } DFSSTATUS SetTargetFolder( PUNICODE_STRING pFolderName ) { DFSSTATUS Status = ERROR_SUCCESS; if (_Flags & TARGET_FOLDER_ADDED) { Status = ERROR_INVALID_PARAMETER; } if (Status == ERROR_SUCCESS) { Status = _Folder.CreateString(pFolderName); if (Status == ERROR_SUCCESS) { _Flags |= TARGET_FOLDER_ADDED; } } return Status; } DFSSTATUS SetTargetFolder( LPWSTR Folder ) { UNICODE_STRING FolderName; RtlInitUnicodeString( &FolderName, Folder); return SetTargetFolder(&FolderName); } BOOLEAN IsValidTarget() { return ((_Flags & (TARGET_FOLDER_ADDED | TARGET_SERVER_ADDED)) == (TARGET_FOLDER_ADDED | TARGET_SERVER_ADDED)); } VOID SetTargetState( ULONG State) { _Flags |= TARGET_STATE_ADDED; _State = State; } VOID AddNextTarget( DfsTarget *pTarget ) { _pNextTarget = pTarget; } DfsTarget * GetNextTarget() { return _pNextTarget; } PUNICODE_STRING GetTargetServerCountedString() { return _Server.GetCountedString(); } PUNICODE_STRING GetTargetFolderCountedString() { return _Folder.GetCountedString(); } PUNICODE_STRING GetTargetSiteCountedString() { return _SiteName.GetCountedString(); } LPWSTR GetTargetServerString() { return _Server.GetString(); } LPWSTR GetTargetFolderString() { return _Folder.GetString(); } LPWSTR GetTargetSiteString() { return _SiteName.GetString(); } DWORD GetTargetState() { return _State; } DfsString * GetTargetServer() { return &_Server; } DfsString * GetTargetFolder() { return &_Folder; } BOOLEAN MarkedForDelete() { return ((_ChangeStatus & MARK_TARGET_DELETE) == MARK_TARGET_DELETE); } BOOLEAN MarkedForAddition() { return ((_ChangeStatus & MARK_TARGET_ADD) == MARK_TARGET_ADD); } BOOLEAN MarkedForStateUpdate() { return ((_ChangeStatus & UPDATE_TARGET_STATE) == UPDATE_TARGET_STATE); } DFSSTATUS ApplyApiChanges( DFS_API_MODE Mode, PUNICODE_STRING pLinkName, DfsString *pComment, ULONG Flags, PDFS_UPDATE_STATISTICS pStatistics ) { DFSSTATUS Status = ERROR_SUCCESS; LPWSTR UseComment = NULL; if (pComment) { UseComment = pComment->GetString(); } if (MarkedForDelete()) { Status = DfsApiRemove(Mode, pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString()); if (Status != ERROR_SUCCESS) { ShowInformation((L"DfsRemove failed for %wS (%wS, %wS), Status %x\n", pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString(), Status)); } pStatistics->TargetDeleted++; pStatistics->ApiCount++; return Status; } if (MarkedForAddition()) { Status = DfsApiAdd(Mode, pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString(), UseComment, Flags ); if (Status != ERROR_SUCCESS) { ShowInformation((L"DfsAdd failed for %wS (%wS, %wS), Status %x\n", pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString(), Status)); } pStatistics->TargetAdded++; pStatistics->ApiCount++; } if (MarkedForStateUpdate()) { DFS_API_INFO ApiInfo, *pApiInfo; ApiInfo.Info101.State = GetTargetState(); pApiInfo = &ApiInfo; Status = DfsApiSetInfo( Mode, pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString(), 101, &pApiInfo); if (Status != ERROR_SUCCESS) { ShowInformation((L"DfsSetInfo State %d failed for %wS (%wS, %wS), Status %x\n", ApiInfo.Info101.State, pLinkName->Buffer, GetTargetServerString(), GetTargetFolderString(), Status)); } pStatistics->TargetModified++; pStatistics->ApiCount++; } return Status; } BOOLEAN IsMatchingState( ULONG State) { return (_State == State); } BOOLEAN IsMatchingName( DfsString * pServer, DfsString *pFolder ) { if ((_Server == pServer) && (_Folder == pFolder)) { return TRUE; } return FALSE; } VOID MarkForDelete() { _ChangeStatus = MARK_TARGET_DELETE; } VOID MarkForAddition() { _ChangeStatus = MARK_TARGET_ADD; } }; #endif // __DFS_UTIL_TARGET__