/// <summary> /// Insert state value into state dictionary. /// </summary> /// <param name="s">State object.</param> /// <returns>State value index in container.</returns> private int InsertStateDict(State s) { if (s != null && s.PropList != null && s.PropList.PropValues != null && s.PropList.PropValues.Count > 0) { int index = AdapterHelper.GetICSStateIndex(); ICSStateData data = new ICSStateData(); for (int i = 0; i < s.PropList.PropValues.Count; i++) { PropValue value = s.PropList.PropValues[i]; VarPropTypePropValue varPropTypePropValue = value as VarPropTypePropValue; AdapterHelper.Site.Assert.IsNotNull(varPropTypePropValue, "The VarPropTypePropValue should not be null."); if (value.PropType == 0x0102 && varPropTypePropValue.PropInfo.PropID == 0x67D2) { // PidTagCnsetRead data.PidTagCnsetRead = varPropTypePropValue.ValueArray; } else if (value.PropType == 0x0102 && varPropTypePropValue.PropInfo.PropID == 0x6796) { // PidTagCnsetSeen data.PidTagCnsetSeen = varPropTypePropValue.ValueArray; } else if (value.PropType == 0x0102 && varPropTypePropValue.PropInfo.PropID == 0x67DA) { // PidTagCnsetSeenFAI data.PidTagCnsetSeenFAI = varPropTypePropValue.ValueArray; } else if (value.PropType == 0x003 && varPropTypePropValue.PropInfo.PropID == 0x4017) { // PidTagIdsetGiven data.PidTagIdsetGiven = varPropTypePropValue.ValueArray; } else { AdapterHelper.Site.Assert.Fail("Invalid property, its ID is {0} and type is {1}.", value.PropInfo.PropID.ToString("X4"), value.PropType.ToString("X4")); } } this.icsStateContainer.Add(index, data); return index; } else { AdapterHelper.Site.Assert.Fail("Invalid input state, ensure the state not null and have more than one PropValue in its PropList."); return -1; } }
/// <summary> /// Upload of an ICS state property into the synchronization context. /// </summary> /// <param name="serverId">A 32-bit signed integer represent the Identity of server.</param> /// <param name="uploadContextHandleIndex">The synchronization context handle</param> /// <param name="icsPropertyType">Property tags of the ICS state properties.</param> /// <param name="isPidTagIdsetGivenInputAsInter32"> identifies Property tags as PtypInteger32.</param> /// <param name="icsStateIndex">The index of the ICS State.</param> /// <returns>The ICS state property is upload to the server successfully or not.</returns> public RopResult SynchronizationUploadState(int serverId, int uploadContextHandleIndex, ICSStateProperties icsPropertyType, bool isPidTagIdsetGivenInputAsInter32, int icsStateIndex) { // Initialize ROP data. RopResult result = RopResult.InvalidParameter; uint synUploadContextHandle = this.handleContainer[uploadContextHandleIndex]; ICSStateData uploadICSState = new ICSStateData(); if (icsStateIndex != 0) { uploadICSState = this.icsStateContainer[icsStateIndex]; } else { uploadICSState.PidTagCnsetRead = new byte[0]; uploadICSState.PidTagCnsetSeen = new byte[0]; uploadICSState.PidTagCnsetSeenFAI = new byte[0]; uploadICSState.PidTagIdsetGiven = new byte[0]; } byte[] currentICSPropertyValue; // Construct ROP request. RopSynchronizationUploadStateStreamBeginRequest synchronizationUploadStateStreamBeginRequest; synchronizationUploadStateStreamBeginRequest.RopId = 0x75; synchronizationUploadStateStreamBeginRequest.LogonId = 0x00; synchronizationUploadStateStreamBeginRequest.InputHandleIndex = 0x00; uint stateProperty = 0; // propertyId and propertyTypId should be joined up. So propertyId should be move left 16 positions for propertyTypeID. switch (icsPropertyType) { case ICSStateProperties.PidTagCnsetRead: // PidTagCnsetRead propertyId 0x67DA, propertyTypeId 0x0102 stateProperty = (uint)((0x67D2 << 16) | 0x0102); currentICSPropertyValue = new byte[uploadICSState.PidTagCnsetRead.Length]; currentICSPropertyValue = uploadICSState.PidTagCnsetRead; break; case ICSStateProperties.PidTagCnsetSeen: // PidTagCnsetSeen propertyId 0x6796, propertyTypeId 0x0102 stateProperty = (uint)((0x6796 << 16) | 0x0102); currentICSPropertyValue = new byte[uploadICSState.PidTagCnsetSeen.Length]; currentICSPropertyValue = uploadICSState.PidTagCnsetSeen; break; case ICSStateProperties.PidTagCnsetSeenFAI: // PidTagCnsetSeenFAI propertyId 0x67DA, propertyTypeId 0x0102 stateProperty = (uint)((0x67DA << 16) | 0x0102); currentICSPropertyValue = new byte[uploadICSState.PidTagCnsetSeenFAI.Length]; currentICSPropertyValue = uploadICSState.PidTagCnsetSeenFAI; break; case ICSStateProperties.PidTagIdsetGiven: // PidTagIdsetGiven propertyId 0x4017, propertyTypeId 0x003 stateProperty = (uint)((0x4017 << 16) | 0x0102); if (isPidTagIdsetGivenInputAsInter32) { stateProperty = (uint)((0x4017 << 16) | 0x0003); } currentICSPropertyValue = new byte[uploadICSState.PidTagIdsetGiven.Length]; currentICSPropertyValue = uploadICSState.PidTagIdsetGiven; break; default: currentICSPropertyValue = new byte[0]; break; } synchronizationUploadStateStreamBeginRequest.TransferBufferSize = (uint)currentICSPropertyValue.Length; synchronizationUploadStateStreamBeginRequest.StateProperty = stateProperty; // Send the RopSynchronizationUploadStateStreamBegin request and get response from server. RopSynchronizationUploadStateStreamBeginResponse synchronizationUploadStateStreamBeginResponse = (RopSynchronizationUploadStateStreamBeginResponse)this.Process(serverId, synchronizationUploadStateStreamBeginRequest, synUploadContextHandle); result = (RopResult)synchronizationUploadStateStreamBeginResponse.ReturnValue; if (result == RopResult.Success) { // Verify ROP SynchronizationUploadStateStreamBegin this.VerifyRopSynchronizationUploadStateStreamBegin(synchronizationUploadStateStreamBeginResponse); if (isPidTagIdsetGivenInputAsInter32) { this.VerifyServerAcceptPidTagIdsetGivenPtypInteger32(result); } } else { return result; } // Construct the RopSynchronizationUploadStateStreamContinue request. RopSynchronizationUploadStateStreamContinueRequest synchronizationUploadStateStreamContinueRequest; synchronizationUploadStateStreamContinueRequest.RopId = 0x76; synchronizationUploadStateStreamContinueRequest.LogonId = 0x00; synchronizationUploadStateStreamContinueRequest.InputHandleIndex = 0x00; synchronizationUploadStateStreamContinueRequest.StreamDataSize = (uint)currentICSPropertyValue.Length; synchronizationUploadStateStreamContinueRequest.StreamData = currentICSPropertyValue; // Send the RopSynchronizationUploadStateStreamContinue request. RopSynchronizationUploadStateStreamContinueResponse synchronizationUploadStateStreamContinueResponse = (RopSynchronizationUploadStateStreamContinueResponse)this.Process(serverId, synchronizationUploadStateStreamContinueRequest, synUploadContextHandle); result = (RopResult)synchronizationUploadStateStreamContinueResponse.ReturnValue; if (result == RopResult.Success) { // Verify ROP SynchronizationUploadStateStreamContinue this.VerifyRopSynchronizationUploadStateStreamContinue(synchronizationUploadStateStreamContinueResponse); } else { return result; } // Construct the RopSynchronizationUploadStateStreamEnd request. RopSynchronizationUploadStateStreamEndRequest synchronizationUploadStateStreamEndRequest; synchronizationUploadStateStreamEndRequest.RopId = 0x77; synchronizationUploadStateStreamEndRequest.LogonId = 0x00; synchronizationUploadStateStreamEndRequest.InputHandleIndex = 0x00; RopSynchronizationUploadStateStreamEndResponse synchronizationUploadStateStreamEndResponse = (RopSynchronizationUploadStateStreamEndResponse)this.Process(serverId, synchronizationUploadStateStreamEndRequest, synUploadContextHandle); result = (RopResult)synchronizationUploadStateStreamEndResponse.ReturnValue; if (result == RopResult.Success) { // Verify ROP SynchronizationUploadStateStreamEnd this.VerifyRopSynchronizationUploadStateStreamEnd(synchronizationUploadStateStreamEndResponse); } return result; }