int tsmf_ifman_exchange_capability_request(TSMF_IFMAN* ifman) { UINT32 i; UINT32 v; UINT32 pos; UINT32 CapabilityType; UINT32 cbCapabilityLength; UINT32 numHostCapabilities; pos = Stream_GetPosition(ifman->output); Stream_EnsureRemainingCapacity(ifman->output, ifman->input_size + 4); Stream_Copy(ifman->output, ifman->input, ifman->input_size); Stream_SetPosition(ifman->output, pos); Stream_Read_UINT32(ifman->output, numHostCapabilities); for (i = 0; i < numHostCapabilities; i++) { Stream_Read_UINT32(ifman->output, CapabilityType); Stream_Read_UINT32(ifman->output, cbCapabilityLength); pos = Stream_GetPosition(ifman->output); switch (CapabilityType) { case 1: /* Protocol version request */ Stream_Read_UINT32(ifman->output, v); DEBUG_DVC("server protocol version %d", v); break; case 2: /* Supported platform */ Stream_Peek_UINT32(ifman->output, v); DEBUG_DVC("server supported platform %d", v); /* Claim that we support both MF and DShow platforms. */ Stream_Write_UINT32(ifman->output, MMREDIR_CAPABILITY_PLATFORM_MF | MMREDIR_CAPABILITY_PLATFORM_DSHOW); break; default: DEBUG_WARN("unknown capability type %d", CapabilityType); break; } Stream_SetPosition(ifman->output, pos + cbCapabilityLength); } Stream_Write_UINT32(ifman->output, 0); /* Result */ ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB; return 0; }
static BOOL TestStream_Write(void) { BOOL rc = FALSE; UINT8 u8; UINT16 u16; UINT32 u32; UINT64 u64; const BYTE data[] = "someteststreamdata"; wStream* s = Stream_New(NULL, 100); if (!s) goto out; if (s->pointer != s->buffer) goto out; Stream_Write(s, data, sizeof(data)); if (memcmp(Stream_Buffer(s), data, sizeof(data)) == 0) rc = TRUE; if (s->pointer != s->buffer + sizeof(data)) goto out; Stream_SetPosition(s, 0); if (s->pointer != s->buffer) goto out; Stream_Write_UINT8(s, 42); if (s->pointer != s->buffer + 1) goto out; Stream_SetPosition(s, 0); if (s->pointer != s->buffer) goto out; Stream_Peek_UINT8(s, u8); if (u8 != 42) goto out; Stream_Write_UINT16(s, 0x1234); if (s->pointer != s->buffer + 2) goto out; Stream_SetPosition(s, 0); if (s->pointer != s->buffer) goto out; Stream_Peek_UINT16(s, u16); if (u16 != 0x1234) goto out; Stream_Write_UINT32(s, 0x12345678UL); if (s->pointer != s->buffer + 4) goto out; Stream_SetPosition(s, 0); if (s->pointer != s->buffer) goto out; Stream_Peek_UINT32(s, u32); if (u32 != 0x12345678UL) goto out; Stream_Write_UINT64(s, 0x1234567890ABCDEFULL); if (s->pointer != s->buffer + 8) goto out; Stream_SetPosition(s, 0); if (s->pointer != s->buffer) goto out; Stream_Peek_UINT64(s, u64); if (u64 != 0x1234567890ABCDEFULL) goto out; out: Stream_Free(s, TRUE); return rc; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT tsmf_ifman_exchange_capability_request(TSMF_IFMAN* ifman) { UINT32 i; UINT32 v; UINT32 pos; UINT32 CapabilityType; UINT32 cbCapabilityLength; UINT32 numHostCapabilities; if (!Stream_EnsureRemainingCapacity(ifman->output, ifman->input_size + 4)) return ERROR_OUTOFMEMORY; pos = Stream_GetPosition(ifman->output); Stream_Copy(ifman->input, ifman->output, ifman->input_size); Stream_SetPosition(ifman->output, pos); if (Stream_GetRemainingLength(ifman->output) < 4) return ERROR_INVALID_DATA; Stream_Read_UINT32(ifman->output, numHostCapabilities); for (i = 0; i < numHostCapabilities; i++) { if (Stream_GetRemainingLength(ifman->output) < 8) return ERROR_INVALID_DATA; Stream_Read_UINT32(ifman->output, CapabilityType); Stream_Read_UINT32(ifman->output, cbCapabilityLength); if (Stream_GetRemainingLength(ifman->output) < cbCapabilityLength) return ERROR_INVALID_DATA; pos = Stream_GetPosition(ifman->output); switch (CapabilityType) { case 1: /* Protocol version request */ if (Stream_GetRemainingLength(ifman->output) < 4) return ERROR_INVALID_DATA; Stream_Read_UINT32(ifman->output, v); DEBUG_TSMF("server protocol version %d", v); break; case 2: /* Supported platform */ if (Stream_GetRemainingLength(ifman->output) < 4) return ERROR_INVALID_DATA; Stream_Peek_UINT32(ifman->output, v); DEBUG_TSMF("server supported platform %d", v); /* Claim that we support both MF and DShow platforms. */ Stream_Write_UINT32(ifman->output, MMREDIR_CAPABILITY_PLATFORM_MF | MMREDIR_CAPABILITY_PLATFORM_DSHOW); break; default: WLog_ERR(TAG, "skipping unknown capability type %d", CapabilityType); break; } Stream_SetPosition(ifman->output, pos + cbCapabilityLength); } Stream_Write_UINT32(ifman->output, 0); /* Result */ ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB; return CHANNEL_RC_OK; }