/// <summary> /// Clear all rules of the inbox folder. /// </summary> protected void ClearAllRules() { // Call RopGetRulesTable with valid TableFlags. RopGetRulesTableResponse ropGetRulesTableResponse; uint ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(this.InboxFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); if (ropGetRulesTableResponse.ReturnValue == 0) { // Get rule ID if rules exist. PropertyTag ruleIDTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; RopQueryRowsResponse queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[1] { ruleIDTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Delete all rules if exist. if (queryRowsResponse.RowCount > 0) { RuleData[] ruleDatas = new RuleData[queryRowsResponse.RowCount]; for (int i = 0; i < queryRowsResponse.RowCount; i++) { ulong ruleId = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[i].PropertyValues[0].Value, 0); RuleProperties ruleProperties = new RuleProperties(); ruleDatas[i] = AdapterHelper.GenerateValidRuleData(ActionType.OP_MARK_AS_READ, TestRuleDataType.ForRemove, 0, RuleState.ST_ENABLED, null, ruleProperties, ruleId); } RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(this.InboxFolderHandle, ModifyRuleFlag.Modify_OnExisting, ruleDatas); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Deleting rule should be success"); // Wait the rule to be deleted Thread.Sleep(this.WaitForTheRuleToTakeEffect); } } }
/// <summary> /// Parse the ROPOutputBuffer structure. /// </summary> /// <param name="s">A stream containing the ROPOutputBuffer structure</param> public override void Parse(Stream s) { base.Parse(s); this.RopSize = ReadUshort(); List<object> ropsList = new List<object>(); List<uint> serverObjectHandleTable = new List<uint>(); List<uint> tempServerObjectHandleTable = new List<uint>(); long currentPosition = s.Position; s.Position += (this.RopSize - 2); while (s.Position < s.Length) { uint serverObjectTable = ReadUint(); tempServerObjectHandleTable.Add(serverObjectTable); } s.Position = currentPosition; if (this.RopSize > 2) { do { int CurrentByte = s.ReadByte(); s.Position -= 1; switch ((RopIdType)CurrentByte) { // MS-OXCSTOR ROPs case RopIdType.RopLogon: if (DecodingContext.SessionLogonFlag != null && DecodingContext.SessionLogonFlag.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.LogonFlags = DecodingContext.SessionLogonFlag[MapiInspector.MAPIInspector.currentParsingSessionID]; } else { throw new MissingInformationException("Missing LogonFlags information for RopLogon", (ushort)CurrentByte, null); } if (((byte)DecodingContext.LogonFlags & 0x01) == (byte)LogonFlags.Private) { RopLogonResponse_PrivateMailboxes RopLogonResponse_PrivateMailboxes = new RopLogonResponse_PrivateMailboxes(); RopLogonResponse_PrivateMailboxes.Parse(s); ropsList.Add(RopLogonResponse_PrivateMailboxes); break; } else { RopLogonResponse_PublicFolders RopLogonResponse_PublicFolders = new RopLogonResponse_PublicFolders(); RopLogonResponse_PublicFolders.Parse(s); ropsList.Add(RopLogonResponse_PublicFolders); break; } case RopIdType.RopGetReceiveFolder: RopGetReceiveFolderResponse RopGetReceiveFolderResponse = new RopGetReceiveFolderResponse(); RopGetReceiveFolderResponse.Parse(s); ropsList.Add(RopGetReceiveFolderResponse); break; case RopIdType.RopSetReceiveFolder: RopSetReceiveFolderResponse RopSetReceiveFolderResponse = new RopSetReceiveFolderResponse(); RopSetReceiveFolderResponse.Parse(s); ropsList.Add(RopSetReceiveFolderResponse); break; case RopIdType.RopGetReceiveFolderTable: RopGetReceiveFolderTableResponse RopGetReceiveFolderTableResponse = new RopGetReceiveFolderTableResponse(); RopGetReceiveFolderTableResponse.Parse(s); ropsList.Add(RopGetReceiveFolderTableResponse); break; case RopIdType.RopGetStoreState: RopGetStoreStateResponse RopGetStoreStateResponse = new RopGetStoreStateResponse(); RopGetStoreStateResponse.Parse(s); ropsList.Add(RopGetStoreStateResponse); break; case RopIdType.RopGetOwningServers: RopGetOwningServersResponse RopGetOwningServersResponse = new RopGetOwningServersResponse(); RopGetOwningServersResponse.Parse(s); ropsList.Add(RopGetOwningServersResponse); break; case RopIdType.RopPublicFolderIsGhosted: RopPublicFolderIsGhostedResponse RopPublicFolderIsGhostedResponse = new RopPublicFolderIsGhostedResponse(); RopPublicFolderIsGhostedResponse.Parse(s); ropsList.Add(RopPublicFolderIsGhostedResponse); break; case RopIdType.RopLongTermIdFromId: RopLongTermIdFromIdResponse RopLongTermIdFromIdResponse = new RopLongTermIdFromIdResponse(); RopLongTermIdFromIdResponse.Parse(s); ropsList.Add(RopLongTermIdFromIdResponse); break; case RopIdType.RopIdFromLongTermId: RopIdFromLongTermIdResponse RopIdFromLongTermIdResponse = new RopIdFromLongTermIdResponse(); RopIdFromLongTermIdResponse.Parse(s); ropsList.Add(RopIdFromLongTermIdResponse); break; case RopIdType.RopGetPerUserLongTermIds: RopGetPerUserLongTermIdsResponse RopGetPerUserLongTermIdsResponse = new RopGetPerUserLongTermIdsResponse(); RopGetPerUserLongTermIdsResponse.Parse(s); ropsList.Add(RopGetPerUserLongTermIdsResponse); break; case RopIdType.RopGetPerUserGuid: RopGetPerUserGuidResponse RopGetPerUserGuidResponse = new RopGetPerUserGuidResponse(); RopGetPerUserGuidResponse.Parse(s); ropsList.Add(RopGetPerUserGuidResponse); break; case RopIdType.RopReadPerUserInformation: RopReadPerUserInformationResponse RopReadPerUserInformationResponse = new RopReadPerUserInformationResponse(); RopReadPerUserInformationResponse.Parse(s); ropsList.Add(RopReadPerUserInformationResponse); break; case RopIdType.RopWritePerUserInformation: RopWritePerUserInformationResponse RopWritePerUserInformationResponse = new RopWritePerUserInformationResponse(); RopWritePerUserInformationResponse.Parse(s); ropsList.Add(RopWritePerUserInformationResponse); break; // MS-OXCROPS ROPs case RopIdType.RopSubmitMessage: RopSubmitMessageResponse RopSubmitMessageResponse = new RopSubmitMessageResponse(); RopSubmitMessageResponse.Parse(s); ropsList.Add(RopSubmitMessageResponse); break; case RopIdType.RopAbortSubmit: RopAbortSubmitResponse RopAbortSubmitResponse = new RopAbortSubmitResponse(); RopAbortSubmitResponse.Parse(s); ropsList.Add(RopAbortSubmitResponse); break; case RopIdType.RopGetAddressTypes: RopGetAddressTypesResponse RopGetAddressTypesResponse = new RopGetAddressTypesResponse(); RopGetAddressTypesResponse.Parse(s); ropsList.Add(RopGetAddressTypesResponse); break; case RopIdType.RopSetSpooler: RopSetSpoolerResponse RopSetSpoolerResponse = new RopSetSpoolerResponse(); RopSetSpoolerResponse.Parse(s); ropsList.Add(RopSetSpoolerResponse); break; case RopIdType.RopSpoolerLockMessage: RopSpoolerLockMessageResponse RopSpoolerLockMessageResponse = new RopSpoolerLockMessageResponse(); RopSpoolerLockMessageResponse.Parse(s); ropsList.Add(RopSpoolerLockMessageResponse); break; case RopIdType.RopTransportSend: RopTransportSendResponse RopTransportSendResponse = new RopTransportSendResponse(); RopTransportSendResponse.Parse(s); ropsList.Add(RopTransportSendResponse); break; case RopIdType.RopTransportNewMail: RopTransportNewMailResponse RopTransportNewMailResponse = new RopTransportNewMailResponse(); RopTransportNewMailResponse.Parse(s); ropsList.Add(RopTransportNewMailResponse); break; case RopIdType.RopGetTransportFolder: RopGetTransportFolderResponse RopGetTransportFolderResponse = new RopGetTransportFolderResponse(); RopGetTransportFolderResponse.Parse(s); ropsList.Add(RopGetTransportFolderResponse); break; case RopIdType.RopOptionsData: RopOptionsDataResponse RopOptionsDataResponse = new RopOptionsDataResponse(); RopOptionsDataResponse.Parse(s); ropsList.Add(RopOptionsDataResponse); break; case RopIdType.RopBackoff: RopBackoffResponse RopBackoffResponse = new RopBackoffResponse(); RopBackoffResponse.Parse(s); ropsList.Add(RopBackoffResponse); break; case RopIdType.RopBufferTooSmall: if (DecodingContext.SessionRequestRemainSize != null && DecodingContext.SessionRequestRemainSize.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { uint RequestBuffersSize = 0; int RopCountInResponse = ropsList.Count; if (DecodingContext.SessionRequestRemainSize[MapiInspector.MAPIInspector.currentParsingSessionID].Count > RopCountInResponse) { RequestBuffersSize = DecodingContext.SessionRequestRemainSize[MapiInspector.MAPIInspector.currentParsingSessionID][RopCountInResponse - 1]; } RopBufferTooSmallResponse RopBufferTooSmallResponse = new RopBufferTooSmallResponse(RequestBuffersSize); RopBufferTooSmallResponse.Parse(s); ropsList.Add(RopBufferTooSmallResponse); break; } else { throw new MissingInformationException("Missing RequestBuffersSize information for RopBufferTooSmall", (ushort)CurrentByte, null); } // MSOXCTABL ROPs case RopIdType.RopSetColumns: RopSetColumnsResponse RopSetColumnsResponse = new RopSetColumnsResponse(); RopSetColumnsResponse.Parse(s); ropsList.Add(RopSetColumnsResponse); if ((ErrorCodes)RopSetColumnsResponse.ReturnValue == ErrorCodes.Success) { if (DecodingContext.SetColumnProTagMap_Index != null && DecodingContext.SetColumnProTagMap_Index.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID) && DecodingContext.SetColumnProTagMap_Index[MapiInspector.MAPIInspector.currentParsingSessionID].ContainsKey(RopSetColumnsResponse.InputHandleIndex)) { if (DecodingContext.SetColumnProTagMap_Handle.Count == 0) { Dictionary<uint, PropertyTag[]> dic = new Dictionary<uint, PropertyTag[]>(); dic.Add(tempServerObjectHandleTable[RopSetColumnsResponse.InputHandleIndex], DecodingContext.SetColumnProTagMap_Index[MapiInspector.MAPIInspector.currentParsingSessionID][RopSetColumnsResponse.InputHandleIndex]); DecodingContext.SetColumnProTagMap_Handle.Add(MapiInspector.MAPIInspector.currentParsingSessionID, dic); } else if (DecodingContext.SetColumnProTagMap_Handle.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID) && DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].ContainsKey(tempServerObjectHandleTable[RopSetColumnsResponse.InputHandleIndex])) { DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].Remove(tempServerObjectHandleTable[RopSetColumnsResponse.InputHandleIndex]); DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].Add(tempServerObjectHandleTable[RopSetColumnsResponse.InputHandleIndex], DecodingContext.SetColumnProTagMap_Index[MapiInspector.MAPIInspector.currentParsingSessionID][RopSetColumnsResponse.InputHandleIndex]); } } } break; case RopIdType.RopSortTable: RopSortTableResponse RopSortTableResponse = new RopSortTableResponse(); RopSortTableResponse.Parse(s); ropsList.Add(RopSortTableResponse); break; case RopIdType.RopRestrict: RopRestrictResponse RopRestrictResponse = new RopRestrictResponse(); RopRestrictResponse.Parse(s); ropsList.Add(RopRestrictResponse); break; case RopIdType.RopQueryRows: long currentPos = s.Position; s.Position += 1; int TempInputHandleIndex = s.ReadByte(); UInt32 returnValue_queryRow = ReadUint(); s.Position = currentPos; if (returnValue_queryRow == 0) { if (DecodingContext.SetColumnProTagMap_Handle != null && DecodingContext.SetColumnProTagMap_Handle.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID) && DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].ContainsKey(tempServerObjectHandleTable[TempInputHandleIndex])) { RopQueryRowsResponse RopQueryRowsResponse = new RopQueryRowsResponse(DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID][tempServerObjectHandleTable[TempInputHandleIndex]]); RopQueryRowsResponse.Parse(s); ropsList.Add(RopQueryRowsResponse); break; } else { throw new MissingInformationException("Missing PropertyTags information for RopQueryRowsResponse", (ushort)RopIdType.RopQueryRows, tempServerObjectHandleTable[TempInputHandleIndex]); } } else { RopQueryRowsResponse ropQueryRowsResponse = new RopQueryRowsResponse(null); ropQueryRowsResponse.Parse(s); ropsList.Add(ropQueryRowsResponse); break; } case RopIdType.RopAbort: RopAbortResponse RopAbortResponse = new RopAbortResponse(); RopAbortResponse.Parse(s); ropsList.Add(RopAbortResponse); break; case RopIdType.RopGetStatus: RopGetStatusResponse RopGetStatusResponse = new RopGetStatusResponse(); RopGetStatusResponse.Parse(s); ropsList.Add(RopGetStatusResponse); break; case RopIdType.RopQueryPosition: RopQueryPositionResponse RopQueryPositionResponse = new RopQueryPositionResponse(); RopQueryPositionResponse.Parse(s); ropsList.Add(RopQueryPositionResponse); break; case RopIdType.RopSeekRow: RopSeekRowResponse RopSeekRowResponse = new RopSeekRowResponse(); RopSeekRowResponse.Parse(s); ropsList.Add(RopSeekRowResponse); break; case RopIdType.RopSeekRowBookmark: RopSeekRowBookmarkResponse RopSeekRowBookmarkResponse = new RopSeekRowBookmarkResponse(); RopSeekRowBookmarkResponse.Parse(s); ropsList.Add(RopSeekRowBookmarkResponse); break; case RopIdType.RopSeekRowFractional: RopSeekRowFractionalResponse RopSeekRowFractionalResponse = new RopSeekRowFractionalResponse(); RopSeekRowFractionalResponse.Parse(s); ropsList.Add(RopSeekRowFractionalResponse); break; case RopIdType.RopCreateBookmark: RopCreateBookmarkResponse RopCreateBookmarkResponse = new RopCreateBookmarkResponse(); RopCreateBookmarkResponse.Parse(s); ropsList.Add(RopCreateBookmarkResponse); break; case RopIdType.RopQueryColumnsAll: RopQueryColumnsAllResponse RopQueryColumnsAllResponse = new RopQueryColumnsAllResponse(); RopQueryColumnsAllResponse.Parse(s); ropsList.Add(RopQueryColumnsAllResponse); break; case RopIdType.RopFindRow: long currentPos_findRow = s.Position; s.Position += 1; int TempInputHandleIndex_findRow = s.ReadByte(); UInt32 returnValue_findRow = ReadUint(); s.Position = currentPos_findRow; if (returnValue_findRow == 0) { if (DecodingContext.SetColumnProTagMap_Handle != null && DecodingContext.SetColumnProTagMap_Handle.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID) && DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].ContainsKey(tempServerObjectHandleTable[TempInputHandleIndex_findRow])) { RopFindRowResponse ropFindRowResponse = new RopFindRowResponse(DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID][tempServerObjectHandleTable[TempInputHandleIndex_findRow]]); ropFindRowResponse.Parse(s); ropsList.Add(ropFindRowResponse); break; } else { throw new MissingInformationException("Missing PropertyTags information for RopFindRowsResponse", (ushort)RopIdType.RopFindRow, tempServerObjectHandleTable[TempInputHandleIndex_findRow]); } } else { RopFindRowResponse RopFindRowResponse = new RopFindRowResponse(null); RopFindRowResponse.Parse(s); ropsList.Add(RopFindRowResponse); break; } case RopIdType.RopFreeBookmark: RopFreeBookmarkResponse RopFreeBookmarkResponse = new RopFreeBookmarkResponse(); RopFreeBookmarkResponse.Parse(s); ropsList.Add(RopFreeBookmarkResponse); break; case RopIdType.RopResetTable: RopResetTableResponse RopResetTableResponse = new RopResetTableResponse(); RopResetTableResponse.Parse(s); ropsList.Add(RopResetTableResponse); break; case RopIdType.RopExpandRow: long currentPos_expandRow = s.Position; s.Position += 1; int TempInputHandleIndex_expandRow = s.ReadByte(); UInt32 returnValue_expandRow = ReadUint(); s.Position = currentPos_expandRow; if (returnValue_expandRow == 0) { if (DecodingContext.SetColumnProTagMap_Handle != null && DecodingContext.SetColumnProTagMap_Handle.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID) && DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID].ContainsKey(tempServerObjectHandleTable[TempInputHandleIndex_expandRow])) { RopExpandRowResponse ropFindRowResponse = new RopExpandRowResponse(DecodingContext.SetColumnProTagMap_Handle[MapiInspector.MAPIInspector.currentParsingSessionID][tempServerObjectHandleTable[TempInputHandleIndex_expandRow]]); ropFindRowResponse.Parse(s); ropsList.Add(ropFindRowResponse); break; } else { throw new MissingInformationException("Missing PropertyTags information for RopExpandRowsResponse", (ushort)RopIdType.RopExpandRow, tempServerObjectHandleTable[TempInputHandleIndex_expandRow]); } } else { RopExpandRowResponse RopFindRowResponse = new RopExpandRowResponse(null); RopFindRowResponse.Parse(s); ropsList.Add(RopFindRowResponse); break; } case RopIdType.RopCollapseRow: RopCollapseRowResponse RopCollapseRowResponse = new RopCollapseRowResponse(); RopCollapseRowResponse.Parse(s); ropsList.Add(RopCollapseRowResponse); break; case RopIdType.RopGetCollapseState: RopGetCollapseStateResponse RopGetCollapseStateResponse = new RopGetCollapseStateResponse(); RopGetCollapseStateResponse.Parse(s); ropsList.Add(RopGetCollapseStateResponse); break; case RopIdType.RopSetCollapseState: RopSetCollapseStateResponse RopSetCollapseStateResponse = new RopSetCollapseStateResponse(); RopSetCollapseStateResponse.Parse(s); ropsList.Add(RopSetCollapseStateResponse); break; // MSOXORULE ROPs case RopIdType.RopModifyRules: RopModifyRulesResponse RopModifyRulesResponse = new RopModifyRulesResponse(); RopModifyRulesResponse.Parse(s); ropsList.Add(RopModifyRulesResponse); break; case RopIdType.RopGetRulesTable: RopGetRulesTableResponse RopGetRulesTableResponse = new RopGetRulesTableResponse(); RopGetRulesTableResponse.Parse(s); ropsList.Add(RopGetRulesTableResponse); break; case RopIdType.RopUpdateDeferredActionMessages: RopUpdateDeferredActionMessagesResponse RopUpdateDeferredActionMessagesResponse = new RopUpdateDeferredActionMessagesResponse(); RopUpdateDeferredActionMessagesResponse.Parse(s); ropsList.Add(RopUpdateDeferredActionMessagesResponse); break; //MS-OXCFXICS ROPs case RopIdType.RopFastTransferSourceCopyProperties: RopFastTransferSourceCopyPropertiesResponse RopFastTransferSourceCopyPropertiesResponse = new RopFastTransferSourceCopyPropertiesResponse(); RopFastTransferSourceCopyPropertiesResponse.Parse(s); ropsList.Add(RopFastTransferSourceCopyPropertiesResponse); break; case RopIdType.RopFastTransferSourceCopyTo: RopFastTransferSourceCopyToResponse RopFastTransferSourceCopyToResponse = new RopFastTransferSourceCopyToResponse(); RopFastTransferSourceCopyToResponse.Parse(s); ropsList.Add(RopFastTransferSourceCopyToResponse); break; case RopIdType.RopFastTransferSourceCopyMessages: RopFastTransferSourceCopyMessagesResponse RopFastTransferSourceCopyMessagesResponse = new RopFastTransferSourceCopyMessagesResponse(); RopFastTransferSourceCopyMessagesResponse.Parse(s); ropsList.Add(RopFastTransferSourceCopyMessagesResponse); break; case RopIdType.RopFastTransferSourceCopyFolder: RopFastTransferSourceCopyFolderResponse RopFastTransferSourceCopyFolderResponse = new RopFastTransferSourceCopyFolderResponse(); RopFastTransferSourceCopyFolderResponse.Parse(s); ropsList.Add(RopFastTransferSourceCopyFolderResponse); break; case RopIdType.RopFastTransferSourceGetBuffer: if (DecodingContext.SessionFastTransferStreamType != null && DecodingContext.SessionFastTransferStreamType.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.StreamType_Getbuffer = DecodingContext.SessionFastTransferStreamType[MapiInspector.MAPIInspector.currentParsingSessionID]; } else { throw new MissingInformationException("Missing TransferStream type information for RopFastTransferSourceGetBufferResponse", (ushort)CurrentByte, null); } RopFastTransferSourceGetBufferResponse RopFastTransferSourceGetBufferResponse = new RopFastTransferSourceGetBufferResponse(); RopFastTransferSourceGetBufferResponse.Parse(s); ropsList.Add(RopFastTransferSourceGetBufferResponse); break; case RopIdType.RopTellVersion: RopTellVersionResponse RopTellVersionResponse = new RopTellVersionResponse(); RopTellVersionResponse.Parse(s); ropsList.Add(RopTellVersionResponse); break; case RopIdType.RopSynchronizationGetTransferState: RopSynchronizationGetTransferStateResponse RopSynchronizationGetTransferStateResponse = new RopSynchronizationGetTransferStateResponse(); RopSynchronizationGetTransferStateResponse.Parse(s); ropsList.Add(RopSynchronizationGetTransferStateResponse); break; case RopIdType.RopFastTransferDestinationConfigure: RopFastTransferDestinationConfigureResponse RopFastTransferDestinationConfigureResponse = new RopFastTransferDestinationConfigureResponse(); RopFastTransferDestinationConfigureResponse.Parse(s); ropsList.Add(RopFastTransferDestinationConfigureResponse); break; case RopIdType.RopFastTransferDestinationPutBuffer: RopFastTransferDestinationPutBufferResponse RopFastTransferDestinationPutBufferResponse = new RopFastTransferDestinationPutBufferResponse(); RopFastTransferDestinationPutBufferResponse.Parse(s); ropsList.Add(RopFastTransferDestinationPutBufferResponse); break; case RopIdType.RopSynchronizationConfigure: RopSynchronizationConfigureResponse RopSynchronizationConfigureResponse = new RopSynchronizationConfigureResponse(); RopSynchronizationConfigureResponse.Parse(s); ropsList.Add(RopSynchronizationConfigureResponse); break; case RopIdType.RopSynchronizationUploadStateStreamBegin: RopSynchronizationUploadStateStreamBeginResponse RopSynchronizationUploadStateStreamBeginResponse = new RopSynchronizationUploadStateStreamBeginResponse(); RopSynchronizationUploadStateStreamBeginResponse.Parse(s); ropsList.Add(RopSynchronizationUploadStateStreamBeginResponse); break; case RopIdType.RopSynchronizationUploadStateStreamContinue: RopSynchronizationUploadStateStreamContinueResponse RopSynchronizationUploadStateStreamContinueResponse = new RopSynchronizationUploadStateStreamContinueResponse(); RopSynchronizationUploadStateStreamContinueResponse.Parse(s); ropsList.Add(RopSynchronizationUploadStateStreamContinueResponse); break; case RopIdType.RopSynchronizationUploadStateStreamEnd: RopSynchronizationUploadStateStreamEndResponse RopSynchronizationUploadStateStreamEndResponse = new RopSynchronizationUploadStateStreamEndResponse(); RopSynchronizationUploadStateStreamEndResponse.Parse(s); ropsList.Add(RopSynchronizationUploadStateStreamEndResponse); break; case RopIdType.RopSynchronizationOpenCollector: RopSynchronizationOpenCollectorResponse RopSynchronizationOpenCollectorResponse = new RopSynchronizationOpenCollectorResponse(); RopSynchronizationOpenCollectorResponse.Parse(s); ropsList.Add(RopSynchronizationOpenCollectorResponse); break; case RopIdType.RopSynchronizationImportMessageChange: RopSynchronizationImportMessageChangeResponse RopSynchronizationImportMessageChangeResponse = new RopSynchronizationImportMessageChangeResponse(); RopSynchronizationImportMessageChangeResponse.Parse(s); ropsList.Add(RopSynchronizationImportMessageChangeResponse); break; case RopIdType.RopSynchronizationImportHierarchyChange: RopSynchronizationImportHierarchyChangeResponse RopSynchronizationImportHierarchyChangeResponse = new RopSynchronizationImportHierarchyChangeResponse(); RopSynchronizationImportHierarchyChangeResponse.Parse(s); ropsList.Add(RopSynchronizationImportHierarchyChangeResponse); break; case RopIdType.RopSynchronizationImportMessageMove: RopSynchronizationImportMessageMoveResponse RopSynchronizationImportMessageMoveResponse = new RopSynchronizationImportMessageMoveResponse(); RopSynchronizationImportMessageMoveResponse.Parse(s); ropsList.Add(RopSynchronizationImportMessageMoveResponse); break; case RopIdType.RopSynchronizationImportDeletes: RopSynchronizationImportDeletesResponse RopSynchronizationImportDeletesResponse = new RopSynchronizationImportDeletesResponse(); RopSynchronizationImportDeletesResponse.Parse(s); ropsList.Add(RopSynchronizationImportDeletesResponse); break; case RopIdType.RopSynchronizationImportReadStateChanges: RopSynchronizationImportReadStateChangesResponse RopSynchronizationImportReadStateChangesResponse = new RopSynchronizationImportReadStateChangesResponse(); RopSynchronizationImportReadStateChangesResponse.Parse(s); ropsList.Add(RopSynchronizationImportReadStateChangesResponse); break; case RopIdType.RopGetLocalReplicaIds: RopGetLocalReplicaIdsResponse RopGetLocalReplicaIdsResponse = new RopGetLocalReplicaIdsResponse(); RopGetLocalReplicaIdsResponse.Parse(s); ropsList.Add(RopGetLocalReplicaIdsResponse); break; case RopIdType.RopSetLocalReplicaMidsetDeleted: RopSetLocalReplicaMidsetDeletedResponse RopSetLocalReplicaMidsetDeletedResponse = new RopSetLocalReplicaMidsetDeletedResponse(); RopSetLocalReplicaMidsetDeletedResponse.Parse(s); ropsList.Add(RopSetLocalReplicaMidsetDeletedResponse); break; // MS-OXCPRPT ROPs case RopIdType.RopGetPropertiesSpecific: if (!(DecodingContext.SessionPropertyTags != null && DecodingContext.SessionPropertyTags.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID))) { throw new MissingInformationException("Missing PropertyTags information for RopFastTransferSourceCopyProperties", (ushort)CurrentByte, null); } RopGetPropertiesSpecificResponse RopGetPropertiesSpecificResponse = new RopGetPropertiesSpecificResponse(); RopGetPropertiesSpecificResponse.Parse(s); ropsList.Add(RopGetPropertiesSpecificResponse); break; case RopIdType.RopGetPropertiesAll: RopGetPropertiesAllResponse RopGetPropertiesAllResponse = new RopGetPropertiesAllResponse(); RopGetPropertiesAllResponse.Parse(s); ropsList.Add(RopGetPropertiesAllResponse); break; case RopIdType.RopGetPropertiesList: RopGetPropertiesListResponse RopGetPropertiesListResponse = new RopGetPropertiesListResponse(); RopGetPropertiesListResponse.Parse(s); ropsList.Add(RopGetPropertiesListResponse); break; case RopIdType.RopSetProperties: RopSetPropertiesResponse RopSetPropertiesResponse = new RopSetPropertiesResponse(); RopSetPropertiesResponse.Parse(s); ropsList.Add(RopSetPropertiesResponse); break; case RopIdType.RopSetPropertiesNoReplicate: RopSetPropertiesNoReplicateResponse RopSetPropertiesNoReplicateResponse = new RopSetPropertiesNoReplicateResponse(); RopSetPropertiesNoReplicateResponse.Parse(s); ropsList.Add(RopSetPropertiesNoReplicateResponse); break; case RopIdType.RopDeleteProperties: RopDeletePropertiesResponse RopDeletePropertiesResponse = new RopDeletePropertiesResponse(); RopDeletePropertiesResponse.Parse(s); ropsList.Add(RopDeletePropertiesResponse); break; case RopIdType.RopDeletePropertiesNoReplicate: RopDeletePropertiesNoReplicateResponse RopDeletePropertiesNoReplicateResponse = new RopDeletePropertiesNoReplicateResponse(); RopDeletePropertiesNoReplicateResponse.Parse(s); ropsList.Add(RopDeletePropertiesNoReplicateResponse); break; case RopIdType.RopQueryNamedProperties: RopQueryNamedPropertiesResponse RopQueryNamedPropertiesResponse = new RopQueryNamedPropertiesResponse(); RopQueryNamedPropertiesResponse.Parse(s); ropsList.Add(RopQueryNamedPropertiesResponse); break; case RopIdType.RopCopyProperties: RopCopyPropertiesResponse RopCopyPropertiesResponse = new RopCopyPropertiesResponse(); RopCopyPropertiesResponse.Parse(s); ropsList.Add(RopCopyPropertiesResponse); break; case RopIdType.RopCopyTo: RopCopyToResponse RopCopyToResponse = new RopCopyToResponse(); RopCopyToResponse.Parse(s); ropsList.Add(RopCopyToResponse); break; case RopIdType.RopGetPropertyIdsFromNames: RopGetPropertyIdsFromNamesResponse RopGetPropertyIdsFromNamesResponse = new RopGetPropertyIdsFromNamesResponse(); RopGetPropertyIdsFromNamesResponse.Parse(s); ropsList.Add(RopGetPropertyIdsFromNamesResponse); break; case RopIdType.RopGetNamesFromPropertyIds: RopGetNamesFromPropertyIdsResponse RopGetNamesFromPropertyIdsResponse = new RopGetNamesFromPropertyIdsResponse(); RopGetNamesFromPropertyIdsResponse.Parse(s); ropsList.Add(RopGetNamesFromPropertyIdsResponse); break; case RopIdType.RopOpenStream: RopOpenStreamResponse RopOpenStreamResponse = new RopOpenStreamResponse(); RopOpenStreamResponse.Parse(s); ropsList.Add(RopOpenStreamResponse); break; case RopIdType.RopReadStream: RopReadStreamResponse RopReadStreamResponse = new RopReadStreamResponse(); RopReadStreamResponse.Parse(s); ropsList.Add(RopReadStreamResponse); break; case RopIdType.RopWriteStream: RopWriteStreamResponse RopWriteStreamResponse = new RopWriteStreamResponse(); RopWriteStreamResponse.Parse(s); ropsList.Add(RopWriteStreamResponse); break; case RopIdType.RopCommitStream: RopCommitStreamResponse RopCommitStreamResponse = new RopCommitStreamResponse(); RopCommitStreamResponse.Parse(s); ropsList.Add(RopCommitStreamResponse); break; case RopIdType.RopGetStreamSize: RopGetStreamSizeResponse RopGetStreamSizeResponse = new RopGetStreamSizeResponse(); RopGetStreamSizeResponse.Parse(s); ropsList.Add(RopGetStreamSizeResponse); break; case RopIdType.RopSetStreamSize: RopSetStreamSizeResponse RopSetStreamSizeResponse = new RopSetStreamSizeResponse(); RopSetStreamSizeResponse.Parse(s); ropsList.Add(RopSetStreamSizeResponse); break; case RopIdType.RopSeekStream: RopSeekStreamResponse RopSeekStreamResponse = new RopSeekStreamResponse(); RopSeekStreamResponse.Parse(s); ropsList.Add(RopSeekStreamResponse); break; case RopIdType.RopCopyToStream: RopCopyToStreamResponse RopCopyToStreamResponse = new RopCopyToStreamResponse(); RopCopyToStreamResponse.Parse(s); ropsList.Add(RopCopyToStreamResponse); break; case RopIdType.RopProgress: RopProgressResponse RopProgressResponse = new RopProgressResponse(); RopProgressResponse.Parse(s); ropsList.Add(RopProgressResponse); break; case RopIdType.RopLockRegionStream: RopLockRegionStreamResponse RopLockRegionStreamResponse = new RopLockRegionStreamResponse(); RopLockRegionStreamResponse.Parse(s); ropsList.Add(RopLockRegionStreamResponse); break; case RopIdType.RopUnlockRegionStream: RopUnlockRegionStreamResponse RopUnlockRegionStreamResponse = new RopUnlockRegionStreamResponse(); RopUnlockRegionStreamResponse.Parse(s); ropsList.Add(RopUnlockRegionStreamResponse); break; case RopIdType.RopWriteAndCommitStream: RopWriteAndCommitStreamResponse RopWriteAndCommitStreamResponse = new RopWriteAndCommitStreamResponse(); RopWriteAndCommitStreamResponse.Parse(s); ropsList.Add(RopWriteAndCommitStreamResponse); break; case RopIdType.RopCloneStream: RopCloneStreamResponse RopCloneStreamResponse = new RopCloneStreamResponse(); RopCloneStreamResponse.Parse(s); ropsList.Add(RopCloneStreamResponse); break; // MSOXCFOLD ROPs case RopIdType.RopOpenFolder: RopOpenFolderResponse RopOpenFolderResponse = new RopOpenFolderResponse(); RopOpenFolderResponse.Parse(s); ropsList.Add(RopOpenFolderResponse); break; case RopIdType.RopCreateFolder: RopCreateFolderResponse RopCreateFolderResponse = new RopCreateFolderResponse(); RopCreateFolderResponse.Parse(s); ropsList.Add(RopCreateFolderResponse); break; case RopIdType.RopDeleteFolder: RopDeleteFolderResponse RopDeleteFolderResponse = new RopDeleteFolderResponse(); RopDeleteFolderResponse.Parse(s); ropsList.Add(RopDeleteFolderResponse); break; case RopIdType.RopSetSearchCriteria: RopSetSearchCriteriaResponse RopSetSearchCriteriaResponse = new RopSetSearchCriteriaResponse(); RopSetSearchCriteriaResponse.Parse(s); ropsList.Add(RopSetSearchCriteriaResponse); break; case RopIdType.RopGetSearchCriteria: RopGetSearchCriteriaResponse RopGetSearchCriteriaResponse = new RopGetSearchCriteriaResponse(); RopGetSearchCriteriaResponse.Parse(s); ropsList.Add(RopGetSearchCriteriaResponse); break; case RopIdType.RopMoveCopyMessages: RopMoveCopyMessagesResponse RopMoveCopyMessagesResponse = new RopMoveCopyMessagesResponse(); RopMoveCopyMessagesResponse.Parse(s); ropsList.Add(RopMoveCopyMessagesResponse); break; case RopIdType.RopMoveFolder: RopMoveFolderResponse RopMoveFolderResponse = new RopMoveFolderResponse(); RopMoveFolderResponse.Parse(s); ropsList.Add(RopMoveFolderResponse); break; case RopIdType.RopCopyFolder: RopCopyFolderResponse RopCopyFolderResponse = new RopCopyFolderResponse(); RopCopyFolderResponse.Parse(s); ropsList.Add(RopCopyFolderResponse); break; case RopIdType.RopEmptyFolder: RopEmptyFolderResponse RopEmptyFolderResponse = new RopEmptyFolderResponse(); RopEmptyFolderResponse.Parse(s); ropsList.Add(RopEmptyFolderResponse); break; case RopIdType.RopHardDeleteMessagesAndSubfolders: RopHardDeleteMessagesAndSubfoldersResponse RopHardDeleteMessagesAndSubfoldersResponse = new RopHardDeleteMessagesAndSubfoldersResponse(); RopHardDeleteMessagesAndSubfoldersResponse.Parse(s); ropsList.Add(RopHardDeleteMessagesAndSubfoldersResponse); break; case RopIdType.RopDeleteMessages: RopDeleteMessagesResponse RopDeleteMessagesResponse = new RopDeleteMessagesResponse(); RopDeleteMessagesResponse.Parse(s); ropsList.Add(RopDeleteMessagesResponse); break; case RopIdType.RopHardDeleteMessages: RopHardDeleteMessagesResponse RopHardDeleteMessagesResponse = new RopHardDeleteMessagesResponse(); RopHardDeleteMessagesResponse.Parse(s); ropsList.Add(RopHardDeleteMessagesResponse); break; case RopIdType.RopGetHierarchyTable: RopGetHierarchyTableResponse RopGetHierarchyTableResponse = new RopGetHierarchyTableResponse(); RopGetHierarchyTableResponse.Parse(s); ropsList.Add(RopGetHierarchyTableResponse); break; case RopIdType.RopGetContentsTable: RopGetContentsTableResponse RopGetContentsTableResponse = new RopGetContentsTableResponse(); RopGetContentsTableResponse.Parse(s); ropsList.Add(RopGetContentsTableResponse); break; //MS-OXCMSG ROPs case RopIdType.RopOpenMessage: RopOpenMessageResponse ropOpenMessageResponse = new RopOpenMessageResponse(); ropOpenMessageResponse.Parse(s); ropsList.Add(ropOpenMessageResponse); break; case RopIdType.RopCreateMessage: RopCreateMessageResponse ropCreateMessageResponse = new RopCreateMessageResponse(); ropCreateMessageResponse.Parse(s); ropsList.Add(ropCreateMessageResponse); break; case RopIdType.RopSaveChangesMessage: RopSaveChangesMessageResponse ropSaveChangesMessageResponse = new RopSaveChangesMessageResponse(); ropSaveChangesMessageResponse.Parse(s); ropsList.Add(ropSaveChangesMessageResponse); break; case RopIdType.RopRemoveAllRecipients: RopRemoveAllRecipientsResponse ropRemoveAllRecipientsResponse = new RopRemoveAllRecipientsResponse(); ropRemoveAllRecipientsResponse.Parse(s); ropsList.Add(ropRemoveAllRecipientsResponse); break; case RopIdType.RopModifyRecipients: RopModifyRecipientsResponse ropModifyRecipientsResponse = new RopModifyRecipientsResponse(); ropModifyRecipientsResponse.Parse(s); ropsList.Add(ropModifyRecipientsResponse); break; case RopIdType.RopReadRecipients: RopReadRecipientsResponse ropReadRecipientsResponse = new RopReadRecipientsResponse(); ropReadRecipientsResponse.Parse(s); ropsList.Add(ropReadRecipientsResponse); break; case RopIdType.RopReloadCachedInformation: RopReloadCachedInformationResponse ropReloadCachedInformationResponse = new RopReloadCachedInformationResponse(); ropReloadCachedInformationResponse.Parse(s); ropsList.Add(ropReloadCachedInformationResponse); break; case RopIdType.RopSetMessageStatus: RopSetMessageStatusResponse ropSetMessageStatusResponse = new RopSetMessageStatusResponse(); ropSetMessageStatusResponse.Parse(s); ropsList.Add(ropSetMessageStatusResponse); break; case RopIdType.RopGetMessageStatus: RopGetMessageStatusResponse ropGetMessageStatusResponse = new RopGetMessageStatusResponse(); ropGetMessageStatusResponse.Parse(s); ropsList.Add(ropGetMessageStatusResponse); break; case RopIdType.RopSetReadFlags: RopSetReadFlagsResponse ropSetReadFlagsResponse = new RopSetReadFlagsResponse(); ropSetReadFlagsResponse.Parse(s); ropsList.Add(ropSetReadFlagsResponse); break; case RopIdType.RopSetMessageReadFlag: RopSetMessageReadFlagResponse ropSetMessageReadFlagResponse = new RopSetMessageReadFlagResponse(); ropSetMessageReadFlagResponse.Parse(s); ropsList.Add(ropSetMessageReadFlagResponse); break; case RopIdType.RopOpenAttachment: RopOpenAttachmentResponse ropOpenAttachmentResponse = new RopOpenAttachmentResponse(); ropOpenAttachmentResponse.Parse(s); ropsList.Add(ropOpenAttachmentResponse); break; case RopIdType.RopCreateAttachment: RopCreateAttachmentResponse ropCreateAttachmentResponse = new RopCreateAttachmentResponse(); ropCreateAttachmentResponse.Parse(s); ropsList.Add(ropCreateAttachmentResponse); break; case RopIdType.RopDeleteAttachment: RopDeleteAttachmentResponse ropDeleteAttachmentResponse = new RopDeleteAttachmentResponse(); ropDeleteAttachmentResponse.Parse(s); ropsList.Add(ropDeleteAttachmentResponse); break; case RopIdType.RopSaveChangesAttachment: RopSaveChangesAttachmentResponse ropSaveChangesAttachmentResponse = new RopSaveChangesAttachmentResponse(); ropSaveChangesAttachmentResponse.Parse(s); ropsList.Add(ropSaveChangesAttachmentResponse); break; case RopIdType.RopOpenEmbeddedMessage: RopOpenEmbeddedMessageResponse ropOpenEmbeddedMessageResponse = new RopOpenEmbeddedMessageResponse(); ropOpenEmbeddedMessageResponse.Parse(s); ropsList.Add(ropOpenEmbeddedMessageResponse); break; case RopIdType.RopGetAttachmentTable: RopGetAttachmentTableResponse ropGetAttachmentTableResponse = new RopGetAttachmentTableResponse(); ropGetAttachmentTableResponse.Parse(s); ropsList.Add(ropGetAttachmentTableResponse); break; case RopIdType.RopGetValidAttachments: RopGetValidAttachmentsResponse ropGetValidAttachmentsResponse = new RopGetValidAttachmentsResponse(); ropGetValidAttachmentsResponse.Parse(s); ropsList.Add(ropGetValidAttachmentsResponse); break; // MSOXCNOTIF ROPs case RopIdType.RopRegisterNotification: RopRegisterNotificationResponse RopRegisterNotificationResponse = new RopRegisterNotificationResponse(); RopRegisterNotificationResponse.Parse(s); ropsList.Add(RopRegisterNotificationResponse); break; case RopIdType.RopPending: RopPendingResponse RopPendingResponse = new RopPendingResponse(); RopPendingResponse.Parse(s); ropsList.Add(RopPendingResponse); break; case RopIdType.RopNotify: RopNotifyResponse ropNotifyResponse = new RopNotifyResponse(); ropNotifyResponse.Parse(s); ropsList.Add(ropNotifyResponse); break; // MS-OXCPERM ROPs case RopIdType.RopGetPermissionsTable: RopGetPermissionsTableResponse RopGetPermissionsTableResponse = new RopGetPermissionsTableResponse(); RopGetPermissionsTableResponse.Parse(s); ropsList.Add(RopGetPermissionsTableResponse); break; case RopIdType.RopModifyPermissions: RopModifyPermissionsResponse RopModifyPermissionsResponse = new RopModifyPermissionsResponse(); RopModifyPermissionsResponse.Parse(s); ropsList.Add(RopModifyPermissionsResponse); break; default: object RopsBytes = ReadBytes(this.RopSize - (int)s.Position); ropsList.Add(RopsBytes); break; } } while (s.Position < this.RopSize); } else { this.RopsList = null; } this.RopsList = ropsList.ToArray(); while (s.Position < s.Length) { uint ServerObjectHandle = ReadUint(); serverObjectHandleTable.Add(ServerObjectHandle); } this.ServerObjectHandleTable = serverObjectHandleTable.ToArray(); if (this.RopsList.Length > 0) { foreach (var ropResponse in this.RopsList) { if (ropResponse is RopCreateFolderResponse || ropResponse is RopOpenFolderResponse) { uint objectHandleKey; if (ropResponse is RopCreateFolderResponse) { objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopCreateFolderResponse).OutputHandleIndex]; } else { objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopOpenFolderResponse).OutputHandleIndex]; } if (DecodingContext.SessionObjectHandles != null && DecodingContext.SessionObjectHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.SessionObjectHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } Dictionary<int, ObjectHandlesType> tmpObjectHandle = new Dictionary<int, ObjectHandlesType>() { { (int)objectHandleKey, ObjectHandlesType.FolderHandles } }; DecodingContext.SessionObjectHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, tmpObjectHandle); if (DecodingContext.ObjectHandles != null && DecodingContext.ObjectHandles.ContainsKey((int)objectHandleKey)) { DecodingContext.ObjectHandles.Remove((int)objectHandleKey); } DecodingContext.ObjectHandles.Add((int)objectHandleKey, ObjectHandlesType.FolderHandles); } else if (ropResponse is RopCreateMessageResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopCreateMessageResponse).OutputHandleIndex]; if (DecodingContext.SessionObjectHandles != null && DecodingContext.SessionObjectHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.SessionObjectHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } Dictionary<int, ObjectHandlesType> tmpObjectHandle = new Dictionary<int, ObjectHandlesType>() { { (int)objectHandleKey, ObjectHandlesType.MessageHandles } }; DecodingContext.SessionObjectHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, tmpObjectHandle); if (DecodingContext.ObjectHandles != null && DecodingContext.ObjectHandles.ContainsKey((int)objectHandleKey)) { DecodingContext.ObjectHandles.Remove((int)objectHandleKey); } DecodingContext.ObjectHandles.Add((int)objectHandleKey, ObjectHandlesType.MessageHandles); } else if (ropResponse is RopCreateAttachmentResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopCreateAttachmentResponse).OutputHandleIndex]; if (DecodingContext.SessionObjectHandles != null && DecodingContext.SessionObjectHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.SessionObjectHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } Dictionary<int, ObjectHandlesType> tmpObjectHandle = new Dictionary<int, ObjectHandlesType>() { { (int)objectHandleKey, ObjectHandlesType.AttachmentHandles } }; DecodingContext.SessionObjectHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, tmpObjectHandle); if (DecodingContext.ObjectHandles != null && DecodingContext.ObjectHandles.ContainsKey((int)objectHandleKey)) { DecodingContext.ObjectHandles.Remove((int)objectHandleKey); } DecodingContext.ObjectHandles.Add((int)objectHandleKey, ObjectHandlesType.AttachmentHandles); } else if (ropResponse is RopFastTransferSourceCopyToResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferSourceCopyToResponse).OutputHandleIndex]; if (DecodingContext.CopyTo_OutputHandles != null && DecodingContext.CopyTo_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.CopyTo_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.CopyTo_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopFastTransferSourceCopyPropertiesResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferSourceCopyPropertiesResponse).OutputHandleIndex]; if (DecodingContext.CopyProperties_OutputHandles != null && DecodingContext.CopyProperties_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.CopyProperties_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.CopyProperties_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopFastTransferSourceCopyMessagesResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferSourceCopyMessagesResponse).OutputHandleIndex]; if (DecodingContext.CopyMessage_OutputHandles != null && DecodingContext.CopyMessage_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.CopyMessage_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.CopyMessage_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopFastTransferSourceCopyFolderResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferSourceCopyFolderResponse).OutputHandleIndex]; if (DecodingContext.CopyFolder_OutputHandles != null && DecodingContext.CopyFolder_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.CopyFolder_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.CopyFolder_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopSynchronizationConfigureResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopSynchronizationConfigureResponse).OutputHandleIndex]; if (DecodingContext.SyncConfigure_OutputHandles != null && DecodingContext.SyncConfigure_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.SyncConfigure_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.SyncConfigure_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopSynchronizationGetTransferStateResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopSynchronizationGetTransferStateResponse).OutputHandleIndex]; if (DecodingContext.SyncGetTransferState_OutputHandles != null && DecodingContext.SyncGetTransferState_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.SyncGetTransferState_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.SyncGetTransferState_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopFastTransferDestinationConfigureResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferDestinationConfigureResponse).OutputHandleIndex]; if (DecodingContext.DestinationConfigure_OutputHandles != null && DecodingContext.DestinationConfigure_OutputHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.DestinationConfigure_OutputHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.DestinationConfigure_OutputHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else if (ropResponse is RopFastTransferDestinationPutBufferResponse) { uint objectHandleKey = this.ServerObjectHandleTable[(ropResponse as RopFastTransferDestinationPutBufferResponse).InputHandleIndex]; if (DecodingContext.PutBuffer_InPutHandles.ContainsKey(MapiInspector.MAPIInspector.currentParsingSessionID)) { DecodingContext.PutBuffer_InPutHandles.Remove(MapiInspector.MAPIInspector.currentParsingSessionID); } DecodingContext.PutBuffer_InPutHandles.Add(MapiInspector.MAPIInspector.currentParsingSessionID, (int)objectHandleKey); } else { continue; } } } }
public void MSOXORULE_S04_TC01_AddModifyDeleteStandardRule_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser1 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User1Name, this.User1ESSDN, this.User1Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User1ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); // Get the store object's entry ID. this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); RopCreateFolderResponse createFolderResponse; string newFolderName = Common.GenerateResourceName(this.Site, Constants.FolderDisplayName); uint newFolderHandle = this.OxoruleAdapter.RopCreateFolder(publicfolderHandler, newFolderName, Constants.FolderComment, out createFolderResponse); Site.Assert.AreEqual <uint>(0, createFolderResponse.ReturnValue, "Creating folder operation should succeed."); #endregion #region TestUser1 prepares value for rule properties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameDelete); RuleData ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, new DeleteMarkReadActionData(), ruleProperties, null); #endregion #region TestUser1 adds rule OP_Delelte. RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Adding Delete rule should succeed."); #endregion #region TestUser1 gets rule ID of the created rule. RopGetRulesTableResponse ropGetRulesTableResponse; uint ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(newFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); Site.Assert.AreEqual <uint>(0, ropGetRulesTableResponse.ReturnValue, "Getting rule table should succeed."); PropertyTag ruleIDTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleId, PropertyType = (ushort)PropertyType.PtypInteger64 }; RopQueryRowsResponse queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[1] { ruleIDTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Only one rule added in this folder, so the row count in the rule table should be 1. Site.Assert.AreEqual <uint>(1, queryRowsResponse.RowCount, "The rule number in the rule table is {0}", queryRowsResponse.RowCount); this.VerifyRuleTable(); ulong ruleId = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[0].PropertyValues[0].Value, 0); #endregion #region TestUser1 modifies the created rule. ruleProperties.Name = Common.GenerateResourceName(this.Site, "RuleNameForModify"); ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForModify, 1, RuleState.ST_ENABLED, new DeleteMarkReadActionData(), ruleProperties, ruleId); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_OnExisting, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Modifying the OP_DELETE rule should be success"); #endregion #region TestUser1 calls RopGetRulesTable with valid TableFlags. ruleTableHandle = this.OxoruleAdapter.RopGetRulesTable(newFolderHandle, TableFlags.Normal, out ropGetRulesTableResponse); #endregion #region TestUser1 retrieves rule information for the modified rule. PropertyTag ruleNameTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagRuleName, PropertyType = (ushort)PropertyType.PtypString }; // Retrieves rows from the rule table. queryRowsResponse = this.OxoruleAdapter.QueryPropertiesInTable(ruleTableHandle, new PropertyTag[2] { ruleIDTag, ruleNameTag }); Site.Assert.AreEqual <uint>(0, queryRowsResponse.ReturnValue, "Retrieving rows from the rule table should succeed."); // Only one rule added in this folder, so the row count in the rule table should be 1. Site.Assert.AreEqual <uint>(1, queryRowsResponse.RowCount, "The rule number in the rule table is {0}", queryRowsResponse.RowCount); this.VerifyRuleTable(); ulong ruleIdModified = BitConverter.ToUInt64(queryRowsResponse.RowData.PropertyRows[0].PropertyValues[0].Value, 0); bool isSameRuleId = ruleId == ruleIdModified; Site.Assert.IsTrue(isSameRuleId, "The original rule Id is {0} and the modified rule Id is {1}", ruleId, ruleIdModified); string modifiedRuleName = AdapterHelper.PropertyValueConvertToString(queryRowsResponse.RowData.PropertyRows.ToArray()[0].PropertyValues[1].Value); Site.Assert.AreEqual <string>(ruleProperties.Name, modifiedRuleName, "The actual rule name {0} should be equal to the expected rule name {1}.", modifiedRuleName, ruleProperties.Name); #endregion #region TestUser1 deletes the created rule. ruleForDelete = AdapterHelper.GenerateValidRuleData(ActionType.OP_DELETE, TestRuleDataType.ForRemove, 1, RuleState.ST_ENABLED, null, ruleProperties, ruleId); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_OnExisting, new RuleData[] { ruleForDelete }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Deleting the OP_DELETE rule should succeed."); RopDeleteFolderResponse deleteFolder = this.OxoruleAdapter.RopDeleteFolder(publicfolderHandler, createFolderResponse.FolderId); Site.Assert.AreEqual <uint>(0, deleteFolder.ReturnValue, "Deleting folder should succeed."); #endregion }
public void MSOXORULE_S04_TC04_AddNotSupportedRule_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser2 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User2Name, this.User2ESSDN, this.User2Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User2ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); ulong publicFolderID = logonResponse.FolderIds[1]; #endregion #region TestUser2 tests the unsupported rules in public folder. #region TestUser2 prepares value for ruleProperties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameDeferredAction); #endregion #region TestUser2 adds a Rule set Action Type to OP_DEFER_ACTION. DeferredActionData deferredActionData = new DeferredActionData { Data = Common.GetBytesFromBinaryHexString(Constants.DeferredActionBufferData) }; RuleData deferredActionRuleData = AdapterHelper.GenerateValidRuleData(ActionType.OP_DEFER_ACTION, TestRuleDataType.ForAdd, 5, RuleState.ST_ENABLED, deferredActionData, ruleProperties, null); RopModifyRulesResponse ropModifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { deferredActionRuleData }); #endregion // Add the debug information. Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R258: server returned value is {0}", ropModifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R258. // If the ReturnValue is not 0x00000000, it means the server failed to add a public folder rule with this OP_DEFER_ACTION Type action. // So it is not used in a public folder rule. bool isVerifyR258 = ropModifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR258, 258, @"[In ActionBlock Structure] The meaning of action type OP_DEFER_ACTION: MUST NOT be used in a public folder rule (4)."); #region TestUser2 prepares rules' data. MoveCopyActionData moveCopyActionData = new MoveCopyActionData(); // Get the Inbox folder entry ID. byte[] folderEId = this.OxoruleAdapter.GetFolderEntryId(StoreObjectType.PublicFolder, publicfolderHandler, publicFolderID); // Get the store object's entry ID. byte[] storeEId = this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); moveCopyActionData.FolderEID = folderEId; moveCopyActionData.StoreEID = storeEId; moveCopyActionData.FolderEIDSize = (ushort)folderEId.Length; moveCopyActionData.StoreEIDSize = (ushort)storeEId.Length; #endregion #region TestUser2 prepares value for ruleProperties variable. ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameMoveOne); #endregion #region TestUser2 adds OP_MOVE rule to the public folder. ruleProperties.Name = Common.GenerateResourceName(this.Site, Constants.RuleNameMoveOne); RuleData ruleForMove = AdapterHelper.GenerateValidRuleData(ActionType.OP_MOVE, TestRuleDataType.ForAdd, 0, RuleState.ST_ENABLED, moveCopyActionData, ruleProperties, null); RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForMove }); #endregion // Add the debug information. Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R839: server returned value is {0}", modifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R839. // If the returnValue is not 0x00000000, it means this OP_MOVE Type used in a public folder rule is failed, // so it is not used in a public folder rule. bool isVerifyR839 = modifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR839, 839, @"[In ActionBlock Structure] The meaning of action type OP_MOVE: MUST NOT be used in a public folder rule (4)."); #region TestUser2 adds OP_COPY rule to the public folder. ruleProperties.Name = Common.GenerateResourceName(this.Site, Constants.RuleNameMoveTwo); RuleData ruleForCopy = AdapterHelper.GenerateValidRuleData(ActionType.OP_COPY, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, moveCopyActionData, ruleProperties, null); modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(publicfolderHandler, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleForCopy }); #endregion // Add the debug information Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXORULE_R840: server returned value is {0}", modifyRulesResponse.ReturnValue); // Verify MS-OXORULE requirement: MS-OXORULE_R840. // If the ReturnValue is not 0x00000000, it means this OP_COPY Type used in a public folder rule is failed, // so it is not used in a public folder rule. bool isVerifyR840 = modifyRulesResponse.ReturnValue != 0x00000000; Site.CaptureRequirementIfIsTrue( isVerifyR840, 840, @"[In ActionBlock Structure] The meaning of action type OP_COPY: MUST NOT be used in a public folder rule (4)."); #endregion }
public void MSOXORULE_S04_TC03_ServerExecuteRule_Action_OP_TAG_OnPublicFolder() { this.CheckMAPIHTTPTransportSupported(); #region TestUser1 logs on to the public folder. RopOpenFolderResponse openFolderResponse; RopLogonResponse logonResponse; bool ret = this.OxoruleAdapter.Connect(ConnectionType.PublicFolderServer, this.User1Name, this.User1ESSDN, this.User1Password); Site.Assert.IsTrue(ret, "connect to public folder server should be successful"); uint publicFolderLogonHandler = this.OxoruleAdapter.RopLogon(LogonType.PublicFolder, this.User1ESSDN, out logonResponse); // Assert the client to log on to the public folder successfully. Site.Assert.AreEqual <uint>(0, logonResponse.ReturnValue, "Logon the public folder should be successful."); // Folder index 1 is the Interpersonal Messages subtree, and this is defined in MS-OXCSTOR. uint publicfolderHandler = this.OxoruleAdapter.RopOpenFolder(publicFolderLogonHandler, logonResponse.FolderIds[1], out openFolderResponse); // Get the store object's entry ID. this.GetStoreObjectEntryID(StoreObjectType.PublicFolder, this.Server, this.User1ESSDN); RopCreateFolderResponse createFolderResponse; string newFolderName = Common.GenerateResourceName(this.Site, Constants.FolderDisplayName); uint newFolderHandle = this.OxoruleAdapter.RopCreateFolder(publicfolderHandler, newFolderName, Constants.FolderComment, out createFolderResponse); ulong newFolderID = createFolderResponse.FolderId; Site.Assert.AreEqual <uint>(0, createFolderResponse.ReturnValue, "Creating folder operation should succeed."); #endregion #region TestUser1 prepares value for ruleProperties variable. RuleProperties ruleProperties = AdapterHelper.GenerateRuleProperties(this.Site, Constants.RuleNameTag); #endregion #region TestUser1 adds an OP_TAG rule to the new created folder. TagActionData tagActionData = new TagActionData(); PropertyTag tagActionDataPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagImportance, PropertyType = (ushort)PropertyType.PtypInteger32 }; tagActionData.PropertyTag = tagActionDataPropertyTag; tagActionData.PropertyValue = BitConverter.GetBytes(1); RuleData ruleOpTag = AdapterHelper.GenerateValidRuleData(ActionType.OP_TAG, TestRuleDataType.ForAdd, 1, RuleState.ST_ENABLED, tagActionData, ruleProperties, null); RopModifyRulesResponse modifyRulesResponse = this.OxoruleAdapter.RopModifyRules(newFolderHandle, ModifyRuleFlag.Modify_ReplaceAll, new RuleData[] { ruleOpTag }); Site.Assert.AreEqual <uint>(0, modifyRulesResponse.ReturnValue, "Adding OP_TAG rule should succeed."); #endregion #region TestUser1 creates a message. RopCreateMessageResponse ropCreateMessageResponse; uint messageHandle = this.OxoruleAdapter.RopCreateMessage(newFolderHandle, newFolderID, Convert.ToByte(false), out ropCreateMessageResponse); Site.Assert.AreEqual <uint>(0, ropCreateMessageResponse.ReturnValue, "Creating message should succeed."); #endregion #region TestUser1 saves the subject property of the message to trigger the rule. string subjectName = Common.GenerateResourceName(this.Site, ruleProperties.ConditionSubjectName + "Title"); TaggedPropertyValue subjectProperty = new TaggedPropertyValue(); PropertyTag pidTagSubjectPropertyTag = new PropertyTag { PropertyId = (ushort)PropertyId.PidTagSubject, PropertyType = (ushort)PropertyType.PtypString }; subjectProperty.PropertyTag = pidTagSubjectPropertyTag; subjectProperty.Value = Encoding.Unicode.GetBytes(subjectName + "\0"); // Set properties for the created message to trigger the rule. RopSetPropertiesResponse ropSetPropertiesResponse = this.OxoruleAdapter.RopSetProperties(messageHandle, new TaggedPropertyValue[] { subjectProperty }); Site.Assert.AreEqual <uint>(0, ropSetPropertiesResponse.ReturnValue, "Setting property for the created message should succeed."); // Save changes of message. RopSaveChangesMessageResponse ropSaveChangesMessagResponse = this.OxoruleAdapter.RopSaveChangesMessage(messageHandle); Site.Assert.AreEqual <uint>(0, ropSaveChangesMessagResponse.ReturnValue, "Saving the created message should succeed."); // Wait for the message to be saved and the rule to take effect. Thread.Sleep(this.WaitForTheRuleToTakeEffect); #endregion #region TestUser1 gets the message and its properties to verify the rule evaluation. PropertyTag[] propertyTagList = new PropertyTag[2]; propertyTagList[0].PropertyId = (ushort)PropertyId.PidTagImportance; propertyTagList[0].PropertyType = (ushort)PropertyType.PtypInteger32; propertyTagList[1].PropertyId = (ushort)PropertyId.PidTagSubject; propertyTagList[1].PropertyType = (ushort)PropertyType.PtypString; uint contentTableHandle = 0; uint rowCount = 0; RopQueryRowsResponse getMailMessageContent = this.GetExpectedMessage(newFolderHandle, ref contentTableHandle, propertyTagList, ref rowCount, 1, subjectName); Site.Assert.AreEqual <uint>(1, rowCount, @"The message number in the specific folder should be 1."); Site.Assert.AreEqual <int>(1, BitConverter.ToInt32(getMailMessageContent.RowData.PropertyRows[(int)rowCount - 1].PropertyValues[0].Value, 0), "If the rule is executed, the PidTagImportance property of the message should be the value set by the rule."); RopDeleteFolderResponse deleteFolder = this.OxoruleAdapter.RopDeleteFolder(publicfolderHandler, newFolderID); Site.Assert.AreEqual <uint>(0, deleteFolder.ReturnValue, "Deleting folder should succeed."); #endregion }