Blame channels/urbdrc/client/urbdrc_main.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 * RemoteFX USB Redirection
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Atrust corp.
Packit 1fb8d4
 * Copyright 2012 Alfred Liu <alfred.liu@atruscorp.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
Packit 1fb8d4
#define FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
Packit 1fb8d4
Packit Service 5a9772
#include <winpr/pool.h>
Packit Service 5a9772
#include <freerdp/channels/log.h>
Packit Service 5a9772
Packit Service 5a9772
#define DEVICE_HARDWARE_ID_SIZE 32
Packit Service 5a9772
#define DEVICE_COMPATIBILITY_ID_SIZE 36
Packit Service 5a9772
#define DEVICE_INSTANCE_STR_SIZE 37
Packit Service 5a9772
#define DEVICE_CONTAINER_STR_SIZE 39
Packit 1fb8d4
Packit Service 5a9772
#define TAG CHANNELS_TAG("urbdrc.client")
Packit Service 5a9772
#ifdef WITH_DEBUG_DVC
Packit Service 5a9772
#define DEBUG_DVC(...) WLog_DBG(TAG, __VA_ARGS__)
Packit Service 5a9772
#else
Packit Service 5a9772
#define DEBUG_DVC(...) \
Packit Service 5a9772
	do                 \
Packit Service 5a9772
	{                  \
Packit Service 5a9772
	} while (0)
