/// <summary> /// Imports deletions of messages or folders into the server replica. /// </summary> /// <param name="serverId">A 32-bit signed integer represent the Identity of server</param> /// <param name="uploadcontextHandleIndex">Synchronization upload context handle</param> /// <param name="objIdIndexes">more object id</param> /// <param name="importDeleteFlag">Deletions type</param> /// <returns>Indicate the result of this ROP operation.</returns> public RopResult SynchronizationImportDeletes(int serverId, int uploadcontextHandleIndex, Sequence<int> objIdIndexes, byte importDeleteFlag) { // Initialize ROP data. uint synchronizationImportDeletesHandle = this.handleContainer[uploadcontextHandleIndex]; RopResult result = RopResult.InvalidParameter; RopSynchronizationImportDeletesRequest synchronizationImportDeletesRequest = new RopSynchronizationImportDeletesRequest(); RopSynchronizationImportDeletesResponse synchronizationImportDeletesResponse = new RopSynchronizationImportDeletesResponse(); // Construct the RopSynchronizationImportDeletes request. synchronizationImportDeletesRequest.RopId = 0x74; synchronizationImportDeletesRequest.InputHandleIndex = 0x00; synchronizationImportDeletesRequest.LogonId = 0x00; synchronizationImportDeletesRequest.IsHierarchy = (byte)importDeleteFlag; this.importDelFlag = importDeleteFlag; synchronizationImportDeletesRequest.PropertyValueCount = (ushort)objIdIndexes.Count; TaggedPropertyValue[] propertyValues = new TaggedPropertyValue[objIdIndexes.Count]; for (int i = 0; i < propertyValues.Length; i++) { TaggedPropertyValue propertyValue = new TaggedPropertyValue(); PropertyTag[] tagArray = new PropertyTag[1]; byte[] deleteGidValue = new byte[sizeof(int) + sizeof(short) + GidLength]; propertyValue.PropertyTag = new PropertyTag(0x0000, 0x1102); // The combination of first two bytes (0x0016) indicates the length of value field. // The amount of id int index = 0; Array.Copy(BitConverter.GetBytes(tagArray.Length), 0, deleteGidValue, 0, sizeof(int)); index += sizeof(int); Array.Copy(BitConverter.GetBytes((short)GidLength), 0, deleteGidValue, index, sizeof(short)); index += sizeof(short); ulong gid = this.objectIdContainer[objIdIndexes[i]]; this.delObjId = gid; byte[] longTermId = this.GetLongTermIdByte(serverId, gid); Array.Copy(longTermId, 0, deleteGidValue, index, longTermId.Length); propertyValue.Value = deleteGidValue; propertyValues[i] = propertyValue; } synchronizationImportDeletesRequest.PropertyValues = propertyValues; // Send the RopSynchronizationImportDeletes request to get the success response. synchronizationImportDeletesResponse = (RopSynchronizationImportDeletesResponse)this.Process(serverId, synchronizationImportDeletesRequest, synchronizationImportDeletesHandle); result = (RopResult)synchronizationImportDeletesResponse.ReturnValue; if (result == RopResult.Success) { this.isNonImportMessageChangeOperation = true; this.hasExecuteSynchronizationImportDeletes = true; } // Verify ROP SynchronizationImportDeletes this.VerifyRopSynchronizationImportDeletes(synchronizationImportDeletesRequest, synchronizationImportDeletesResponse); return result; }
/// <summary> /// Verify RopSynchronizationImportDeletes Response /// </summary> /// <param name="ropSynchronizationImportDeletesResponse">The response of RopSynchronizationImportDeletes request</param> /// <param name="inputHandleIndex">The field of InputHandleIndex in RopSynchronizationImportDeletes request</param> private void VerifyRopSynchronizationImportDeletesResponse(RopSynchronizationImportDeletesResponse ropSynchronizationImportDeletesResponse, byte inputHandleIndex) { // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4083"); // Verify MS-OXCROPS requirement: MS-OXCROPS_R4083 Site.CaptureRequirementIfAreEqual<Type>( typeof(byte), ropSynchronizationImportDeletesResponse.RopId.GetType(), 4083, @"[In RopSynchronizationImportDeletes ROP Response Buffer] RopId (1 byte): An unsigned integer."); // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4085"); // Verify MS-OXCROPS requirement: MS-OXCROPS_R4085 Site.CaptureRequirementIfAreEqual<byte>( (byte)RopId.RopSynchronizationImportDeletes, ropSynchronizationImportDeletesResponse.RopId, 4085, @"[In RopSynchronizationImportDeletes ROP Response Buffer, RopId (1 byte):] For this operation[RopSynchronizationImportDeletes] this field is set to 0x74."); // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4086"); // Verify MS-OXCROPS requirement: MS-OXCROPS_R4086 Site.CaptureRequirementIfAreEqual<Type>( typeof(byte), ropSynchronizationImportDeletesResponse.InputHandleIndex.GetType(), 4086, @"[In RopSynchronizationImportDeletes ROP Response Buffer]InputHandleIndex (1 byte): An unsigned integer."); // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4087"); // Verify MS-OXCROPS requirement: MS-OXCROPS_R4087 Site.CaptureRequirementIfAreEqual<byte>( inputHandleIndex, ropSynchronizationImportDeletesResponse.InputHandleIndex, 4087, @"[In RopSynchronizationImportDeletes ROP Response Buffer, InputHandleIndex (1 byte):] This index MUST be set to the value specified in the InputHandleIndex field in the request."); // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R4089"); // Verify MS-OXCROPS requirement: MS-OXCROPS_R4089 Site.CaptureRequirementIfAreEqual<Type>( typeof(uint), ropSynchronizationImportDeletesResponse.ReturnValue.GetType(), 4089, @"[In RopSynchronizationImportDeletes ROP Response Buffer] ReturnValue (4 bytes): An unsigned integer."); }