private byte[] EncodePtrPos(TS_FP_POINTERPOSATTRIBUTE ptrData) { List<byte> totalBuffer = new List<byte>(); List<byte> buffer = new List<byte>(); RdpbcgrEncoder.EncodeStructure(buffer, ptrData.pointerPositionUpdateData.position.xPos); RdpbcgrEncoder.EncodeStructure(buffer, ptrData.pointerPositionUpdateData.position.yPos); if (ptrData.compressionFlags != compressedType_Values.None) { RdpbcgrEncoder.EncodeBytes( totalBuffer, serverSessionContext.Compress(ptrData.compressionFlags, buffer.ToArray())); } else { RdpbcgrEncoder.EncodeBytes(totalBuffer, buffer.ToArray()); } return totalBuffer.ToArray(); }
/// <summary> /// Parse TS_FP_POINTERPOSATTRIBUTE /// </summary> /// <param name="updateHeader">update header</param> /// <param name="compressionFlags">compression flags</param> /// <param name="size">update data size(before decompression)</param> /// <param name="updateData">update data(decompressed)</param> /// <returns>TS_FP_POINTERPOSATTRIBUTE</returns> private TS_FP_POINTERPOSATTRIBUTE ParseTsFpPointerPosAttribute( byte updateHeader, compressedType_Values compressionFlags, UInt16 size, byte[] updateData) { TS_FP_POINTERPOSATTRIBUTE positionAttribute = new TS_FP_POINTERPOSATTRIBUTE(); // TS_FP_POINTERPOSATTRIBUTE: updateHeader positionAttribute.updateHeader = updateHeader; // TS_FP_POINTERPOSATTRIBUTE: compressionFlags positionAttribute.compressionFlags = compressionFlags; // TS_FP_POINTERPOSATTRIBUTE: size positionAttribute.size = size; // TS_FP_POINTERPOSATTRIBUTE: pointerPositionUpdateData int index = 0; positionAttribute.pointerPositionUpdateData = ParseTsPointerPosAttribute(updateData, ref index); // Check if data length exceeded expectation VerifyDataLength(updateData.Length, index, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED); return positionAttribute; }
public static TS_FP_POINTERPOSATTRIBUTE CreateFPPointerPosAttribute(int x, int y) { TS_FP_POINTERPOSATTRIBUTE fpPos = new TS_FP_POINTERPOSATTRIBUTE(); fpPos.updateHeader = (byte)(((int)updateCode_Values.FASTPATH_UPDATETYPE_PTR_POSITION & 0x0f) | (((int)fragmentation_Value.FASTPATH_FRAGMENT_SINGLE) << 4) | ((int)compressedType_Values.None << 6)); fpPos.compressionFlags = compressedType_Values.None; fpPos.pointerPositionUpdateData.position.xPos = (ushort)x; fpPos.pointerPositionUpdateData.position.yPos = (ushort)y; fpPos.size = 4; return fpPos; }