20#include <freerdp/utils/channel_pdu_tracker.h>
22#include <winpr/wtsapi.h>
24#include <freerdp/log.h>
25#define TTAG FREERDP_TAG("utils.ChannelPduTracker")
27struct ChannelPduTracker
31 char buffer[CHANNEL_PDU_LENGTH];
36wStream* ChannelPduTracker_poll(ChannelPduTracker* tracker, BOOL* ok)
38 WINPR_ASSERT(tracker);
44 WINPR_ASSERT(tracker->offset <= CHANNEL_PDU_LENGTH);
45 const ULONG readSz = WINPR_ASSERTING_INT_CAST(ULONG, CHANNEL_PDU_LENGTH - tracker->offset);
46 if (!WTSVirtualChannelRead(tracker->vc, INFINITE, &tracker->buffer[tracker->offset], readSz,
50 tracker->offset += sz;
51 WINPR_ASSERT(tracker->offset <= CHANNEL_PDU_LENGTH);
53 const size_t recvSz = tracker->offset;
61 if (header->length > CHANNEL_CHUNK_LENGTH)
63 WLog_Print(tracker->log, WLOG_ERROR,
"chunk size %" PRIu32
" is too big", header->length);
68 if (actual != header->length)
70 WLog_Print(tracker->log, WLOG_ERROR,
71 "Expected chunk size %" PRIu32
" does not match received data size %" PRIuz,
72 header->length, actual);
77 if ((header->flags & CHANNEL_FLAG_FIRST) != 0)
78 Stream_ResetPosition(tracker->currentPacket);
80 if (!Stream_EnsureRemainingCapacity(tracker->currentPacket, header->length))
86 if ((header->flags & CHANNEL_FLAG_LAST) == 0)
92 Stream_SealLength(tracker->currentPacket);
93 Stream_ResetPosition(tracker->currentPacket);
94 wStream* ret = tracker->currentPacket;
96 tracker->currentPacket = Stream_New(
nullptr, 4096);
97 if (!tracker->currentPacket)
100 WLog_Print(tracker->log, WLOG_ERROR,
"error allocating new currentPacket");
108void ChannelPduTracker_free(ChannelPduTracker* tracker)
113 Stream_Release(tracker->currentPacket);
117ChannelPduTracker* ChannelPduTracker_new(HANDLE vc)
119 ChannelPduTracker* ret = calloc(1,
sizeof(*ret));
123 ret->currentPacket = Stream_New(
nullptr, 4096);
124 if (!ret->currentPacket)
128 ret->log = WLog_Get(TTAG);
133 ChannelPduTracker_free(ret);