/// <summary> /// Initializes a FastTransfer operation to download properties and descendant subobjects for a specified folder. /// </summary> /// <param name="serverId">A 32-bit signed integer represent the Identity of server.</param> /// <param name="sourceHandleIndex">Folder object handle index. </param> /// <param name="copyFlag">Defines parameters of the FastTransfer download operation.</param> /// <param name="option">Defines the parameters of a download operation.</param> /// <param name="copyFolderHandleIndex">The folder handle index.</param> /// <returns>Indicate the result of this ROP operation.</returns> public RopResult FastTransferSourceCopyFolder(int serverId, int sourceHandleIndex, CopyFolderCopyFlags copyFlag, SendOptionAlls option, out int copyFolderHandleIndex) { // Initialize return value. copyFolderHandleIndex = -1; RopResult result = RopResult.InvalidParameter; uint targetFolderHandle = this.handleContainer[sourceHandleIndex]; // Move flag only used in exchangeServer2007 if (!Common.IsRequirementEnabled(526001, this.Site) && copyFlag == CopyFolderCopyFlags.Move) { return result; } this.streamType = FastTransferStreamType.TopFolder; // Construct ROP request. RopFastTransferSourceCopyFolderRequest fastTransferSourceCopyFolderRequest; fastTransferSourceCopyFolderRequest.RopId = 0x4C; fastTransferSourceCopyFolderRequest.LogonId = 0x00; fastTransferSourceCopyFolderRequest.InputHandleIndex = 0x00; fastTransferSourceCopyFolderRequest.OutputHandleIndex = 0x01; fastTransferSourceCopyFolderRequest.CopyFlags = (byte)copyFlag; fastTransferSourceCopyFolderRequest.SendOptions = (byte)option; this.folderCopyFlag = copyFlag; // Send request and get response. RopFastTransferSourceCopyFolderResponse response = (RopFastTransferSourceCopyFolderResponse)this.Process(serverId, fastTransferSourceCopyFolderRequest, targetFolderHandle); result = (RopResult)response.ReturnValue; if (result == RopResult.Success) { copyFolderHandleIndex = AdapterHelper.GetHandleIndex(); this.handleContainer.Add(copyFolderHandleIndex, this.responseSOHs[response.OutputHandleIndex]); } // Verify ROP FastTransferSourceCopyFolder this.VerifyRopFastTransferSourceCopyFolder(fastTransferSourceCopyFolderRequest, response); return result; }
public static RopResult FastTransferSourceCopyFolder(int serverId, int folderHandleIndex, CopyFolderCopyFlags copyFlag, SendOptionAlls option, out int downloadContextHandleIndex) { // The contraction conditions. Condition.IsTrue(connections.Count > 0); Condition.IsTrue(connections.Keys.Contains(serverId)); // Initialize the return value. RopResult result = RopResult.InvalidParameter; // Modify the logical if ((option == SendOptionAlls.Invalid && (requirementContainer.ContainsKey(3487) && requirementContainer[3487])) || (copyFlag == CopyFolderCopyFlags.Invalid && (requirementContainer.ContainsKey(3483) && requirementContainer[3483]))) { // SendOption is Invalid parameter and CopyFolderCopyFlags is Invalid parameter. downloadContextHandleIndex = -1; return result; } else if (copyFlag == CopyFolderCopyFlags.Move && (requirementContainer.ContainsKey(526001) && !requirementContainer[526001])) { downloadContextHandleIndex = -1; ModelHelper.CaptureRequirement( 526001, @"[In Appendix A: Product Behavior] [CopyFlags] [When the flag name is Move, value is 0x01] Implementation does set the Move flag on a download operation to indicate the following: The server does not output any objects in a FastTransfer stream that the client does not have permissions to delete. <7> Section 2.2.3.1.1.4.1: In Exchange 2007, the Move bit flag is read by the server."); return result; } else { ConnectionData changeConnection = connections[serverId]; // Identify whether the current folder is existent or not. bool isFolderExist = false; foreach (AbstractFolder tempFolder in changeConnection.FolderContainer) { if (tempFolder.FolderHandleIndex == folderHandleIndex) { isFolderExist = true; } } Condition.IsTrue(isFolderExist); // Create a new download context. AbstractDownloadInfo downloadInfo = new AbstractDownloadInfo(); downloadContextHandleIndex = AdapterHelper.GetHandleIndex(); downloadInfo.DownloadHandleIndex = downloadContextHandleIndex; connections.Remove(serverId); // Record the FastTransferOperation and Stream Type. downloadInfo.AbstractFastTransferStreamType = FastTransferStreamType.TopFolder; downloadInfo.RelatedFastTransferOperation = EnumFastTransferOperation.FastTransferSourceCopyFolder; priorDownloadOperation = PriorDownloadOperation.RopFastTransferSourceCopyFolder; // Set value for new download context. downloadInfo.CopyFolderCopyFlag = copyFlag; downloadInfo.Sendoptions = option; downloadInfo.ObjectType = ObjectType.Folder; downloadInfo.RelatedObjectHandleIndex = folderHandleIndex; // Add new download context to downloadContainer. changeConnection.DownloadContextContainer = changeConnection.DownloadContextContainer.Add(downloadInfo); connections.Add(serverId, changeConnection); result = RopResult.Success; // If the server returns success result, it means the RopFastTransferSourceCopyFolder ROP initializes the FastTransfer operation successfully. And then this requirement can be captured. ModelHelper.CaptureRequirement( 502, @"[In RopFastTransferSourceCopyFolder ROP] The RopFastTransferSourceCopyFolder ROP ([MS-OXCROPS] section 2.2.12.4) initializes a FastTransfer operation to download properties and descendant subobjects for a specified folder."); } return result; }