static int rdpgfx_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, wStream* data) { wStream* s; int status = 0; UINT32 DstSize = 0; BYTE* pDstData = NULL; RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; status = zgfx_decompress(gfx->zgfx, Stream_Pointer(data), Stream_GetRemainingLength(data), &pDstData, &DstSize, 0); if (status < 0) { WLog_DBG(TAG, "zgfx_decompress failure! status: %d", status); return 0; } s = Stream_New(pDstData, DstSize); while (((size_t) Stream_GetPosition(s)) < Stream_Length(s)) { status = rdpgfx_recv_pdu(callback, s); if (status < 0) break; } Stream_Free(s, TRUE); //free(Stream_Buffer(data)); //Stream_Free(data,TRUE); return status; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT rdpgfx_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, wStream* data) { wStream* s; int status = 0; UINT32 DstSize = 0; BYTE* pDstData = NULL; RDPGFX_CHANNEL_CALLBACK* callback = (RDPGFX_CHANNEL_CALLBACK*) pChannelCallback; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; UINT error = CHANNEL_RC_OK; status = zgfx_decompress(gfx->zgfx, Stream_Pointer(data), Stream_GetRemainingLength(data), &pDstData, &DstSize, 0); if (status < 0) { WLog_ERR(TAG, "zgfx_decompress failure! status: %d", status); return ERROR_INTERNAL_ERROR; } s = Stream_New(pDstData, DstSize); if (!s) { WLog_ERR(TAG, "calloc failed!"); return CHANNEL_RC_NO_MEMORY; } while (((size_t) Stream_GetPosition(s)) < Stream_Length(s)) { if ((error = rdpgfx_recv_pdu(callback, s))) { WLog_ERR(TAG, "rdpgfx_recv_pdu failed with error %u!", error); break; } } Stream_Free(s, TRUE); return error; }