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
Packit 1fb8d4
Packit 1fb8d4
#ifndef FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
Packit 1fb8d4
#define FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H
Packit 1fb8d4
Packit 1fb8d4
#include "searchman.h"
Packit 1fb8d4
#include "isoch_queue.h"
Packit 1fb8d4
Packit 1fb8d4
#define DEVICE_HARDWARE_ID_SIZE				32
Packit 1fb8d4
#define DEVICE_COMPATIBILITY_ID_SIZE			36
Packit 1fb8d4
#define DEVICE_INSTANCE_STR_SIZE			37
Packit 1fb8d4
#define DEVICE_CONTAINER_STR_SIZE			39
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 1fb8d4
	_type (*get_##_arg) (IUDEVICE* pdev); \
Packit 1fb8d4
	void (*set_##_arg) (IUDEVICE* pdev, _type _arg)
Packit 1fb8d4
Packit 1fb8d4
#define BASIC_DEVMAN_STATE_DEFINED(_arg, _type) \
Packit 1fb8d4
	_type (*get_##_arg) (IUDEVMAN* udevman); \
Packit 1fb8d4
	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
	USB_SEARCHMAN* searchman;
Packit 1fb8d4
	UINT32 first_channel_id;
Packit 1fb8d4
	UINT32 vchannel_status;
Packit 1fb8d4
	char* subsystem;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
typedef void (*PREGISTERURBDRCSERVICE)(IWTSPlugin* plugin, IUDEVMAN* udevman);
Packit 1fb8d4
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 1fb8d4
	BYTE* pBuffer;
Packit 1fb8d4
	UINT32 cbSize;
Packit 1fb8d4
	UINT32 UsbDevice;
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct _IUDEVICE
Packit 1fb8d4
{
Packit 1fb8d4
	/* Transfer */
Packit 1fb8d4
	int (*isoch_transfer) (IUDEVICE* idev, UINT32 RequestId,
Packit 1fb8d4
		UINT32 EndpointAddress, UINT32 TransferFlags, int NoAck, UINT32* ErrorCount,
Packit 1fb8d4
		UINT32* UrbdStatus, UINT32* StartFrame, UINT32 NumberOfPackets,
Packit 1fb8d4
		BYTE* IsoPacket, UINT32* BufferSize, BYTE* Buffer, int Timeout);
Packit 1fb8d4
Packit 1fb8d4
	int (*control_transfer) (IUDEVICE* idev, UINT32 RequestId,
Packit 1fb8d4
		UINT32 EndpointAddress, UINT32 TransferFlags, BYTE bmRequestType, BYTE Request, UINT16 Value,
Packit 1fb8d4
		UINT16 Index, UINT32* UrbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout);
Packit 1fb8d4
Packit 1fb8d4
	int (*bulk_or_interrupt_transfer) (IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress,
Packit 1fb8d4
		UINT32 TransferFlags, UINT32* UsbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout);
Packit 1fb8d4
Packit 1fb8d4
	int (*select_configuration) (IUDEVICE* idev, UINT32 bConfigurationValue);
Packit 1fb8d4
Packit 1fb8d4
	int (*select_interface) (IUDEVICE* idev, BYTE InterfaceNumber,
Packit 1fb8d4
		BYTE AlternateSetting);
Packit 1fb8d4
Packit 1fb8d4
	int (*control_pipe_request) (IUDEVICE* idev, UINT32 RequestId,
Packit 1fb8d4
		UINT32 EndpointAddress, UINT32* UsbdStatus, int command);
Packit 1fb8d4
Packit 1fb8d4
	int (*control_query_device_text) (IUDEVICE* idev, UINT32 TextType,
Packit 1fb8d4
		UINT32 LocaleId, UINT32*BufferSize, BYTE* Buffer);
Packit 1fb8d4
Packit 1fb8d4
	int (*os_feature_descriptor_request) (IUDEVICE* idev, UINT32 RequestId, BYTE Recipient,
Packit 1fb8d4
		BYTE InterfaceNumber, BYTE Ms_PageIndex, UINT16 Ms_featureDescIndex, UINT32* UsbdStatus,
Packit 1fb8d4
		UINT32* BufferSize, BYTE* Buffer, int Timeout);
Packit 1fb8d4
Packit 1fb8d4
	void (*cancel_all_transfer_request) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	int (*cancel_transfer_request) (IUDEVICE* idev, UINT32 RequestId);
Packit 1fb8d4
Packit 1fb8d4
	int (*query_device_descriptor) (IUDEVICE* idev, int offset);
Packit 1fb8d4
Packit 1fb8d4
	void (*detach_kernel_driver) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	void (*attach_kernel_driver) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	int (*wait_action_completion) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	void (*push_action) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	void (*complete_action) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	/* Wait for 5 sec */
Packit 1fb8d4
	int (*wait_for_detach) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	/* FIXME: Currently this is a way of stupid, SHOULD to improve it.
Packit 1fb8d4
	 *        Isochronous transfer must to FIFO */
Packit 1fb8d4
	void (*lock_fifo_isoch) (IUDEVICE* idev);
Packit 1fb8d4
	void (*unlock_fifo_isoch) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	int (*query_device_port_status) (IUDEVICE* idev, UINT32 *UsbdStatus,
Packit 1fb8d4
		UINT32* BufferSize,
Packit 1fb8d4
		BYTE* Buffer);
Packit 1fb8d4
Packit 1fb8d4
	int (*request_queue_is_none) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	MSUSB_CONFIG_DESCRIPTOR* (*complete_msconfig_setup) (IUDEVICE* idev,
Packit 1fb8d4
		MSUSB_CONFIG_DESCRIPTOR* MsConfig);
Packit 1fb8d4
	/* Basic state */
Packit 1fb8d4
	int (*isCompositeDevice) (IUDEVICE* idev);
Packit 1fb8d4
	int (*isSigToEnd) (IUDEVICE* idev);
Packit 1fb8d4
	int (*isExist) (IUDEVICE* idev);
Packit 1fb8d4
	int (*isAlreadySend) (IUDEVICE* idev);
Packit 1fb8d4
	int (*isChannelClosed) (IUDEVICE* idev);
Packit 1fb8d4
	void (*SigToEnd) (IUDEVICE* idev);
Packit 1fb8d4
	void (*setAlreadySend) (IUDEVICE* idev);
Packit 1fb8d4
	void (*setChannelClosed) (IUDEVICE* idev);
Packit 1fb8d4
	char *(*getPath) (IUDEVICE* idev);
Packit 1fb8d4
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(channel_id, UINT32);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(UsbDevice, UINT32);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(ReqCompletion, UINT32);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(bus_number, UINT16);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(dev_number, UINT16);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(port_number, int);
Packit 1fb8d4
	BASIC_DEV_STATE_DEFINED(isoch_queue, void*);
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
	/* Control semaphore or mutex lock */
Packit 1fb8d4
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
struct _IUDEVMAN
Packit 1fb8d4
{
Packit 1fb8d4
	/* Standard */
Packit 1fb8d4
	void (*free) (IUDEVMAN* idevman);
Packit 1fb8d4
Packit 1fb8d4
	/* Manage devices */
Packit 1fb8d4
	void (*rewind) (IUDEVMAN* idevman);
Packit 1fb8d4
	int (*has_next) (IUDEVMAN* idevman);
Packit 1fb8d4
	int (*unregister_udevice) (IUDEVMAN* idevman, int bus_number, int dev_number);
Packit 1fb8d4
	int (*register_udevice) (IUDEVMAN* idevman, int bus_number,
Packit 1fb8d4
		int dev_number, int UsbDevice, UINT16 idVendor, UINT16 idProduct, int flag);
Packit 1fb8d4
	IUDEVICE *(*get_next) (IUDEVMAN* idevman);
Packit 1fb8d4
	IUDEVICE *(*get_udevice_by_UsbDevice) (IUDEVMAN* idevman, UINT32 UsbDevice);
Packit 1fb8d4
	IUDEVICE *(*get_udevice_by_UsbDevice_try_again) (IUDEVMAN* idevman, UINT32 UsbDevice);
Packit 1fb8d4
Packit 1fb8d4
	/* Extension */
Packit 1fb8d4
	int (*check_device_exist_by_id) (IUDEVMAN* idevman, UINT16 idVendor, UINT16 idProduct);
Packit 1fb8d4
	int (*isAutoAdd) (IUDEVMAN* idevman);
Packit 1fb8d4
Packit 1fb8d4
	/* Basic state */
Packit 1fb8d4
	BASIC_DEVMAN_STATE_DEFINED(defUsbDevice, UINT32);
Packit 1fb8d4
	BASIC_DEVMAN_STATE_DEFINED(device_num, int);
Packit 1fb8d4
	BASIC_DEVMAN_STATE_DEFINED(sem_timeout, int);
Packit 1fb8d4
Packit 1fb8d4
	/* control semaphore or mutex lock */
Packit 1fb8d4
	void (*loading_lock) (IUDEVMAN* idevman);
Packit 1fb8d4
	void (*loading_unlock) (IUDEVMAN* idevman);
Packit 1fb8d4
	void (*push_urb) (IUDEVMAN* idevman);
Packit 1fb8d4
	void (*wait_urb) (IUDEVMAN* idevman);
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
#endif /* FREERDP_CHANNEL_URBDRC_CLIENT_MAIN_H */