Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
0
/**
 * 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;
}