Packit Service 5a9772
#endif
Packit 1fb8d4
Packit 1fb8d4
typedef struct _IUDEVICE IUDEVICE;
Packit 1fb8d4
typedef struct _IUDEVMAN IUDEVMAN;
Packit 1fb8d4
Packit 1fb8d4
#define BASIC_DEV_STATE_DEFINED(_arg, _type) \
Packit Service 5a9772
	_type (*get_##_arg)(IUDEVICE * pdev);    \
Packit Service 5a9772
	void (*set_##_arg)(IUDEVICE * pdev, _type _arg)
Packit 1fb8d4
Packit 1fb8d4
#define BASIC_DEVMAN_STATE_DEFINED(_arg, _type) \
Packit Service 5a9772
	_type (*get_##_arg)(IUDEVMAN * udevman);    \
Packit Service 5a9772
	void (*set_##_arg)(IUDEVMAN * udevman, _type _arg)
Packit 1fb8d4
Packit 1fb8d4
typedef struct _URBDRC_LISTENER_CALLBACK URBDRC_LISTENER_CALLBACK;
Packit 1fb8d4
Packit 1fb8d4
struct _URBDRC_LISTENER_CALLBACK
Packit 1fb8d4
{
Packit 1fb8d4
	IWTSListenerCallback iface;
Packit 1fb8d4
Packit 1fb8d4
	IWTSPlugin* plugin;
Packit 1fb8d4
	IWTSVirtualChannelManager* channel_mgr;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
typedef struct _URBDRC_CHANNEL_CALLBACK URBDRC_CHANNEL_CALLBACK;
Packit 1fb8d4
Packit 1fb8d4
struct _URBDRC_CHANNEL_CALLBACK
Packit 1fb8d4
{
Packit 1fb8d4
	IWTSVirtualChannelCallback iface;
Packit 1fb8d4
Packit 1fb8d4
	IWTSPlugin* plugin;
Packit 1fb8d4
	IWTSVirtualChannelManager* channel_mgr;
Packit 1fb8d4
	IWTSVirtualChannel* channel;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
typedef struct _URBDRC_PLUGIN URBDRC_PLUGIN;
Packit 1fb8d4
Packit 1fb8d4
struct _URBDRC_PLUGIN
Packit 1fb8d4
{
Packit 1fb8d4
	IWTSPlugin iface;
Packit 1fb8d4
Packit 1fb8d4
	URBDRC_LISTENER_CALLBACK* listener_callback;
Packit 1fb8d4
Packit 1fb8d4
	IUDEVMAN* udevman;
Packit 1fb8d4
	UINT32 vchannel_status;
Packit 1fb8d4
	char* subsystem;
Packit 1fb8d4
Packit Service 5a9772
	wLog* log;
Packit Service 5a9772
	IWTSListener* listener;
Packit Service 5a9772
};
Packit 1fb8d4
Packit Service 5a9772
typedef BOOL (*PREGISTERURBDRCSERVICE)(IWTSPlugin* plugin, IUDEVMAN* udevman);
Packit 1fb8d4
struct _FREERDP_URBDRC_SERVICE_ENTRY_POINTS
Packit 1fb8d4
{
Packit 1fb8d4
	IWTSPlugin* plugin;
Packit 1fb8d4
	PREGISTERURBDRCSERVICE pRegisterUDEVMAN;
Packit 1fb8d4
	ADDIN_ARGV* args;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _FREERDP_URBDRC_SERVICE_ENTRY_POINTS FREERDP_URBDRC_SERVICE_ENTRY_POINTS;
Packit 1fb8d4
typedef FREERDP_URBDRC_SERVICE_ENTRY_POINTS* PFREERDP_URBDRC_SERVICE_ENTRY_POINTS;
Packit 1fb8d4
Packit 1fb8d4
typedef int (*PFREERDP_URBDRC_DEVICE_ENTRY)(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS pEntryPoints);
Packit 1fb8d4
Packit 1fb8d4
typedef struct _TRANSFER_DATA TRANSFER_DATA;
Packit 1fb8d4
Packit 1fb8d4
struct _TRANSFER_DATA
Packit 1fb8d4
{
Packit 1fb8d4
	URBDRC_CHANNEL_CALLBACK* callback;
Packit 1fb8d4
	URBDRC_PLUGIN* urbdrc;
Packit 1fb8d4
	IUDEVMAN* udevman;
Packit Service 5a9772
	IWTSVirtualChannel* channel;
Packit Service 5a9772
	wStream* s;
Packit 1fb8d4
};
Packit 1fb8d4
Packit Service 5a9772
typedef void (*t_isoch_transfer_cb)(IUDEVICE* idev, URBDRC_CHANNEL_CALLBACK* callback, wStream* out,
Packit Service 5a9772
                                    UINT32 InterfaceId, BOOL noAck, UINT32 MessageId,
Packit Service 5a9772
                                    UINT32 RequestId, UINT32 NumberOfPackets, UINT32 status,
Packit Service 5a9772
                                    UINT32 StartFrame, UINT32 ErrorCount, UINT32 OutputBufferSize);
Packit Service 5a9772
Packit 1fb8d4
struct _IUDEVICE
Packit 1fb8d4
{
Packit 1fb8d4
	/* Transfer */
Packit Service 5a9772
	int (*isoch_transfer)(IUDEVICE* idev, URBDRC_CHANNEL_CALLBACK* callback, UINT32 MessageId,
Packit Service 5a9772
	                      UINT32 RequestId, UINT32 EndpointAddress, UINT32 TransferFlags,
Packit Service 5a9772
	                      UINT32 StartFrame, UINT32 ErrorCount, BOOL NoAck,
Packit Service 5a9772
	                      const BYTE* packetDescriptorData, UINT32 NumberOfPackets,
Packit Service 5a9772
	                      UINT32 BufferSize, const BYTE* Buffer, t_isoch_transfer_cb cb,
Packit Service 5a9772
	                      UINT32 Timeout);
Packit 1fb8d4
Packit Service 5a9772
	BOOL(*control_transfer)
Packit Service 5a9772
	(IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress, UINT32 TransferFlags,
Packit Service 5a9772
	 BYTE bmRequestType, BYTE Request, UINT16 Value, UINT16 Index, UINT32* UrbdStatus,
Packit Service 5a9772
	 UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout);
Packit 1fb8d4
Packit Service 5a9772
	int (*bulk_or_interrupt_transfer)(IUDEVICE* idev, URBDRC_CHANNEL_CALLBACK* callback,
Packit Service 5a9772
	                                  UINT32 MessageId, UINT32 RequestId, UINT32 EndpointAddress,
Packit Service 5a9772
	                                  UINT32 TransferFlags, BOOL NoAck, UINT32 BufferSize,
Packit Service 5a9772
	                                  t_isoch_transfer_cb cb, UINT32 Timeout);
Packit 1fb8d4
Packit Service 5a9772
	int (*select_configuration)(IUDEVICE* idev, UINT32 bConfigurationValue);
Packit 1fb8d4
Packit Service 5a9772
	int (*select_interface)(IUDEVICE* idev, BYTE InterfaceNumber, BYTE AlternateSetting);
Packit 1fb8d4
Packit Service 5a9772
	int (*control_pipe_request)(IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress,
Packit Service 5a9772
	                            UINT32* UsbdStatus, int command);
Packit 1fb8d4
Packit Service 5a9772
	UINT32(*control_query_device_text)
Packit Service 5a9772
	(IUDEVICE* idev, UINT32 TextType, UINT16 LocaleId, UINT8* BufferSize, BYTE* Buffer);
Packit 1fb8d4
Packit Service 5a9772
	int (*os_feature_descriptor_request)(IUDEVICE* idev, UINT32 RequestId, BYTE Recipient,
Packit Service 5a9772
	                                     BYTE InterfaceNumber, BYTE Ms_PageIndex,
Packit Service 5a9772
	                                     UINT16 Ms_featureDescIndex, UINT32* UsbdStatus,
Packit Service 5a9772
	                                     UINT32* BufferSize, BYTE* Buffer, int Timeout);
Packit 1fb8d4
Packit Service 5a9772
	void (*cancel_all_transfer_request)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	int (*cancel_transfer_request)(IUDEVICE* idev, UINT32 RequestId);
Packit 1fb8d4
Packit Service 5a9772
	int (*query_device_descriptor)(IUDEVICE* idev, int offset);
Packit 1fb8d4
Packit Service 5a9772
	BOOL (*detach_kernel_driver)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	BOOL (*attach_kernel_driver)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	int (*query_device_port_status)(IUDEVICE* idev, UINT32* UsbdStatus, UINT32* BufferSize,
Packit Service 5a9772
	                                BYTE* Buffer);
Packit 1fb8d4
Packit Service 5a9772
	MSUSB_CONFIG_DESCRIPTOR* (*complete_msconfig_setup)(IUDEVICE* idev,
Packit Service 5a9772
	                                                    MSUSB_CONFIG_DESCRIPTOR* MsConfig);
Packit Service 5a9772
	/* Basic state */
Packit Service 5a9772
	int (*isCompositeDevice)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	int (*isExist)(IUDEVICE* idev);
Packit Service 5a9772
	int (*isAlreadySend)(IUDEVICE* idev);
Packit Service 5a9772
	int (*isChannelClosed)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	void (*setAlreadySend)(IUDEVICE* idev);
Packit Service 5a9772
	void (*setChannelClosed)(IUDEVICE* idev);
Packit Service 5a9772
	char* (*getPath)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	void (*free)(IUDEVICE* idev);
Packit 1fb8d4
Packit Service 5a9772
	BASIC_DEV_STATE_DEFINED(channelManager, IWTSVirtualChannelManager*);
Packit Service 5a9772
	BASIC_DEV_STATE_DEFINED(channelID, UINT32);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(UsbDevice, UINT32);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(ReqCompletion, UINT32);
Packit Service 5a9772
	BASIC_DEV_STATE_DEFINED(bus_number, BYTE);
Packit Service 5a9772
	BASIC_DEV_STATE_DEFINED(dev_number, BYTE);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(port_number, int);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(MsConfig, MSUSB_CONFIG_DESCRIPTOR*);
Packit 1fb8d4
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(p_udev, void*);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(p_prev, void*);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(p_next, void*);
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct _IUDEVMAN
Packit 1fb8d4
{
Packit 1fb8d4
	/* Standard */
Packit Service 5a9772
	void (*free)(IUDEVMAN* idevman);
Packit 1fb8d4
Packit 1fb8d4
	/* Manage devices */
Packit Service 5a9772
	void (*rewind)(IUDEVMAN* idevman);
Packit Service 5a9772
	BOOL (*has_next)(IUDEVMAN* idevman);
Packit Service 5a9772
	BOOL (*unregister_udevice)(IUDEVMAN* idevman, BYTE bus_number, BYTE dev_number);
Packit Service 5a9772
	size_t (*register_udevice)(IUDEVMAN* idevman, BYTE bus_number, BYTE dev_number, UINT16 idVendor,
Packit Service 5a9772
	                           UINT16 idProduct, UINT32 flag);
Packit Service 5a9772
	IUDEVICE* (*get_next)(IUDEVMAN* idevman);
Packit Service 5a9772
	IUDEVICE* (*get_udevice_by_UsbDevice)(IUDEVMAN* idevman, UINT32 UsbDevice);
Packit 1fb8d4
Packit 1fb8d4
	/* Extension */
Packit Service 5a9772
	int (*isAutoAdd)(IUDEVMAN* idevman);
Packit 1fb8d4
Packit 1fb8d4
	/* Basic state */
Packit Service 5a9772
	BASIC_DEVMAN_STATE_DEFINED(device_num, UINT32);
Packit Service 5a9772
	BASIC_DEVMAN_STATE_DEFINED(next_device_id, UINT32);
Packit 1fb8d4
Packit 1fb8d4
	/* control semaphore or mutex lock */
Packit Service 5a9772
	void (*loading_lock)(IUDEVMAN* idevman);
Packit Service 5a9772
	void (*loading_unlock)(IUDEVMAN* idevman);
Packit Service 5a9772
	BOOL (*initialize)(IUDEVMAN* idevman, UINT32 channelId);
Packit Service 5a9772
	UINT (*listener_created_callback)(IUDEVMAN* idevman);
Packit Service 5a9772
Packit Service 5a9772
	IWTSPlugin* plugin;
Packit Service 5a9772
	UINT32 controlChannelId;
Packit Service 5a9772
	UINT32 status;
Packit 1fb8d4
};
Packit 1fb8d4
Packit Service 5a9772
#define DEVICE_ADD_FLAG_BUS 0x01
Packit Service 5a9772
#define DEVICE_ADD_FLAG_DEV 0x02
Packit Service 5a9772
#define DEVICE_ADD_FLAG_VENDOR 0x04
Packit Service 5a9772
#define DEVICE_ADD_FLAG_PRODUCT 0x08
Packit Service 5a9772
#define DEVICE_ADD_FLAG_REGISTER 0x10
Packit Service 5a9772
Packit Service 5a9772
#define DEVICE_ADD_FLAG_ALL                                               \
Packit Service 5a9772
	(DEVICE_ADD_FLAG_BUS | DEVICE_ADD_FLAG_DEV | DEVICE_ADD_FLAG_VENDOR | \
Packit Service 5a9772
	 DEVICE_ADD_FLAG_PRODUCT | DEVICE_ADD_FLAG_REGISTER)
Packit Service 5a9772
Packit Service 5a9772
FREERDP_API BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
Packit Service 5a9772
                            UINT16 idVendor, UINT16 idProduct);
Packit Service 5a9772
FREERDP_API BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum,
Packit Service 5a9772
                            UINT16 idVendor, UINT16 idProduct);
Packit Service 5a9772
Packit Service 5a9772
UINT stream_write_and_free(IWTSPlugin* plugin, IWTSVirtualChannel* channel, wStream* s);
Packit Service 5a9772
Packit 1fb8d4
#endif /* FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H */