diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt index e5c0a3906..d9e840255 100644 --- a/channels/CMakeLists.txt +++ b/channels/CMakeLists.txt @@ -22,14 +22,35 @@ include(CMakeDependentOption) macro(define_channel_options) set(PREFIX "CHANNEL") - + cmake_parse_arguments(${PREFIX} "" "NAME;TYPE;DESCRIPTION;SPECIFICATIONS;DEFAULT" "" ${ARGN}) - + string(TOUPPER "CHANNEL_${CHANNEL_NAME}" CHANNEL_OPTION) + string(TOUPPER "CHANNEL_${CHANNEL_NAME}_CLIENT" CHANNEL_CLIENT_OPTION) + string(TOUPPER "CHANNEL_${CHANNEL_NAME}_SERVER" CHANNEL_SERVER_OPTION) + + if(${${CHANNEL_CLIENT_OPTION}}) + set(OPTION_CLIENT_DEFAULT ${${CHANNEL_CLIENT_OPTION}}) + endif() + + if(${${CHANNEL_SERVER_OPTION}}) + set(OPTION_SERVER_DEFAULT ${${CHANNEL_SERVER_OPTION}}) + endif() + + if(${${CHANNEL_OPTION}}) + set(OPTION_DEFAULT ${${CHANNEL_OPTION}}) + endif() + + if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) + set(OPTION_DEFAULT "ON") + endif() + + set(CHANNEL_DEFAULT ${OPTION_DEFAULT}) + set(CHANNEL_OPTION_DOC "Build ${CHANNEL_NAME} ${CHANNEL_TYPE} channel") option(${CHANNEL_OPTION} "${CHANNEL_OPTION_DOC}" ${CHANNEL_DEFAULT}) diff --git a/channels/audin/ChannelOptions.cmake b/channels/audin/ChannelOptions.cmake index 662f53559..a9c21b41b 100644 --- a/channels/audin/ChannelOptions.cmake +++ b/channels/audin/ChannelOptions.cmake @@ -8,10 +8,6 @@ if(ANDROID) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "audin" TYPE "dynamic" DESCRIPTION "Audio Input Redirection Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEAI]" @@ -19,3 +15,4 @@ define_channel_options(NAME "audin" TYPE "dynamic" define_channel_client_options(${OPTION_CLIENT_DEFAULT}) define_channel_server_options(${OPTION_SERVER_DEFAULT}) + diff --git a/channels/cliprdr/ChannelOptions.cmake b/channels/cliprdr/ChannelOptions.cmake index fed6d4da5..9cafcd965 100644 --- a/channels/cliprdr/ChannelOptions.cmake +++ b/channels/cliprdr/ChannelOptions.cmake @@ -3,10 +3,6 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) set(OPTION_SERVER_DEFAULT OFF) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "cliprdr" TYPE "static" DESCRIPTION "Clipboard Virtual Channel Extension" SPECIFICATIONS "[MS-RDPECLIP]" diff --git a/channels/drdynvc/ChannelOptions.cmake b/channels/drdynvc/ChannelOptions.cmake index 5212b1a51..1b226e64d 100644 --- a/channels/drdynvc/ChannelOptions.cmake +++ b/channels/drdynvc/ChannelOptions.cmake @@ -3,10 +3,6 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) set(OPTION_SERVER_DEFAULT OFF) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "drdynvc" TYPE "static" DESCRIPTION "Dynamic Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEDYC]" diff --git a/channels/drive/ChannelOptions.cmake b/channels/drive/ChannelOptions.cmake index 55b7846bc..717764cf2 100644 --- a/channels/drive/ChannelOptions.cmake +++ b/channels/drive/ChannelOptions.cmake @@ -8,10 +8,6 @@ if(ANDROID) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "drive" TYPE "device" DESCRIPTION "Drive Redirection Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEFS]" diff --git a/channels/parallel/ChannelOptions.cmake b/channels/parallel/ChannelOptions.cmake index 7864540a6..42a866991 100644 --- a/channels/parallel/ChannelOptions.cmake +++ b/channels/parallel/ChannelOptions.cmake @@ -13,10 +13,6 @@ if(ANDROID) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "parallel" TYPE "device" DESCRIPTION "Parallel Port Virtual Channel Extension" SPECIFICATIONS "[MS-RDPESP]" diff --git a/channels/printer/ChannelOptions.cmake b/channels/printer/ChannelOptions.cmake index 13f680892..86dad03ad 100644 --- a/channels/printer/ChannelOptions.cmake +++ b/channels/printer/ChannelOptions.cmake @@ -14,10 +14,6 @@ else() set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "printer" TYPE "device" DESCRIPTION "Print Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEPC]" diff --git a/channels/rail/ChannelOptions.cmake b/channels/rail/ChannelOptions.cmake index 5332e9990..76f8571f2 100644 --- a/channels/rail/ChannelOptions.cmake +++ b/channels/rail/ChannelOptions.cmake @@ -3,10 +3,6 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) set(OPTION_SERVER_DEFAULT OFF) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "rail" TYPE "static" DESCRIPTION "Remote Programs Virtual Channel Extension" SPECIFICATIONS "[MS-RDPERP]" diff --git a/channels/rdpdr/ChannelOptions.cmake b/channels/rdpdr/ChannelOptions.cmake index 85dc252d3..3bc158571 100644 --- a/channels/rdpdr/ChannelOptions.cmake +++ b/channels/rdpdr/ChannelOptions.cmake @@ -3,10 +3,6 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) set(OPTION_SERVER_DEFAULT OFF) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "rdpdr" TYPE "static" DESCRIPTION "Device Redirection Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEFS] [MS-RDPEPC] [MS-RDPESC] [MS-RDPESP]" diff --git a/channels/rdpsnd/ChannelOptions.cmake b/channels/rdpsnd/ChannelOptions.cmake index 5755b0e5b..909da1de5 100644 --- a/channels/rdpsnd/ChannelOptions.cmake +++ b/channels/rdpsnd/ChannelOptions.cmake @@ -3,10 +3,6 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT ON) set(OPTION_SERVER_DEFAULT ON) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "rdpsnd" TYPE "static" DESCRIPTION "Audio Output Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEA]" diff --git a/channels/sample/ChannelOptions.cmake b/channels/sample/ChannelOptions.cmake index d0f239235..ffcf00be4 100644 --- a/channels/sample/ChannelOptions.cmake +++ b/channels/sample/ChannelOptions.cmake @@ -8,10 +8,6 @@ if(WITH_SAMPLE) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "sample" TYPE "static" DESCRIPTION "Sample Virtual Channel Extension" SPECIFICATIONS "" diff --git a/channels/serial/ChannelOptions.cmake b/channels/serial/ChannelOptions.cmake index 808205506..add3443b4 100644 --- a/channels/serial/ChannelOptions.cmake +++ b/channels/serial/ChannelOptions.cmake @@ -13,10 +13,6 @@ if(ANDROID) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "serial" TYPE "device" DESCRIPTION "Serial Port Virtual Channel Extension" SPECIFICATIONS "[MS-RDPESP]" diff --git a/channels/smartcard/ChannelOptions.cmake b/channels/smartcard/ChannelOptions.cmake index 7ff221a5c..ad8cc40fc 100644 --- a/channels/smartcard/ChannelOptions.cmake +++ b/channels/smartcard/ChannelOptions.cmake @@ -8,10 +8,6 @@ if(WITH_PCSC) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "smartcard" TYPE "device" DESCRIPTION "Smart Card Virtual Channel Extension" SPECIFICATIONS "[MS-RDPESC]" diff --git a/channels/tsmf/ChannelOptions.cmake b/channels/tsmf/ChannelOptions.cmake index a0d78f847..b59578f6d 100644 --- a/channels/tsmf/ChannelOptions.cmake +++ b/channels/tsmf/ChannelOptions.cmake @@ -13,10 +13,6 @@ if(ANDROID) set(OPTION_SERVER_DEFAULT OFF) endif() -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "tsmf" TYPE "dynamic" DESCRIPTION "Video Redirection Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEV]" diff --git a/channels/urbdrc/ChannelOptions.cmake b/channels/urbdrc/ChannelOptions.cmake index 92424c967..ff00af99d 100644 --- a/channels/urbdrc/ChannelOptions.cmake +++ b/channels/urbdrc/ChannelOptions.cmake @@ -3,15 +3,10 @@ set(OPTION_DEFAULT OFF) set(OPTION_CLIENT_DEFAULT OFF) set(OPTION_SERVER_DEFAULT OFF) -if(${OPTION_CLIENT_DEFAULT} OR ${OPTION_SERVER_DEFAULT}) - set(OPTION_DEFAULT ON) -endif() - define_channel_options(NAME "urbdrc" TYPE "dynamic" DESCRIPTION "USB Devices Virtual Channel Extension" SPECIFICATIONS "[MS-RDPEUSB]" DEFAULT ${OPTION_DEFAULT}) define_channel_client_options(${OPTION_CLIENT_DEFAULT}) -#define_channel_server_options(${OPTION_SERVER_DEFAULT}) - +define_channel_server_options(${OPTION_SERVER_DEFAULT}) diff --git a/channels/urbdrc/client/CMakeLists.txt b/channels/urbdrc/client/CMakeLists.txt index ebf4d9417..94c5113c4 100644 --- a/channels/urbdrc/client/CMakeLists.txt +++ b/channels/urbdrc/client/CMakeLists.txt @@ -42,10 +42,15 @@ set(${MODULE_PREFIX}_LIBS udev uuid) +set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS + MONOLITHIC ${MONOLITHIC_BUILD} + MODULE winpr + MODULES winpr-utils) + set_complex_link_libraries(VARIABLE ${MODULE_PREFIX}_LIBS MONOLITHIC ${MONOLITHIC_BUILD} MODULE freerdp - MODULES freerdp-utils) + MODULES freerdp-common freerdp-utils) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/urbdrc/client/data_transfer.c b/channels/urbdrc/client/data_transfer.c index 289f3de67..e7e3f4a17 100644 --- a/channels/urbdrc/client/data_transfer.c +++ b/channels/urbdrc/client/data_transfer.c @@ -798,8 +798,7 @@ static int urb_bulk_or_interrupt_transfer(URBDRC_CHANNEL_CALLBACK* callback, BYT } -static int -urb_isoch_transfer(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, +static int urb_isoch_transfer(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, @@ -963,8 +962,7 @@ urb_isoch_transfer(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, return 0; } -static int -urb_control_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_control_descriptor_request(URBDRC_CHANNEL_CALLBACK* callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -973,17 +971,19 @@ urb_control_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE func_recipient, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, InterfaceId, RequestId, OutputBufferSize, usbd_status; - BYTE bmRequestType, desc_index, desc_type; - UINT16 langId; - BYTE * buffer; - BYTE * out_data; - int ret, offset; + IUDEVICE* pdev; + UINT32 out_size, InterfaceId, RequestId, OutputBufferSize, usbd_status; + BYTE bmRequestType, desc_index, desc_type; + UINT16 langId; + BYTE* buffer; + BYTE* out_data; + int ret, offset; pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); + if (pdev == NULL) return 0; + InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev)); data_read_UINT32(data + 0, RequestId); data_read_BYTE(data + 4, desc_index); @@ -1055,11 +1055,7 @@ urb_control_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, return 0; } - - - -static int -urb_control_get_status_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, +static int urb_control_get_status_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, @@ -1067,13 +1063,13 @@ urb_control_get_status_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, BYTE func_recipient, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; - UINT16 Index; - BYTE bmRequestType; - BYTE * buffer; - BYTE * out_data; - int offset, ret; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; + UINT16 Index; + BYTE bmRequestType; + BYTE* buffer; + BYTE* out_data; + int offset, ret; if (transferDir == 0){ LLOGLN(urbdrc_debug, ("urb_control_get_status_request: not support transfer out\n")); @@ -1150,8 +1146,7 @@ urb_control_get_status_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, return 0; } -static int -urb_control_vendor_or_class_request(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_control_vendor_or_class_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -1161,14 +1156,14 @@ urb_control_vendor_or_class_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE func_recipient, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, TransferFlags, usbd_status; - UINT32 OutputBufferSize; - BYTE ReqTypeReservedBits, Request, bmRequestType; - UINT16 Value, Index, Padding; - BYTE * buffer; - BYTE * out_data; - int offset, ret; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, TransferFlags, usbd_status; + UINT32 OutputBufferSize; + BYTE ReqTypeReservedBits, Request, bmRequestType; + UINT16 Value, Index, Padding; + BYTE* buffer; + BYTE* out_data; + int offset, ret; /** control by vendor command */ pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); @@ -1260,8 +1255,7 @@ urb_control_vendor_or_class_request(URBDRC_CHANNEL_CALLBACK * callback, -static int -urb_os_feature_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_os_feature_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -1269,17 +1263,19 @@ urb_os_feature_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, UINT32 UsbDevice, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; - BYTE Recipient, InterfaceNumber, Ms_PageIndex; - UINT16 Ms_featureDescIndex; - BYTE * out_data; - BYTE * buffer; - int offset, ret; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; + BYTE Recipient, InterfaceNumber, Ms_PageIndex; + UINT16 Ms_featureDescIndex; + BYTE* out_data; + BYTE* buffer; + int offset, ret; pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); + if (pdev == NULL) return 0; + InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev)); data_read_UINT32(data + 0, RequestId); @@ -1351,14 +1347,11 @@ urb_os_feature_descriptor_request(URBDRC_CHANNEL_CALLBACK * callback, callback->channel->Write(callback->channel, out_size, out_data, NULL); zfree(out_data); + return 0; } - - - -static int -urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, +static int urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, @@ -1366,11 +1359,11 @@ urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, int transferDir, int action) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, PipeHandle, EndpointAddress; - UINT32 OutputBufferSize, usbd_status = 0; - BYTE * out_data; - int out_offset, ret; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, PipeHandle, EndpointAddress; + UINT32 OutputBufferSize, usbd_status = 0; + BYTE* out_data; + int out_offset, ret; if (transferDir == 0){ LLOGLN(urbdrc_debug, ("urb_pipe_request: not support transfer out\n")); @@ -1378,8 +1371,10 @@ urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, } pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); + if (pdev == NULL) return 0; + InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev)); data_read_UINT32(data + 0, RequestId); @@ -1445,14 +1440,11 @@ urb_pipe_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, if (!pdev->isSigToEnd(pdev)) callback->channel->Write(callback->channel, out_size, out_data, NULL); zfree(out_data); + return 0; } - - - -static int -urb_get_current_frame_number(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_get_current_frame_number(URBDRC_CHANNEL_CALLBACK* callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -1460,10 +1452,10 @@ urb_get_current_frame_number(URBDRC_CHANNEL_CALLBACK * callback, UINT32 UsbDevice, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize; - UINT32 dummy_frames; - BYTE * out_data; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize; + UINT32 dummy_frames; + BYTE* out_data; if (transferDir == 0){ LLOGLN(urbdrc_debug, ("urb_get_current_frame_number: not support transfer out\n")); @@ -1510,8 +1502,7 @@ urb_get_current_frame_number(URBDRC_CHANNEL_CALLBACK * callback, /* Unused function for current server */ -static int -urb_control_get_configuration_request(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_control_get_configuration_request(URBDRC_CHANNEL_CALLBACK* callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -1519,21 +1510,24 @@ urb_control_get_configuration_request(URBDRC_CHANNEL_CALLBACK * callback, UINT32 UsbDevice, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; - BYTE * buffer; - BYTE * out_data; - int ret, offset; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; + BYTE* buffer; + BYTE* out_data; + int ret, offset; - if (transferDir == 0){ + if (transferDir == 0) + { LLOGLN(urbdrc_debug, ("urb_control_get_configuration_request:" " not support transfer out\n")); return -1; } pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); + if (pdev == NULL) return 0; + InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev)); data_read_UINT32(data + 0, RequestId); @@ -1589,8 +1583,7 @@ urb_control_get_configuration_request(URBDRC_CHANNEL_CALLBACK * callback, } /* Unused function for current server */ -static int -urb_control_get_interface_request(URBDRC_CHANNEL_CALLBACK * callback, +static int urb_control_get_interface_request(URBDRC_CHANNEL_CALLBACK* callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, @@ -1598,12 +1591,12 @@ urb_control_get_interface_request(URBDRC_CHANNEL_CALLBACK * callback, UINT32 UsbDevice, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; - UINT16 interface; - BYTE * buffer; - BYTE * out_data; - int ret, offset; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; + UINT16 interface; + BYTE* buffer; + BYTE* out_data; + int ret, offset; if (transferDir == 0){ LLOGLN(urbdrc_debug, ("urb_control_get_interface_request: not support transfer out\n")); @@ -1666,8 +1659,7 @@ urb_control_get_interface_request(URBDRC_CHANNEL_CALLBACK * callback, return 0; } -static int -urb_control_feature_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, +static int urb_control_feature_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, @@ -1676,17 +1668,19 @@ urb_control_feature_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, BYTE command, int transferDir) { - IUDEVICE * pdev; - UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; - UINT16 FeatureSelector, Index; - BYTE bmRequestType, bmRequest; - BYTE * buffer; - BYTE * out_data; - int ret, offset; + IUDEVICE* pdev; + UINT32 out_size, RequestId, InterfaceId, OutputBufferSize, usbd_status; + UINT16 FeatureSelector, Index; + BYTE bmRequestType, bmRequest; + BYTE* buffer; + BYTE* out_data; + int ret, offset; pdev = udevman->get_udevice_by_UsbDevice(udevman, UsbDevice); + if (pdev == NULL) return 0; + InterfaceId = ((STREAM_ID_PROXY<<30) | pdev->get_ReqCompletion(pdev)); data_read_UINT32(data + 0, RequestId); @@ -1769,8 +1763,7 @@ urb_control_feature_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, return 0; } -static int -urbdrc_process_transfer_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, +static int urbdrc_process_transfer_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, UINT32 data_sizem, UINT32 MessageId, IUDEVMAN * udevman, @@ -2296,13 +2289,13 @@ urbdrc_process_transfer_request(URBDRC_CHANNEL_CALLBACK * callback, BYTE * data, break; default: LLOGLN(urbdrc_debug, ("URB_Func: %x is not found!", URB_Function)); + break; } return error; } -void* -urbdrc_process_udev_data_transfer(void* arg) +void* urbdrc_process_udev_data_transfer(void* arg) { TRANSFER_DATA* transfer_data = (TRANSFER_DATA*) arg; URBDRC_CHANNEL_CALLBACK * callback = transfer_data->callback; diff --git a/channels/urbdrc/client/isoch_queue.c b/channels/urbdrc/client/isoch_queue.c index 0d124ca1d..91d6391ec 100644 --- a/channels/urbdrc/client/isoch_queue.c +++ b/channels/urbdrc/client/isoch_queue.c @@ -149,9 +149,11 @@ void isoch_queue_free(ISOCH_CALLBACK_QUEUE* queue) while (queue->has_next(queue)) { isoch = queue->get_next(queue); + if (isoch != NULL) queue->unregister_data(queue, isoch); } + pthread_mutex_unlock(&queue->isoch_loading); pthread_mutex_destroy(&queue->isoch_loading); diff --git a/channels/urbdrc/client/urbdrc_main.c b/channels/urbdrc/client/urbdrc_main.c index 0a1899185..dc67ea650 100644 --- a/channels/urbdrc/client/urbdrc_main.c +++ b/channels/urbdrc/client/urbdrc_main.c @@ -26,8 +26,10 @@ #include #include +#include #include +#include #include #include "urbdrc_types.h" @@ -56,7 +58,7 @@ static int func_hardware_id_format(IUDEVICE* pdev, char (*HardwareIds)[DEVICE_HA return 0; } -static int func_compat_id_format(IUDEVICE *pdev, char (*CompatibilityIds)[DEVICE_COMPATIBILITY_ID_SIZE]) +static int func_compat_id_format(IUDEVICE* pdev, char (*CompatibilityIds)[DEVICE_COMPATIBILITY_ID_SIZE]) { char str[DEVICE_COMPATIBILITY_ID_SIZE]; int bDeviceClass, bDeviceSubClass, bDeviceProtocol; @@ -262,8 +264,9 @@ static int urbdrc_process_channel_create(URBDRC_CHANNEL_CALLBACK* callback, char InterfaceId = ((STREAM_ID_PROXY<<30) | CLIENT_CHANNEL_NOTIFICATION); out_size = 24; - out_data = (char *) malloc(out_size); + out_data = (char*) malloc(out_size); memset(out_data, 0, out_size); + data_write_UINT32(out_data + 0, InterfaceId); /* interface id */ data_write_UINT32(out_data + 4, MessageId); /* message id */ data_write_UINT32(out_data + 8, CHANNEL_CREATED); /* function id */ @@ -287,8 +290,9 @@ static int urdbrc_send_virtual_channel_add(IWTSVirtualChannel* channel, UINT32 M InterfaceId = ((STREAM_ID_PROXY<<30) | CLIENT_DEVICE_SINK); out_size = 12; - out_data = (char *) malloc(out_size); + out_data = (char*) malloc(out_size); memset(out_data, 0, out_size); + data_write_UINT32(out_data + 0, InterfaceId); /* interface */ data_write_UINT32(out_data + 4, MessageId); /* message id */ data_write_UINT32(out_data + 8, ADD_VIRTUAL_CHANNEL); /* function id */ @@ -758,7 +762,7 @@ static int urbdrc_process_channel_notification(URBDRC_CHANNEL_CALLBACK* callback transfer_data->udevman = urbdrc->udevman; transfer_data->urbdrc = urbdrc; transfer_data->cbSize = cbSize; - transfer_data->pBuffer = (BYTE *)malloc((cbSize)); + transfer_data->pBuffer = (BYTE*) malloc((cbSize)); for (i = 0; i < (cbSize); i++) { @@ -921,7 +925,7 @@ static int urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManag { URBDRC_PLUGIN* urbdrc = (URBDRC_PLUGIN*) pPlugin; IUDEVMAN* udevman = NULL; - USB_SEARCHMAN * searchman = NULL; + USB_SEARCHMAN* searchman = NULL; LLOGLN(10, ("urbdrc_plugin_initialize:")); urbdrc->listener_callback = (URBDRC_LISTENER_CALLBACK*) malloc(sizeof(URBDRC_LISTENER_CALLBACK)); @@ -937,7 +941,7 @@ static int urbdrc_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManag urbdrc->searchman = searchman; return pChannelMgr->CreateListener(pChannelMgr, "URBDRC", 0, - (IWTSListenerCallback *) urbdrc->listener_callback, NULL); + (IWTSListenerCallback*) urbdrc->listener_callback, NULL); } static int urbdrc_plugin_terminated(IWTSPlugin* pPlugin) @@ -981,7 +985,7 @@ static int urbdrc_plugin_terminated(IWTSPlugin* pPlugin) return 0; } -static void urbdrc_register_udevman_plugin(IWTSPlugin* pPlugin, IUDEVMAN* udevman) +static void urbdrc_register_udevman_addin(IWTSPlugin* pPlugin, IUDEVMAN* udevman) { URBDRC_PLUGIN* urbdrc = (URBDRC_PLUGIN*) pPlugin; @@ -996,32 +1000,19 @@ static void urbdrc_register_udevman_plugin(IWTSPlugin* pPlugin, IUDEVMAN* udevma urbdrc->udevman = udevman; } -static int urbdrc_load_udevman_plugin(IWTSPlugin* pPlugin, const char* name, RDP_PLUGIN_DATA* data) +static int urbdrc_load_udevman_addin(IWTSPlugin* pPlugin, const char* name, ADDIN_ARGV* args) { - char* fullname; PFREERDP_URBDRC_DEVICE_ENTRY entry; FREERDP_URBDRC_SERVICE_ENTRY_POINTS entryPoints; - if (strrchr(name, '.') != NULL) - { - entry = (PFREERDP_URBDRC_DEVICE_ENTRY) freerdp_load_plugin(name, URBDRC_UDEVMAN_EXPORT_FUNC_NAME); - } - else - { - fullname = malloc(strlen(name) + 8); - ZeroMemory(fullname, strlen(name) + 8); - strcpy(fullname, name); - strcat(fullname, "_udevman"); - entry = (PFREERDP_URBDRC_DEVICE_ENTRY) freerdp_load_plugin(fullname, URBDRC_UDEVMAN_EXPORT_FUNC_NAME); - free(fullname); - } + entry = (PFREERDP_URBDRC_DEVICE_ENTRY) freerdp_load_channel_addin_entry("urbdrc", (LPSTR) name, NULL, 0); if (entry == NULL) return FALSE; entryPoints.plugin = pPlugin; - entryPoints.pRegisterUDEVMAN = urbdrc_register_udevman_plugin; - entryPoints.plugin_data = data; + entryPoints.pRegisterUDEVMAN = urbdrc_register_udevman_addin; + entryPoints.args = args; if (entry(&entryPoints) != 0) { @@ -1032,17 +1023,57 @@ static int urbdrc_load_udevman_plugin(IWTSPlugin* pPlugin, const char* name, RDP return TRUE; } -static int urbdrc_process_plugin_data(IWTSPlugin* pPlugin, RDP_PLUGIN_DATA* data) +void urbdrc_set_subsystem(URBDRC_PLUGIN* urbdrc, char* subsystem) { - BOOL ret; + if (urbdrc->subsystem) + free(urbdrc->subsystem); - if (data->data[0] && (strcmp((char*)data->data[0], "urbdrc") == 0 || strstr((char*) data->data[0], "/urbdrc.") != NULL)) + urbdrc->subsystem = _strdup(subsystem); +} + +COMMAND_LINE_ARGUMENT_A urbdrc_args[] = +{ + { "dbg", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "debug" }, + { "sys", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "subsystem" }, + { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } +}; + +static void urbdrc_process_addin_args(URBDRC_PLUGIN* urbdrc, ADDIN_ARGV* args) +{ + int status; + DWORD flags; + COMMAND_LINE_ARGUMENT_A* arg; + + flags = COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON; + + status = CommandLineParseArgumentsA(args->argc, (const char**) args->argv, + urbdrc_args, flags, urbdrc, NULL, NULL); + + arg = urbdrc_args; + + do { - ret = urbdrc_load_udevman_plugin(pPlugin, "libusb", data); - return ret; - } + if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) + continue; - return TRUE; + CommandLineSwitchStart(arg) + + CommandLineSwitchCase(arg, "dbg") + { + urbdrc_debug = 0; + } + CommandLineSwitchCase(arg, "sys") + { + urbdrc_set_subsystem(urbdrc, arg->Value); + } + CommandLineSwitchDefault(arg) + { + + } + + CommandLineSwitchEnd(arg) + } + while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); } #ifdef STATIC_CHANNELS @@ -1051,16 +1082,17 @@ static int urbdrc_process_plugin_data(IWTSPlugin* pPlugin, RDP_PLUGIN_DATA* data int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { - int error = 0; + int status = 0; + ADDIN_ARGV* args; URBDRC_PLUGIN* urbdrc; - RDP_PLUGIN_DATA* data; urbdrc = (URBDRC_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "urbdrc"); - data = pEntryPoints->GetPluginData(pEntryPoints); + args = pEntryPoints->GetPluginData(pEntryPoints); if (urbdrc == NULL) { - urbdrc = xnew(URBDRC_PLUGIN); + urbdrc = (URBDRC_PLUGIN*) malloc(sizeof(URBDRC_PLUGIN)); + ZeroMemory(urbdrc, sizeof(URBDRC_PLUGIN)); urbdrc->iface.Initialize = urbdrc_plugin_initialize; urbdrc->iface.Connected = NULL; @@ -1071,14 +1103,16 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) urbdrc_debug = 10; - if (data->data[2] && strstr((char *)data->data[2], "debug")) - urbdrc_debug = 0; - - error = pEntryPoints->RegisterPlugin(pEntryPoints, "urbdrc", (IWTSPlugin *) urbdrc); + status = pEntryPoints->RegisterPlugin(pEntryPoints, "urbdrc", (IWTSPlugin*) urbdrc); } - if (error == 0) - urbdrc_process_plugin_data((IWTSPlugin*) urbdrc, data); + if (status == 0) + urbdrc_process_addin_args(urbdrc, args); - return error; + if (!urbdrc->subsystem) + urbdrc_set_subsystem(urbdrc, "libusb"); + + urbdrc_load_udevman_addin((IWTSPlugin*) urbdrc, urbdrc->subsystem, args); + + return status; } diff --git a/channels/urbdrc/client/urbdrc_main.h b/channels/urbdrc/client/urbdrc_main.h index 5e85306e6..da24ce5dc 100644 --- a/channels/urbdrc/client/urbdrc_main.h +++ b/channels/urbdrc/client/urbdrc_main.h @@ -35,11 +35,12 @@ typedef struct _IUDEVICE IUDEVICE; typedef struct _IUDEVMAN IUDEVMAN; #define BASIC_DEV_STATE_DEFINED(_arg, _type) \ - _type (*get_##_arg) (IUDEVICE *pdev); \ - void (*set_##_arg) (IUDEVICE *pdev, _type _arg) + _type (*get_##_arg) (IUDEVICE* pdev); \ + void (*set_##_arg) (IUDEVICE* pdev, _type _arg) + #define BASIC_DEVMAN_STATE_DEFINED(_arg, _type) \ - _type (*get_##_arg) (IUDEVMAN *udevman); \ - void (*set_##_arg) (IUDEVMAN *udevman, _type _arg) + _type (*get_##_arg) (IUDEVMAN* udevman); \ + void (*set_##_arg) (IUDEVMAN* udevman, _type _arg) typedef struct _URBDRC_LISTENER_CALLBACK URBDRC_LISTENER_CALLBACK; @@ -74,6 +75,7 @@ struct _URBDRC_PLUGIN USB_SEARCHMAN* searchman; UINT32 first_channel_id; UINT32 vchannel_status; + char* subsystem; }; #define URBDRC_UDEVMAN_EXPORT_FUNC_NAME "FreeRDPUDEVMANEntry" @@ -84,7 +86,7 @@ struct _FREERDP_URBDRC_SERVICE_ENTRY_POINTS { IWTSPlugin* plugin; PREGISTERURBDRCSERVICE pRegisterUDEVMAN; - RDP_PLUGIN_DATA* plugin_data; + ADDIN_ARGV* args; }; typedef struct _FREERDP_URBDRC_SERVICE_ENTRY_POINTS FREERDP_URBDRC_SERVICE_ENTRY_POINTS; typedef FREERDP_URBDRC_SERVICE_ENTRY_POINTS* PFREERDP_URBDRC_SERVICE_ENTRY_POINTS; @@ -106,107 +108,75 @@ struct _TRANSFER_DATA struct _IUDEVICE { /* Transfer */ - int (*isoch_transfer) (IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 TransferFlags, - int NoAck, - UINT32 *ErrorCount, - UINT32 *UrbdStatus, - UINT32 *StartFrame, - UINT32 NumberOfPackets, - BYTE *IsoPacket, - UINT32 *BufferSize, - BYTE *Buffer, - int Timeout); + int (*isoch_transfer) (IUDEVICE* idev, UINT32 RequestId, + UINT32 EndpointAddress, UINT32 TransferFlags, int NoAck, UINT32* ErrorCount, + UINT32* UrbdStatus, UINT32* StartFrame, UINT32 NumberOfPackets, + BYTE* IsoPacket, UINT32* BufferSize, BYTE* Buffer, int Timeout); - int (*control_transfer) (IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 TransferFlags, - BYTE bmRequestType, - BYTE Request, - UINT16 Value, - UINT16 Index, - UINT32 *UrbdStatus, - UINT32 *BufferSize, - BYTE *Buffer, - UINT32 Timeout); + int (*control_transfer) (IUDEVICE* idev, UINT32 RequestId, + UINT32 EndpointAddress, UINT32 TransferFlags, BYTE bmRequestType, BYTE Request, UINT16 Value, + UINT16 Index, UINT32* UrbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout); - int (*bulk_or_interrupt_transfer) (IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 TransferFlags, - UINT32 *UsbdStatus, - UINT32 *BufferSize, - BYTE *Buffer, - UINT32 Timeout); + int (*bulk_or_interrupt_transfer) (IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress, + UINT32 TransferFlags, UINT32* UsbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout); + int (*select_configuration) (IUDEVICE* idev, UINT32 bConfigurationValue); - int (*select_configuration) (IUDEVICE * idev, UINT32 bConfigurationValue); - - int (*select_interface) (IUDEVICE * idev, BYTE InterfaceNumber, + int (*select_interface) (IUDEVICE* idev, BYTE InterfaceNumber, BYTE AlternateSetting); - int (*control_pipe_request) (IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 *UsbdStatus, - int command); + int (*control_pipe_request) (IUDEVICE* idev, UINT32 RequestId, + UINT32 EndpointAddress, UINT32* UsbdStatus, int command); - int (*control_query_device_text) (IUDEVICE * idev, UINT32 TextType, - UINT32 LocaleId, - UINT32 *BufferSize, - BYTE * Buffer); + int (*control_query_device_text) (IUDEVICE* idev, UINT32 TextType, + UINT32 LocaleId, UINT32*BufferSize, BYTE* Buffer); - int (*os_feature_descriptor_request) (IUDEVICE * idev, UINT32 RequestId, - BYTE Recipient, - BYTE InterfaceNumber, - BYTE Ms_PageIndex, - UINT16 Ms_featureDescIndex, - UINT32 * UsbdStatus, - UINT32 * BufferSize, - BYTE* Buffer, - int Timeout); + int (*os_feature_descriptor_request) (IUDEVICE* idev, UINT32 RequestId, BYTE Recipient, + BYTE InterfaceNumber, BYTE Ms_PageIndex, UINT16 Ms_featureDescIndex, UINT32* UsbdStatus, + UINT32* BufferSize, BYTE* Buffer, int Timeout); - void (*cancel_all_transfer_request) (IUDEVICE * idev); + void (*cancel_all_transfer_request) (IUDEVICE* idev); - int (*cancel_transfer_request) (IUDEVICE * idev, UINT32 RequestId); + int (*cancel_transfer_request) (IUDEVICE* idev, UINT32 RequestId); - int (*query_device_descriptor) (IUDEVICE * idev, int offset); + int (*query_device_descriptor) (IUDEVICE* idev, int offset); - void (*detach_kernel_driver) (IUDEVICE * idev); + void (*detach_kernel_driver) (IUDEVICE* idev); - void (*attach_kernel_driver) (IUDEVICE * idev); + void (*attach_kernel_driver) (IUDEVICE* idev); - int (*wait_action_completion) (IUDEVICE * idev); + int (*wait_action_completion) (IUDEVICE* idev); - void (*push_action) (IUDEVICE * idev); + void (*push_action) (IUDEVICE* idev); - void (*complete_action) (IUDEVICE * idev); + void (*complete_action) (IUDEVICE* idev); /* Wait for 5 sec */ - int (*wait_for_detach) (IUDEVICE * idev); + int (*wait_for_detach) (IUDEVICE* idev); /* FIXME: Currently this is a way of stupid, SHOULD to improve it. * Isochronous transfer must to FIFO */ - void (*lock_fifo_isoch) (IUDEVICE * idev); - void (*unlock_fifo_isoch) (IUDEVICE * idev); + void (*lock_fifo_isoch) (IUDEVICE* idev); + void (*unlock_fifo_isoch) (IUDEVICE* idev); - int (*query_device_port_status) (IUDEVICE * idev, UINT32 *UsbdStatus, - UINT32 * BufferSize, - BYTE * Buffer); + int (*query_device_port_status) (IUDEVICE* idev, UINT32 *UsbdStatus, + UINT32* BufferSize, + BYTE* Buffer); - int (*request_queue_is_none) (IUDEVICE * idev); + int (*request_queue_is_none) (IUDEVICE* idev); - MSUSB_CONFIG_DESCRIPTOR * (*complete_msconfig_setup) (IUDEVICE * idev, - MSUSB_CONFIG_DESCRIPTOR * MsConfig); + MSUSB_CONFIG_DESCRIPTOR* (*complete_msconfig_setup) (IUDEVICE* idev, + MSUSB_CONFIG_DESCRIPTOR* MsConfig); /* Basic state */ - int (*isCompositeDevice) (IUDEVICE * idev); - int (*isSigToEnd) (IUDEVICE * idev); - int (*isExist) (IUDEVICE * idev); - int (*isAlreadySend) (IUDEVICE * idev); - int (*isChannelClosed) (IUDEVICE * idev); - void (*SigToEnd) (IUDEVICE * idev); - void (*setAlreadySend) (IUDEVICE * idev); - void (*setChannelClosed) (IUDEVICE * idev); - char *(*getPath) (IUDEVICE * idev); + int (*isCompositeDevice) (IUDEVICE* idev); + int (*isSigToEnd) (IUDEVICE* idev); + int (*isExist) (IUDEVICE* idev); + int (*isAlreadySend) (IUDEVICE* idev); + int (*isChannelClosed) (IUDEVICE* idev); + void (*SigToEnd) (IUDEVICE* idev); + void (*setAlreadySend) (IUDEVICE* idev); + void (*setChannelClosed) (IUDEVICE* idev); + char *(*getPath) (IUDEVICE* idev); BASIC_DEV_STATE_DEFINED(channel_id, UINT32); BASIC_DEV_STATE_DEFINED(UsbDevice, UINT32); @@ -214,12 +184,12 @@ struct _IUDEVICE BASIC_DEV_STATE_DEFINED(bus_number, UINT16); BASIC_DEV_STATE_DEFINED(dev_number, UINT16); BASIC_DEV_STATE_DEFINED(port_number, int); - BASIC_DEV_STATE_DEFINED(isoch_queue, void *); - BASIC_DEV_STATE_DEFINED(MsConfig, MSUSB_CONFIG_DESCRIPTOR *); + BASIC_DEV_STATE_DEFINED(isoch_queue, void*); + BASIC_DEV_STATE_DEFINED(MsConfig, MSUSB_CONFIG_DESCRIPTOR*); - BASIC_DEV_STATE_DEFINED(p_udev, void *); - BASIC_DEV_STATE_DEFINED(p_prev, void *); - BASIC_DEV_STATE_DEFINED(p_next, void *); + BASIC_DEV_STATE_DEFINED(p_udev, void*); + BASIC_DEV_STATE_DEFINED(p_prev, void*); + BASIC_DEV_STATE_DEFINED(p_next, void*); /* Control semaphore or mutex lock */ @@ -228,36 +198,32 @@ struct _IUDEVICE struct _IUDEVMAN { /* Standard */ - void (*free) (IUDEVMAN *idevman); + void (*free) (IUDEVMAN* idevman); + /* Manage devices */ - void (*rewind) (IUDEVMAN *idevman); - int (*has_next) (IUDEVMAN *idevman); - int (*unregister_udevice) (IUDEVMAN* idevman, int bus_number, - int dev_number); - int (*register_udevice) (IUDEVMAN* idevman, int bus_number, - int dev_number, - int UsbDevice, - UINT16 idVendor, - UINT16 idProduct, - int flag); - IUDEVICE *(*get_next) (IUDEVMAN *idevman); - IUDEVICE *(*get_udevice_by_UsbDevice) (IUDEVMAN * idevman, - UINT32 UsbDevice); - IUDEVICE *(*get_udevice_by_UsbDevice_try_again) (IUDEVMAN * idevman, - UINT32 UsbDevice); + void (*rewind) (IUDEVMAN* idevman); + int (*has_next) (IUDEVMAN* idevman); + int (*unregister_udevice) (IUDEVMAN* idevman, int bus_number, int dev_number); + int (*register_udevice) (IUDEVMAN* idevman, int bus_number, + int dev_number, int UsbDevice, UINT16 idVendor, UINT16 idProduct, int flag); + IUDEVICE *(*get_next) (IUDEVMAN* idevman); + IUDEVICE *(*get_udevice_by_UsbDevice) (IUDEVMAN* idevman, UINT32 UsbDevice); + IUDEVICE *(*get_udevice_by_UsbDevice_try_again) (IUDEVMAN* idevman, UINT32 UsbDevice); + /* Extension */ - int (*check_device_exist_by_id) (IUDEVMAN * idevman, UINT16 idVendor, - UINT16 idProduct); - int (*isAutoAdd) (IUDEVMAN * idevman); + int (*check_device_exist_by_id) (IUDEVMAN* idevman, UINT16 idVendor, UINT16 idProduct); + int (*isAutoAdd) (IUDEVMAN* idevman); + /* Basic state */ BASIC_DEVMAN_STATE_DEFINED(defUsbDevice, UINT32); BASIC_DEVMAN_STATE_DEFINED(device_num, int); BASIC_DEVMAN_STATE_DEFINED(sem_timeout, int); + /* control semaphore or mutex lock */ - void (*loading_lock) (IUDEVMAN * idevman); - void (*loading_unlock) (IUDEVMAN * idevman); - void (*push_urb) (IUDEVMAN * idevman); - void (*wait_urb) (IUDEVMAN * idevman); + void (*loading_lock) (IUDEVMAN* idevman); + void (*loading_unlock) (IUDEVMAN* idevman); + void (*push_urb) (IUDEVMAN* idevman); + void (*wait_urb) (IUDEVMAN* idevman); }; #endif /* __URBDRC_MAIN_H */ diff --git a/channels/urbdrc/libusb/CMakeLists.txt b/channels/urbdrc/libusb/CMakeLists.txt index b01042be3..dcf7ff054 100644 --- a/channels/urbdrc/libusb/CMakeLists.txt +++ b/channels/urbdrc/libusb/CMakeLists.txt @@ -36,10 +36,12 @@ endif() set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") +set(${MODULE_PREFIX}_LIBS + ${CMAKE_THREAD_LIBS_INIT}) + set(${MODULE_PREFIX}_LIBS dbus-glib-1 usb-1.0 - pthread udev) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) diff --git a/channels/urbdrc/libusb/libusb_udevice.c b/channels/urbdrc/libusb/libusb_udevice.c index f0c8f68b0..23d98ac92 100644 --- a/channels/urbdrc/libusb/libusb_udevice.c +++ b/channels/urbdrc/libusb/libusb_udevice.c @@ -27,26 +27,26 @@ #include "libusb_udevice.h" #define BASIC_STATE_FUNC_DEFINED(_arg, _type) \ -static _type udev_get_##_arg (IUDEVICE * idev) \ +static _type udev_get_##_arg (IUDEVICE* idev) \ { \ - UDEVICE * pdev = (UDEVICE *) idev; \ + UDEVICE* pdev = (UDEVICE*) idev; \ return pdev->_arg; \ } \ -static void udev_set_##_arg (IUDEVICE * idev, _type _t) \ +static void udev_set_##_arg (IUDEVICE* idev, _type _t) \ { \ - UDEVICE * pdev = (UDEVICE *) idev; \ + UDEVICE* pdev = (UDEVICE*) idev; \ pdev->_arg = _t; \ } #define BASIC_POINT_FUNC_DEFINED(_arg, _type) \ -static _type udev_get_p_##_arg (IUDEVICE * idev) \ +static _type udev_get_p_##_arg (IUDEVICE* idev) \ { \ - UDEVICE * pdev = (UDEVICE *) idev; \ + UDEVICE* pdev = (UDEVICE*) idev; \ return pdev->_arg; \ } \ -static void udev_set_p_##_arg (IUDEVICE * idev, _type _t) \ +static void udev_set_p_##_arg (IUDEVICE* idev, _type _t) \ { \ - UDEVICE * pdev = (UDEVICE *) idev; \ + UDEVICE* pdev = (UDEVICE*) idev; \ pdev->_arg = _t; \ } @@ -56,23 +56,27 @@ static void udev_set_p_##_arg (IUDEVICE * idev, _type _t) \ typedef struct _ISO_USER_DATA ISO_USER_DATA; + struct _ISO_USER_DATA { - BYTE * IsoPacket; - BYTE * output_data; - int iso_status; - int completed; - UINT32 error_count; - int noack; - UINT32 start_frame; + BYTE* IsoPacket; + BYTE* output_data; + int iso_status; + int completed; + UINT32 error_count; + int noack; + UINT32 start_frame; }; -static int -get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out) +static int get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out) { + int r; struct timeval timeout; - int r = libusb_get_next_timeout(ctx, &timeout); - if (r) { + + r = libusb_get_next_timeout(ctx, &timeout); + + if (r) + { /* timeout already expired? */ if (!timerisset(&timeout)) return 1; @@ -82,7 +86,9 @@ get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out) *out = timeout; else *out = *tv; - } else { + } + else + { *out = *tv; } return 0; @@ -91,10 +97,10 @@ get_next_timeout(libusb_context *ctx, struct timeval *tv, struct timeval *out) /* * a simple wrapper to implement libusb_handle_events_timeout_completed * function in libusb library git tree (1.0.9 later) */ -static int -handle_events_completed(libusb_context *ctx, int *completed) +static int handle_events_completed(libusb_context *ctx, int *completed) { struct timeval tv; + tv.tv_sec = 60; tv.tv_usec = 0; @@ -107,13 +113,17 @@ handle_events_completed(libusb_context *ctx, int *completed) r = get_next_timeout(ctx, &tv, &poll_timeout); retry: - if (libusb_try_lock_events(ctx) == 0) { - if (completed == NULL || !*completed) { + if (libusb_try_lock_events(ctx) == 0) + { + if (completed == NULL || !*completed) + { /* we obtained the event lock: do our own event handling */ LLOGLN(10, ("doing our own event handling")); r = libusb_handle_events_locked(ctx, &tv); } + libusb_unlock_events(ctx); + return r; } @@ -124,7 +134,8 @@ retry: if (completed && *completed) goto already_done; - if (!libusb_event_handler_active(ctx)) { + if (!libusb_event_handler_active(ctx)) + { /* we hit a race: whoever was event handling earlier finished in the * time it took us to reach this point. try the cycle again. */ libusb_unlock_event_waiters(ctx); @@ -138,34 +149,36 @@ retry: already_done: libusb_unlock_event_waiters(ctx); - if (r < 0) { + if (r < 0) + { return r; } - else if (r == 1) { + else if (r == 1) + { return libusb_handle_events_timeout(ctx, &tv); } else - return 0; + { + return 0; + } #endif /* HAVE_NEW_LIBUSE */ } -static void -func_iso_callback(struct libusb_transfer *transfer) +static void func_iso_callback(struct libusb_transfer *transfer) { - ISO_USER_DATA * iso_user_data = (ISO_USER_DATA *) transfer->user_data; - BYTE * data = iso_user_data->IsoPacket; - int * completed = &iso_user_data->completed; - UINT32 offset = 0; - UINT32 index = 0; + ISO_USER_DATA* iso_user_data = (ISO_USER_DATA*) transfer->user_data; + BYTE* data = iso_user_data->IsoPacket; + int* completed = &iso_user_data->completed; + UINT32 offset = 0; + UINT32 index = 0; UINT32 i, act_len; - BYTE *b; + BYTE* b; *completed = 1; /* Fixme: currently fill the dummy frame number, tt needs to be * filled a real frame number */ // urbdrc_get_mstime(iso_user_data->start_frame); - if(transfer->status == LIBUSB_TRANSFER_COMPLETED && - !iso_user_data->noack) + if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && (!iso_user_data->noack)) { for (i = 0; i < transfer->num_iso_packets; i++) { @@ -175,16 +188,19 @@ func_iso_callback(struct libusb_transfer *transfer) data_write_UINT32(data + offset + 8, transfer->iso_packet_desc[i].status); offset += 12; + if (transfer->iso_packet_desc[i].status == USBD_STATUS_SUCCESS) { b = libusb_get_iso_packet_buffer_simple(transfer, i); + if (act_len > 0) { if (iso_user_data->output_data + index != b) memcpy(iso_user_data->output_data + index, b, act_len); index += act_len; } - else{ + else + { //printf("actual length %d \n", act_len); //exit(EXIT_FAILURE); } @@ -198,39 +214,37 @@ func_iso_callback(struct libusb_transfer *transfer) transfer->actual_length = index; iso_user_data->iso_status = 1; } - else if(transfer->status == LIBUSB_TRANSFER_COMPLETED && - iso_user_data->noack) + else if ((transfer->status == LIBUSB_TRANSFER_COMPLETED) && (iso_user_data->noack)) { /* This situation occurs when we do not need to * return any packet */ iso_user_data->iso_status = 1; } - else{ + else + { //print_status(transfer->status); iso_user_data->iso_status = -1; } } - -static const LIBUSB_ENDPOINT_DESCEIPTOR* -func_get_ep_desc(LIBUSB_CONFIG_DESCRIPTOR * LibusbConfig, - MSUSB_CONFIG_DESCRIPTOR * MsConfig, - UINT32 EndpointAddress) +static const LIBUSB_ENDPOINT_DESCEIPTOR* func_get_ep_desc(LIBUSB_CONFIG_DESCRIPTOR* LibusbConfig, + MSUSB_CONFIG_DESCRIPTOR* MsConfig, UINT32 EndpointAddress) { - MSUSB_INTERFACE_DESCRIPTOR ** MsInterfaces; - const LIBUSB_INTERFACE * interface; - const LIBUSB_ENDPOINT_DESCEIPTOR * endpoint; BYTE alt; int inum, pnum; + MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces; + const LIBUSB_INTERFACE* interface; + const LIBUSB_ENDPOINT_DESCEIPTOR* endpoint; MsInterfaces = MsConfig->MsInterfaces; interface = LibusbConfig->interface; - for(inum = 0; inum < MsConfig->NumInterfaces; inum++) + + for (inum = 0; inum < MsConfig->NumInterfaces; inum++) { alt = MsInterfaces[inum]->AlternateSetting; endpoint = interface[inum].altsetting[alt].endpoint; - for(pnum = 0; pnum < MsInterfaces[inum]->NumberOfPipes; pnum++) + for (pnum = 0; pnum < MsInterfaces[inum]->NumberOfPipes; pnum++) { if (endpoint[pnum].bEndpointAddress == EndpointAddress) { @@ -238,89 +252,96 @@ func_get_ep_desc(LIBUSB_CONFIG_DESCRIPTOR * LibusbConfig, } } } + return NULL; } - - -static void -func_bulk_transfer_cb(struct libusb_transfer *transfer) +static void func_bulk_transfer_cb(struct libusb_transfer *transfer) { int *completed = transfer->user_data; *completed = 1; /* caller interprets results and frees transfer */ } - - - -static int -func_set_usbd_status(UDEVICE* pdev, UINT32* status, int err_result) +static int func_set_usbd_status(UDEVICE* pdev, UINT32* status, int err_result) { switch (err_result) { case LIBUSB_SUCCESS: *status = USBD_STATUS_SUCCESS; break; + case LIBUSB_ERROR_IO: *status = USBD_STATUS_STALL_PID; LLOGLN(10, ("urb_status: LIBUSB_ERROR_IO!!\n")); break; + case LIBUSB_ERROR_INVALID_PARAM: *status = USBD_STATUS_INVALID_PARAMETER; break; + case LIBUSB_ERROR_ACCESS: *status = USBD_STATUS_NOT_ACCESSED; break; + case LIBUSB_ERROR_NO_DEVICE: *status = USBD_STATUS_DEVICE_GONE; - if (pdev){ - if(!(pdev->status & URBDRC_DEVICE_NOT_FOUND)) + if (pdev) + { + if (!(pdev->status & URBDRC_DEVICE_NOT_FOUND)) { pdev->status |= URBDRC_DEVICE_NOT_FOUND; LLOGLN(libusb_debug, ("urb_status: LIBUSB_ERROR_NO_DEVICE!!\n")); } } break; + case LIBUSB_ERROR_NOT_FOUND: *status = USBD_STATUS_STALL_PID; break; + case LIBUSB_ERROR_BUSY: *status = USBD_STATUS_STALL_PID; break; + case LIBUSB_ERROR_TIMEOUT: *status = USBD_STATUS_TIMEOUT; break; + case LIBUSB_ERROR_OVERFLOW: *status = USBD_STATUS_STALL_PID; break; + case LIBUSB_ERROR_PIPE: *status = USBD_STATUS_STALL_PID; break; + case LIBUSB_ERROR_INTERRUPTED: *status = USBD_STATUS_STALL_PID; break; + case LIBUSB_ERROR_NO_MEM: *status = USBD_STATUS_NO_MEMORY; break; + case LIBUSB_ERROR_NOT_SUPPORTED: *status = USBD_STATUS_NOT_SUPPORTED; break; + case LIBUSB_ERROR_OTHER: *status = USBD_STATUS_STALL_PID; break; + default: *status = USBD_STATUS_SUCCESS; break; } + return 0; } - - -static void -func_iso_data_init(ISO_USER_DATA * iso_user_data, UINT32 numPacket, UINT32 buffsize, - UINT32 noAck, BYTE * isoPacket, BYTE * buffer) +static void func_iso_data_init(ISO_USER_DATA* iso_user_data, UINT32 numPacket, UINT32 buffsize, + UINT32 noAck, BYTE* isoPacket, BYTE * buffer) { /* init struct iso_user_data */ iso_user_data->IsoPacket = isoPacket; @@ -331,47 +352,46 @@ func_iso_data_init(ISO_USER_DATA * iso_user_data, UINT32 numPacket, UINT32 buffs urbdrc_get_mstime(iso_user_data->start_frame); } - - -static int -func_config_release_all_interface(LIBUSB_DEVICE_HANDLE *libusb_handle, UINT32 NumInterfaces) +static int func_config_release_all_interface(LIBUSB_DEVICE_HANDLE* libusb_handle, UINT32 NumInterfaces) { int i, ret; + for (i = 0; i < NumInterfaces; i++) { ret = libusb_release_interface (libusb_handle, i); - if (ret < 0){ + + if (ret < 0) + { printf("config_release_all_interface: error num %d\n", ret); return -1; } } + return 0; } - -static int -func_claim_all_interface(LIBUSB_DEVICE_HANDLE *libusb_handle, int NumInterfaces) +static int func_claim_all_interface(LIBUSB_DEVICE_HANDLE* libusb_handle, int NumInterfaces) { int i, ret; + for (i = 0; i < NumInterfaces; i++) { - ret = libusb_claim_interface (libusb_handle, i); - if (ret < 0){ + ret = libusb_claim_interface(libusb_handle, i); + + if (ret < 0) + { printf("claim_all_interface: error num %d\n", ret); return -1; } } + return 0; } - - - /* -static void* -print_transfer_status(enum libusb_transfer_status status) +static void* print_transfer_status(enum libusb_transfer_status status) { - switch(status) + switch (status) { case LIBUSB_TRANSFER_COMPLETED: //printf("Transfer Status: LIBUSB_TRANSFER_COMPLETED\n"); @@ -401,11 +421,9 @@ print_transfer_status(enum libusb_transfer_status status) return 0; } - -static void -print_status(enum libusb_transfer_status status) +static void print_status(enum libusb_transfer_status status) { - switch(status) + switch (status) { case LIBUSB_TRANSFER_COMPLETED: printf("Transfer status: LIBUSB_TRANSFER_COMPLETED\n"); @@ -435,38 +453,37 @@ print_status(enum libusb_transfer_status status) } */ - -static LIBUSB_DEVICE* -udev_get_libusb_dev(int bus_number, int dev_number) +static LIBUSB_DEVICE* udev_get_libusb_dev(int bus_number, int dev_number) { - ssize_t total_device; - LIBUSB_DEVICE ** libusb_list; int i; + ssize_t total_device; + LIBUSB_DEVICE** libusb_list; total_device = libusb_get_device_list(NULL, &libusb_list); + for (i = 0; i < total_device; i++) { - if((bus_number == libusb_get_bus_number(libusb_list[i])) && + if ((bus_number == libusb_get_bus_number(libusb_list[i])) && (dev_number == libusb_get_device_address(libusb_list[i]))) return libusb_list[i]; } + libusb_free_device_list(libusb_list, 1); return NULL; } - - -static LIBUSB_DEVICE_DESCRIPTOR* -udev_new_descript(LIBUSB_DEVICE* libusb_dev) +static LIBUSB_DEVICE_DESCRIPTOR* udev_new_descript(LIBUSB_DEVICE* libusb_dev) { - LIBUSB_DEVICE_DESCRIPTOR* descriptor; int ret; + LIBUSB_DEVICE_DESCRIPTOR* descriptor; - descriptor = (LIBUSB_DEVICE_DESCRIPTOR*)malloc(sizeof(LIBUSB_DEVICE_DESCRIPTOR)); + descriptor = (LIBUSB_DEVICE_DESCRIPTOR*) malloc(sizeof(LIBUSB_DEVICE_DESCRIPTOR)); ret = libusb_get_device_descriptor(libusb_dev, descriptor); - if (ret<0){ + + if (ret < 0) + { printf("libusb_get_device_descriptor: ERROR!!\n"); return NULL; } @@ -474,16 +491,14 @@ udev_new_descript(LIBUSB_DEVICE* libusb_dev) return descriptor; } - - /* Get HUB handle */ -static int -udev_get_hub_handle(UDEVICE * pdev, UINT16 bus_number, UINT16 dev_number) +static int udev_get_hub_handle(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) { - struct udev *udev; - struct udev_enumerate *enumerate; - struct udev_list_entry *devices, *dev_list_entry; - struct udev_device *dev; + struct udev* udev; + struct udev_enumerate* enumerate; + struct udev_list_entry* devices; + struct udev_list_entry* dev_list_entry; + struct udev_device* dev; LIBUSB_DEVICE* libusb_dev; int hub_found = 0; int hub_bus = 0; @@ -491,7 +506,9 @@ udev_get_hub_handle(UDEVICE * pdev, UINT16 bus_number, UINT16 dev_number) int error = 0; udev = udev_new(); - if (!udev) { + + if (!udev) + { LLOGLN(0, ("%s: Can't create udev", __func__)); return -1; } @@ -508,46 +525,62 @@ udev_get_hub_handle(UDEVICE * pdev, UINT16 bus_number, UINT16 dev_number) path = udev_list_entry_get_name(dev_list_entry); dev = udev_device_new_from_syspath(udev, path); - if (!dev) continue; + + if (!dev) + continue; + int tmp_b = atoi(udev_device_get_property_value(dev,"BUSNUM")); int tmp_d = atoi(udev_device_get_property_value(dev,"DEVNUM")); + if (bus_number == tmp_b && dev_number == tmp_d) { /* get port number */ char *p1, *p2; - const char * sysfs_path = + const char* sysfs_path = udev_device_get_property_value(dev,"DEVPATH"); - p1 = (char *)sysfs_path; - do{ + p1 = (char*) sysfs_path; + + do + { p2 = p1 + 1; p1 = strchr(p2, '.'); - }while(p1 != NULL); + } + while (p1 != NULL); if ((p2 - sysfs_path) < (strlen(sysfs_path) - 2)) { - p1 = (char *)sysfs_path; - do{ + p1 = (char*) sysfs_path; + + do + { p2 = p1 + 1; p1 = strchr(p2, '-'); - }while(p1 != NULL); + } + while (p1 != NULL); } + pdev->port_number = atoi(p2); LLOGLN(libusb_debug, (" Port: %d", pdev->port_number)); /* get device path */ - p1 = (char *)sysfs_path; - do{ + p1 = (char*) sysfs_path; + + do + { p2 = p1 + 1; p1 = strchr(p2, '/'); - }while(p1 != NULL); + } + while (p1 != NULL); + memset(pdev->path, 0, 17); strcpy(pdev->path, p2); LLOGLN(libusb_debug, (" DevPath: %s", pdev->path)); /* query parent hub info */ dev = udev_device_get_parent(dev); + if (dev != NULL) { hub_found = 1; @@ -555,11 +588,13 @@ udev_get_hub_handle(UDEVICE * pdev, UINT16 bus_number, UINT16 dev_number) hub_dev = atoi(udev_device_get_property_value(dev,"DEVNUM")); LLOGLN(libusb_debug, (" Hub BUS/DEV: %d %d", hub_bus, hub_dev)); } + udev_device_unref(dev); break; } udev_device_unref(dev); } + udev_enumerate_unref(enumerate); udev_unref(udev); @@ -568,41 +603,44 @@ udev_get_hub_handle(UDEVICE * pdev, UINT16 bus_number, UINT16 dev_number) LLOGLN(0, ("%s: hub was not found!", __func__)); return -1; } + /* Get libusb hub handle */ libusb_dev = udev_get_libusb_dev(hub_bus, hub_dev); + if (libusb_dev == NULL) { LLOGLN(0, ("%s: get hub libusb_dev fail!", __func__)); return -1; } + error = libusb_open (libusb_dev, &pdev->hub_handle); + if (error < 0) { LLOGLN(0, ("%s: libusb_open error!", __func__)); return -1; } + LLOGLN(libusb_debug, ("%s: libusb_open success!", __func__)); + /* Success! */ return 0; } - - - -static int -libusb_udev_select_interface(IUDEVICE * idev, BYTE InterfaceNumber, BYTE AlternateSetting) +static int libusb_udev_select_interface(IUDEVICE* idev, BYTE InterfaceNumber, BYTE AlternateSetting) { - MSUSB_CONFIG_DESCRIPTOR * MsConfig; - MSUSB_INTERFACE_DESCRIPTOR ** MsInterfaces; - UDEVICE * pdev = (UDEVICE *) idev; int error = 0, diff = 1; + UDEVICE* pdev = (UDEVICE*) idev; + MSUSB_CONFIG_DESCRIPTOR* MsConfig; + MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces; MsConfig = pdev->MsConfig; + if (MsConfig) { MsInterfaces = MsConfig->MsInterfaces; - if (MsInterfaces && - MsInterfaces[InterfaceNumber]->AlternateSetting == AlternateSetting) + + if ((MsInterfaces) && (MsInterfaces[InterfaceNumber]->AlternateSetting == AlternateSetting)) { diff = 0; } @@ -610,9 +648,11 @@ libusb_udev_select_interface(IUDEVICE * idev, BYTE InterfaceNumber, BYTE Alterna if (diff) { - error = libusb_set_interface_alt_setting (pdev->libusb_handle, + error = libusb_set_interface_alt_setting(pdev->libusb_handle, InterfaceNumber, AlternateSetting); - if (error < 0){ + + if (error < 0) + { printf("%s: Set interface altsetting get error num %d\n", __func__, error); } @@ -621,23 +661,19 @@ libusb_udev_select_interface(IUDEVICE * idev, BYTE InterfaceNumber, BYTE Alterna return error; } - - - -static MSUSB_CONFIG_DESCRIPTOR * -libusb_udev_complete_msconfig_setup(IUDEVICE * idev, MSUSB_CONFIG_DESCRIPTOR * MsConfig) +static MSUSB_CONFIG_DESCRIPTOR* libusb_udev_complete_msconfig_setup(IUDEVICE* idev, MSUSB_CONFIG_DESCRIPTOR* MsConfig) { - UDEVICE * pdev = (UDEVICE *) idev; - MSUSB_INTERFACE_DESCRIPTOR ** MsInterfaces; - MSUSB_INTERFACE_DESCRIPTOR * MsInterface; - MSUSB_PIPE_DESCRIPTOR ** MsPipes; - MSUSB_PIPE_DESCRIPTOR * MsPipe; - MSUSB_PIPE_DESCRIPTOR ** t_MsPipes; - MSUSB_PIPE_DESCRIPTOR * t_MsPipe; - LIBUSB_CONFIG_DESCRIPTOR * LibusbConfig; - const LIBUSB_INTERFACE * LibusbInterface; - const LIBUSB_INTERFACE_DESCRIPTOR * LibusbAltsetting; - const LIBUSB_ENDPOINT_DESCEIPTOR * LibusbEndpoint; + UDEVICE* pdev = (UDEVICE*) idev; + MSUSB_INTERFACE_DESCRIPTOR** MsInterfaces; + MSUSB_INTERFACE_DESCRIPTOR* MsInterface; + MSUSB_PIPE_DESCRIPTOR** MsPipes; + MSUSB_PIPE_DESCRIPTOR* MsPipe; + MSUSB_PIPE_DESCRIPTOR** t_MsPipes; + MSUSB_PIPE_DESCRIPTOR* t_MsPipe; + LIBUSB_CONFIG_DESCRIPTOR* LibusbConfig; + const LIBUSB_INTERFACE* LibusbInterface; + const LIBUSB_INTERFACE_DESCRIPTOR* LibusbAltsetting; + const LIBUSB_ENDPOINT_DESCEIPTOR* LibusbEndpoint; BYTE LibusbNumEndpoint; int inum = 0, pnum = 0, MsOutSize = 0; @@ -658,8 +694,7 @@ libusb_udev_complete_msconfig_setup(IUDEVICE * idev, MSUSB_CONFIG_DESCRIPTOR * M LibusbInterface = &LibusbConfig->interface[MsInterface->InterfaceNumber]; LibusbAltsetting = &LibusbInterface->altsetting[MsInterface->AlternateSetting]; LibusbNumEndpoint = LibusbAltsetting->bNumEndpoints; - t_MsPipes = (MSUSB_PIPE_DESCRIPTOR **) malloc ( LibusbNumEndpoint * - sizeof(MSUSB_PIPE_DESCRIPTOR *)); + t_MsPipes = (MSUSB_PIPE_DESCRIPTOR**) malloc(LibusbNumEndpoint * sizeof(MSUSB_PIPE_DESCRIPTOR*)); for (pnum = 0; pnum < LibusbNumEndpoint; pnum++) { @@ -675,16 +710,17 @@ libusb_udev_complete_msconfig_setup(IUDEVICE * idev, MSUSB_CONFIG_DESCRIPTOR * M } else { - t_MsPipe->MaximumPacketSize = 0; - t_MsPipe->MaximumTransferSize = 0xffffffff; - t_MsPipe->PipeFlags = 0; + t_MsPipe->MaximumPacketSize = 0; + t_MsPipe->MaximumTransferSize = 0xffffffff; + t_MsPipe->PipeFlags = 0; } - t_MsPipe->PipeHandle = 0; - t_MsPipe->bEndpointAddress = 0; - t_MsPipe->bInterval = 0; - t_MsPipe->PipeType = 0; - t_MsPipe->InitCompleted = 0; + t_MsPipe->PipeHandle = 0; + t_MsPipe->bEndpointAddress = 0; + t_MsPipe->bInterval = 0; + t_MsPipe->PipeType = 0; + t_MsPipe->InitCompleted = 0; + t_MsPipes[pnum] = t_MsPipe; } @@ -771,12 +807,9 @@ libusb_udev_complete_msconfig_setup(IUDEVICE * idev, MSUSB_CONFIG_DESCRIPTOR * M return MsConfig; } - - -static int -libusb_udev_select_configuration(IUDEVICE * idev, UINT32 bConfigurationValue) +static int libusb_udev_select_configuration(IUDEVICE* idev, UINT32 bConfigurationValue) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; MSUSB_CONFIG_DESCRIPTOR * MsConfig = pdev->MsConfig; LIBUSB_DEVICE_HANDLE * libusb_handle = pdev->libusb_handle; LIBUSB_DEVICE * libusb_dev = pdev->libusb_dev; @@ -812,16 +845,11 @@ libusb_udev_select_configuration(IUDEVICE * idev, UINT32 bConfigurationValue) return 0; } - - -static int -libusb_udev_control_pipe_request(IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 *UsbdStatus, - int command) +static int libusb_udev_control_pipe_request(IUDEVICE* idev, UINT32 RequestId, + UINT32 EndpointAddress, UINT32* UsbdStatus, int command) { - UDEVICE * pdev = (UDEVICE *) idev; int error = 0; + UDEVICE* pdev = (UDEVICE*) idev; /* pdev->request_queue->register_request(pdev->request_queue, RequestId, NULL, 0); */ @@ -861,14 +889,12 @@ libusb_udev_control_pipe_request(IUDEVICE * idev, UINT32 RequestId, return error; } - -static int -libusb_udev_control_query_device_text(IUDEVICE * idev, UINT32 TextType, +static int libusb_udev_control_query_device_text(IUDEVICE* idev, UINT32 TextType, UINT32 LocaleId, UINT32 * BufferSize, BYTE * Buffer) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; LIBUSB_DEVICE_DESCRIPTOR * devDescriptor = pdev->devDescriptor; char * strDesc = "Generic Usb String"; char deviceLocation[25]; @@ -928,8 +954,7 @@ libusb_udev_control_query_device_text(IUDEVICE * idev, UINT32 TextType, } -static int -libusb_udev_os_feature_descriptor_request(IUDEVICE * idev, UINT32 RequestId, +static int libusb_udev_os_feature_descriptor_request(IUDEVICE* idev, UINT32 RequestId, BYTE Recipient, BYTE InterfaceNumber, BYTE Ms_PageIndex, @@ -939,7 +964,7 @@ libusb_udev_os_feature_descriptor_request(IUDEVICE * idev, UINT32 RequestId, BYTE* Buffer, int Timeout) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; BYTE ms_string_desc[0x13]; int error = 0; /* @@ -983,12 +1008,10 @@ libusb_udev_os_feature_descriptor_request(IUDEVICE * idev, UINT32 RequestId, return error; } - - -static int -libusb_udev_query_device_descriptor(IUDEVICE * idev, int offset) +static int libusb_udev_query_device_descriptor(IUDEVICE* idev, int offset) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; + switch (offset) { case B_LENGTH: @@ -1025,12 +1048,11 @@ libusb_udev_query_device_descriptor(IUDEVICE * idev, int offset) return 0; } - -static void -libusb_udev_detach_kernel_driver(IUDEVICE * idev) +static void libusb_udev_detach_kernel_driver(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; int i, err = 0; + UDEVICE* pdev = (UDEVICE*) idev; + if ((pdev->status & URBDRC_DEVICE_DETACH_KERNEL) == 0) { for (i = 0; i < pdev->LibusbConfig->bNumInterfaces; i++) @@ -1047,12 +1069,11 @@ libusb_udev_detach_kernel_driver(IUDEVICE * idev) } } - -static void -libusb_udev_attach_kernel_driver(IUDEVICE * idev) +static void libusb_udev_attach_kernel_driver(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; int i, err = 0; + UDEVICE* pdev = (UDEVICE*) idev; + for (i = 0; i < pdev->LibusbConfig->bNumInterfaces && err != LIBUSB_ERROR_NO_DEVICE; i++) { err = libusb_release_interface (pdev->libusb_handle, i); @@ -1067,118 +1088,104 @@ libusb_udev_attach_kernel_driver(IUDEVICE * idev) } } - -static int -libusb_udev_is_composite_device(IUDEVICE * idev) +static int libusb_udev_is_composite_device(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return pdev->isCompositeDevice; } - -static int -libusb_udev_is_signal_end(IUDEVICE * idev) +static int libusb_udev_is_signal_end(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return (pdev->status & URBDRC_DEVICE_SIGNAL_END) ? 1 : 0; } -static int -libusb_udev_is_exist(IUDEVICE * idev) +static int libusb_udev_is_exist(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return (pdev->status & URBDRC_DEVICE_NOT_FOUND) ? 0 : 1; } - -static int -libusb_udev_is_channel_closed(IUDEVICE * idev) +static int libusb_udev_is_channel_closed(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return (pdev->status & URBDRC_DEVICE_CHANNEL_CLOSED) ? 1 : 0; } - -static int -libusb_udev_is_already_send(IUDEVICE * idev) +static int libusb_udev_is_already_send(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return (pdev->status & URBDRC_DEVICE_ALREADY_SEND) ? 1 : 0; } - -static void -libusb_udev_signal_end(IUDEVICE * idev) +static void libusb_udev_signal_end(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; pdev->status |= URBDRC_DEVICE_SIGNAL_END; } -static void -libusb_udev_channel_closed(IUDEVICE * idev) +static void libusb_udev_channel_closed(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; pdev->status |= URBDRC_DEVICE_CHANNEL_CLOSED; } - -static void -libusb_udev_set_already_send(IUDEVICE * idev) +static void libusb_udev_set_already_send(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; pdev->status |= URBDRC_DEVICE_ALREADY_SEND; } -static char * -libusb_udev_get_path(IUDEVICE * idev) +static char* libusb_udev_get_path(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; return pdev->path; } -static int -libusb_udev_wait_action_completion(IUDEVICE * idev) +static int libusb_udev_wait_action_completion(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; int error, sval; + UDEVICE* pdev = (UDEVICE*) idev; + while(1) { usleep(500000); + error = sem_getvalue(&pdev->sem_id, &sval); - if(sval == 0) + + if (sval == 0) break; } + return error; } -static void -libusb_udev_push_action(IUDEVICE * idev) +static void libusb_udev_push_action(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; sem_post(&pdev->sem_id); } -static void -libusb_udev_complete_action(IUDEVICE * idev) +static void libusb_udev_complete_action(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; sem_trywait(&pdev->sem_id); } -static int -libusb_udev_wait_for_detach(IUDEVICE * idev) +static int libusb_udev_wait_for_detach(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; int error = 0; int times = 0; + UDEVICE* pdev = (UDEVICE*) idev; - while(times < 25) + while (times < 25) { - if(pdev->status & URBDRC_DEVICE_SIGNAL_END) + if (pdev->status & URBDRC_DEVICE_SIGNAL_END) { error = -1; break; } + usleep(200000); times++; } @@ -1186,28 +1193,21 @@ libusb_udev_wait_for_detach(IUDEVICE * idev) return error; } - -static void -libusb_udev_lock_fifo_isoch(IUDEVICE * idev) +static void libusb_udev_lock_fifo_isoch(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; pthread_mutex_lock(&pdev->mutex_isoch); } -static void -libusb_udev_unlock_fifo_isoch(IUDEVICE * idev) +static void libusb_udev_unlock_fifo_isoch(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; pthread_mutex_unlock(&pdev->mutex_isoch); } - -static int -libusb_udev_query_device_port_status(IUDEVICE * idev, UINT32 *UsbdStatus, - UINT32 * BufferSize, - BYTE * Buffer) +static int libusb_udev_query_device_port_status(IUDEVICE* idev, UINT32* UsbdStatus, UINT32* BufferSize, BYTE* Buffer) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; int success = 0, ret; if (pdev->hub_handle != NULL) @@ -1237,19 +1237,17 @@ libusb_udev_query_device_port_status(IUDEVICE * idev, UINT32 *UsbdStatus, return success; } - -static int -libusb_udev_request_queue_is_none(IUDEVICE * idev) +static int libusb_udev_request_queue_is_none(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; + if (pdev->request_queue->request_num == 0) return 1; + return 0; } - -static int -libusb_udev_isoch_transfer(IUDEVICE * idev, UINT32 RequestId, UINT32 EndpointAddress, +static int libusb_udev_isoch_transfer(IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress, UINT32 TransferFlags, int NoAck, UINT32 *ErrorCount, @@ -1261,7 +1259,7 @@ libusb_udev_isoch_transfer(IUDEVICE * idev, UINT32 RequestId, UINT32 EndpointAdd BYTE *Buffer, int Timeout) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; ISO_USER_DATA iso_user_data; struct libusb_transfer * iso_transfer = NULL; UINT32 iso_packet_size; @@ -1342,58 +1340,32 @@ libusb_udev_isoch_transfer(IUDEVICE * idev, UINT32 RequestId, UINT32 EndpointAdd return error; } - -static int -libusb_udev_control_transfer(IUDEVICE * idev, UINT32 RequestId, UINT32 EndpointAddress, - UINT32 TransferFlags, - BYTE bmRequestType, - BYTE Request, - UINT16 Value, - UINT16 Index, - UINT32 *UrbdStatus, - UINT32 *BufferSize, - BYTE *Buffer, - UINT32 Timeout) +static int libusb_udev_control_transfer(IUDEVICE* idev, UINT32 RequestId, UINT32 EndpointAddress, + UINT32 TransferFlags, BYTE bmRequestType, BYTE Request, UINT16 Value, UINT16 Index, + UINT32* UrbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout) { - UDEVICE * pdev = (UDEVICE *) idev; int error = 0; - /* - pdev->request_queue->register_request(pdev->request_queue, - RequestId, NULL, 0); - */ + UDEVICE* pdev = (UDEVICE*) idev; + error = libusb_control_transfer(pdev->libusb_handle, - bmRequestType, - Request, - Value, - Index, - Buffer, - *BufferSize, - Timeout); + bmRequestType, Request, Value, Index, Buffer, *BufferSize, Timeout); + if (!(error < 0)) *BufferSize = error; + func_set_usbd_status(pdev, UrbdStatus, error); - /* - if(pdev->request_queue->unregister_request(pdev->request_queue, RequestId)) - printf("request_queue_unregister_request: not fount request 0x%x\n", RequestId); - */ + return error; } - -static int -libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, - UINT32 EndpointAddress, - UINT32 TransferFlags, - UINT32 *UsbdStatus, - UINT32 *BufferSize, - BYTE *Buffer, - UINT32 Timeout) +static int libusb_udev_bulk_or_interrupt_transfer(IUDEVICE* idev, UINT32 RequestId, + UINT32 EndpointAddress, UINT32 TransferFlags, UINT32* UsbdStatus, UINT32* BufferSize, BYTE* Buffer, UINT32 Timeout) { - UDEVICE * pdev = (UDEVICE *) idev; - const LIBUSB_ENDPOINT_DESCEIPTOR * ep_desc; - struct libusb_transfer * transfer = NULL; - TRANSFER_REQUEST * request = NULL; UINT32 transfer_type; + UDEVICE* pdev = (UDEVICE*) idev; + const LIBUSB_ENDPOINT_DESCEIPTOR* ep_desc; + struct libusb_transfer* transfer = NULL; + TRANSFER_REQUEST* request = NULL; int completed = 0, ret = 0, submit = 0; int transferDir = EndpointAddress & 0x80; @@ -1402,7 +1374,8 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, ep_desc = func_get_ep_desc(pdev->LibusbConfig, pdev->MsConfig, EndpointAddress); - if(!ep_desc){ + if (!ep_desc) + { printf("func_get_ep_desc: endpoint 0x%x is not found!!\n", EndpointAddress); return -1; } @@ -1412,11 +1385,13 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, "transfer_type %d flag:%d OutputBufferSize:0x%x", EndpointAddress, transfer_type, TransferFlags, *BufferSize)); - switch (transfer_type){ + switch (transfer_type) + { case BULK_TRANSFER: /** Bulk Transfer */ //Timeout = 10000; break; + case INTERRUPT_TRANSFER: /** Interrupt Transfer */ /** Sometime, we may have receive a oversized transfer request, @@ -1433,6 +1408,7 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, } Timeout = 0; break; + default: LLOGLN(0, ("urb_bulk_or_interrupt_transfer:" " other transfer type 0x%X", transfer_type)); @@ -1440,46 +1416,41 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, break; } + libusb_fill_bulk_transfer(transfer, pdev->libusb_handle, EndpointAddress, + Buffer, *BufferSize, func_bulk_transfer_cb, &completed, Timeout); - libusb_fill_bulk_transfer(transfer, - pdev->libusb_handle, - EndpointAddress, - Buffer, - *BufferSize, - func_bulk_transfer_cb, - &completed, - Timeout); - - transfer->type = (unsigned char)transfer_type; + transfer->type = (unsigned char) transfer_type; /** Bug fixed in libusb-1.0-8 later: issue of memory crash */ submit = libusb_submit_transfer(transfer); - if (submit < 0) { + + if (submit < 0) + { LLOGLN(libusb_debug, ("libusb_bulk_transfer: error num %d", ret)); func_set_usbd_status(pdev, UsbdStatus, ret); *BufferSize = 0; } else { - request = pdev->request_queue->register_request( - pdev->request_queue, - RequestId, - transfer, - EndpointAddress); + pdev->request_queue, RequestId, transfer, EndpointAddress); request->submit = 1; } - if(pdev && *UsbdStatus == 0 && submit >= 0 && - pdev->iface.isSigToEnd((IUDEVICE*)pdev) == 0) + if ((pdev && *UsbdStatus == 0) && (submit >= 0) && + (pdev->iface.isSigToEnd((IUDEVICE*) pdev) == 0)) { - while (!completed) { - //ret = libusb_handle_events_check(NULL, &completed); + while (!completed) + { ret = handle_events_completed(NULL, &completed); - if (ret < 0) { + + if (ret < 0) + { if (ret == LIBUSB_ERROR_INTERRUPTED) continue; + libusb_cancel_transfer(transfer); + while (!completed) { if (handle_events_completed(NULL, &completed) < 0) @@ -1496,24 +1467,32 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, usleep(WAIT_COMPLETE_SLEEP); #endif } - switch (transfer->status) { - case LIBUSB_TRANSFER_COMPLETED: - func_set_usbd_status(pdev, UsbdStatus, 0); - break; - case LIBUSB_TRANSFER_TIMED_OUT: - func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_TIMEOUT); - break; - case LIBUSB_TRANSFER_STALL: - func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_PIPE); - break; - case LIBUSB_TRANSFER_OVERFLOW: - func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_OVERFLOW); - break; - case LIBUSB_TRANSFER_NO_DEVICE: - func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_NO_DEVICE); - break; - default: - func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_OTHER); + + switch (transfer->status) + { + case LIBUSB_TRANSFER_COMPLETED: + func_set_usbd_status(pdev, UsbdStatus, 0); + break; + + case LIBUSB_TRANSFER_TIMED_OUT: + func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_TIMEOUT); + break; + + case LIBUSB_TRANSFER_STALL: + func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_PIPE); + break; + + case LIBUSB_TRANSFER_OVERFLOW: + func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_OVERFLOW); + break; + + case LIBUSB_TRANSFER_NO_DEVICE: + func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_NO_DEVICE); + break; + + default: + func_set_usbd_status(pdev, UsbdStatus, LIBUSB_ERROR_OTHER); + break; } *BufferSize = transfer->actual_length; @@ -1531,33 +1510,32 @@ libusb_udev_bulk_or_interrupt_transfer(IUDEVICE * idev, UINT32 RequestId, return 0; } - - -static void -libusb_udev_cancel_all_transfer_request(IUDEVICE * idev) +static void libusb_udev_cancel_all_transfer_request(IUDEVICE* idev) { - UDEVICE * pdev = (UDEVICE *) idev; - REQUEST_QUEUE * request_queue = pdev->request_queue; - TRANSFER_REQUEST * request = NULL; int ret; + UDEVICE* pdev = (UDEVICE*) idev; + REQUEST_QUEUE* request_queue = pdev->request_queue; + TRANSFER_REQUEST* request = NULL; + pthread_mutex_lock(&request_queue->request_loading); - request_queue->rewind (request_queue); - while (request_queue->has_next (request_queue)) + request_queue->rewind(request_queue); + + while (request_queue->has_next(request_queue)) { - request = request_queue->get_next (request_queue); + request = request_queue->get_next(request_queue); - if (!request || - !request->transfer || - request->endpoint != request->transfer->endpoint || - request->transfer->endpoint == 0 || - request->submit != 1) + if ((!request) || (!request->transfer) || + (request->endpoint != request->transfer->endpoint) || + (request->transfer->endpoint == 0) || (request->submit != 1)) { continue; } ret = libusb_cancel_transfer(request->transfer); - if (ret < 0){ + + if (ret < 0) + { LLOGLN(libusb_debug, ("libusb_cancel_transfer: error num %d!!\n", ret)); } else @@ -1566,44 +1544,42 @@ libusb_udev_cancel_all_transfer_request(IUDEVICE * idev) } } + pthread_mutex_unlock(&request_queue->request_loading); } - -static int -func_cancel_xact_request(TRANSFER_REQUEST *request) +static int func_cancel_xact_request(TRANSFER_REQUEST *request) { int ret; - if (!request->transfer || - request->endpoint != request->transfer->endpoint || - request->transfer->endpoint == 0 || - request->submit != 1) + if ((!request->transfer) || (request->endpoint != request->transfer->endpoint) || + (request->transfer->endpoint == 0) || (request->submit != 1)) { return 0; } ret = libusb_cancel_transfer(request->transfer); - if (ret < 0){ - LLOGLN(0, ("libusb_cancel_transfer: error num %d!!", ret)); - if(ret == LIBUSB_ERROR_NOT_FOUND) + + if (ret < 0) + { + LLOGLN(0, ("libusb_cancel_transfer: error num %d!!", ret)); + + if (ret == LIBUSB_ERROR_NOT_FOUND) return -1; } else { - LLOGLN(libusb_debug, ("libusb_cancel_transfer: Success num:0x%x!!", - request->RequestId)); + LLOGLN(libusb_debug, ("libusb_cancel_transfer: Success num:0x%x!!", request->RequestId)); request->submit = -1; return 1; } + return 0; } - -static int -libusb_udev_cancel_transfer_request(IUDEVICE * idev, UINT32 RequestId) +static int libusb_udev_cancel_transfer_request(IUDEVICE* idev, UINT32 RequestId) { - UDEVICE * pdev = (UDEVICE *) idev; + UDEVICE* pdev = (UDEVICE*) idev; REQUEST_QUEUE * request_queue = pdev->request_queue; TRANSFER_REQUEST * request = NULL; int success = 0, retry_times = 0; @@ -1612,29 +1588,37 @@ cancel_retry: pthread_mutex_lock(&request_queue->request_loading); request_queue->rewind (request_queue); + while (request_queue->has_next (request_queue)) { request = request_queue->get_next (request_queue); + LLOGLN(libusb_debug, ("%s: CancelId:0x%x RequestId:0x%x endpoint 0x%x!!", __func__, RequestId, request->RequestId, request->endpoint)); + if (request && request->RequestId == RequestId && retry_times <= 10 ) { success = func_cancel_xact_request(request); break; } - else if(request->transfer && retry_times > 10){ + else if(request->transfer && retry_times > 10) + { success = -1; break; } } + pthread_mutex_unlock(&request_queue->request_loading); - if (success == 0 && retry_times < 10){ + + if (success == 0 && retry_times < 10) + { retry_times++; usleep(100000); LLOGLN(10, ("urbdrc_process_cancel_request: go retry!!")); goto cancel_retry; } - else if(success < 0 || retry_times >= 10){ + else if(success < 0 || retry_times >= 10) + { /** END */ LLOGLN(libusb_debug, ("urbdrc_process_cancel_request: error go exit!!")); return -1; @@ -1657,10 +1641,7 @@ BASIC_POINT_FUNC_DEFINED(udev, void *) BASIC_POINT_FUNC_DEFINED(prev, void *) BASIC_POINT_FUNC_DEFINED(next, void *) - - -static void -udev_load_interface(UDEVICE * pdev) +static void udev_load_interface(UDEVICE* pdev) { /* load interface */ @@ -1714,19 +1695,16 @@ udev_load_interface(UDEVICE * pdev) pdev->iface.wait_for_detach = libusb_udev_wait_for_detach; } - - - -static IUDEVICE* -udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) +static IUDEVICE* udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) { + int ret, num; LIBUSB_DEVICE_DESCRIPTOR* devDescriptor; LIBUSB_CONFIG_DESCRIPTOR* config_temp; LIBUSB_INTERFACE_DESCRIPTOR interface_temp; - int ret, num; /* Get HUB handle */ ret = udev_get_hub_handle(pdev, bus_number, dev_number); + if (ret < 0) { printf("USB init: Error to get HUB handle!!\n"); @@ -1734,6 +1712,7 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) } pdev->devDescriptor = udev_new_descript(pdev->libusb_dev); + if (!pdev->devDescriptor) { printf("USB init: Error to get device descriptor!!\n"); @@ -1744,11 +1723,14 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) num = pdev->devDescriptor->bNumConfigurations; ret = libusb_get_active_config_descriptor (pdev->libusb_dev, &pdev->LibusbConfig); - if (ret<0){ + + if (ret < 0) + { printf("libusb_get_descriptor: ERROR!!ret:%d\n", ret); zfree(pdev); return NULL; } + config_temp = pdev->LibusbConfig; /* get the first interface and first altsetting */ interface_temp = config_temp->interface[0].altsetting[0]; @@ -1758,6 +1740,7 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) pdev->devDescriptor->idVendor, pdev->devDescriptor->idProduct, interface_temp.bInterfaceClass)); + /* Denied list */ switch(interface_temp.bInterfaceClass) { @@ -1772,7 +1755,7 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) case CLASS_CONTENT_SECURITY: //case CLASS_WIRELESS_CONTROLLER: //case CLASS_ELSE_DEVICE: - printf(" Device is not support!!\n"); + printf(" Device is not supported!!\n"); zfree(pdev); return NULL; default: @@ -1781,15 +1764,16 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) /* Check composite device */ devDescriptor = pdev->devDescriptor; - if(devDescriptor->bNumConfigurations == 1 && - config_temp->bNumInterfaces > 1 && - devDescriptor->bDeviceClass == 0x0) + + if ((devDescriptor->bNumConfigurations == 1) && + (config_temp->bNumInterfaces > 1) && + (devDescriptor->bDeviceClass == 0x0)) { pdev->isCompositeDevice = 1; } - else if(devDescriptor->bDeviceClass == 0xef && - devDescriptor->bDeviceSubClass == 0x02 && - devDescriptor->bDeviceProtocol == 0x01 ) + else if ((devDescriptor->bDeviceClass == 0xef) && + (devDescriptor->bDeviceSubClass == 0x02) && + (devDescriptor->bDeviceProtocol == 0x01)) { pdev->isCompositeDevice = 1; } @@ -1814,6 +1798,7 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) pdev->request_queue = request_queue_new(); pdev->isoch_queue = NULL; sem_init(&pdev->sem_id, 0, 0); + /* set config of windows */ pdev->MsConfig = msusb_msconfig_new(); @@ -1823,75 +1808,84 @@ udev_init(UDEVICE* pdev, UINT16 bus_number, UINT16 dev_number) udev_load_interface(pdev); - return (IUDEVICE *)pdev; + return (IUDEVICE*) pdev; } - - -int -udev_new_by_id(UINT16 idVendor, UINT16 idProduct, IUDEVICE *** devArray) +int udev_new_by_id(UINT16 idVendor, UINT16 idProduct, IUDEVICE*** devArray) { - LIBUSB_DEVICE_DESCRIPTOR * descriptor; - LIBUSB_DEVICE ** libusb_list; - UDEVICE ** array; + LIBUSB_DEVICE_DESCRIPTOR* descriptor; + LIBUSB_DEVICE** libusb_list; + UDEVICE** array; UINT16 bus_number; UINT16 dev_number; ssize_t total_device; int i, ret, num = 0; - array = (UDEVICE **) malloc (16 * sizeof (UDEVICE *)); + array = (UDEVICE**) malloc(16 * sizeof (UDEVICE *)); total_device = libusb_get_device_list(NULL, &libusb_list); + for (i = 0; i < total_device; i++) { descriptor = udev_new_descript(libusb_list[i]); - if(descriptor->idVendor == idVendor && - descriptor->idProduct == idProduct) + + if ((descriptor->idVendor == idVendor) && (descriptor->idProduct == idProduct)) { bus_number = 0; dev_number = 0; - array[num] = (PUDEVICE)malloc(sizeof(UDEVICE)); + array[num] = (PUDEVICE) malloc(sizeof(UDEVICE)); array[num]->libusb_dev = libusb_list[i]; - ret = libusb_open (libusb_list[i], &array[num]->libusb_handle); - if (ret < 0){ + + ret = libusb_open(libusb_list[i], &array[num]->libusb_handle); + + if (ret < 0) + { printf("libusb_open: ERROR!!\n"); zfree(descriptor); zfree(array[num]); continue; } - bus_number = libusb_get_bus_number (libusb_list[i]); - dev_number = libusb_get_device_address (libusb_list[i]); - array[num] = (PUDEVICE)udev_init(array[num], bus_number, dev_number); + + bus_number = libusb_get_bus_number(libusb_list[i]); + dev_number = libusb_get_device_address(libusb_list[i]); + + array[num] = (PUDEVICE) udev_init(array[num], bus_number, dev_number); + if (array[num] != NULL) num++; } zfree(descriptor); } + libusb_free_device_list(libusb_list, 1); - *devArray = (IUDEVICE **)array; + *devArray = (IUDEVICE**) array; + return num; } -IUDEVICE * -udev_new_by_addr(int bus_number, int dev_number) +IUDEVICE* udev_new_by_addr(int bus_number, int dev_number) { - UDEVICE* pDev; - int ret; + int status; + UDEVICE* pDev; LLOGLN(10, ("bus:%d dev:%d\n", bus_number, dev_number)); - pDev = (PUDEVICE)malloc(sizeof(UDEVICE)); + pDev = (PUDEVICE) malloc(sizeof(UDEVICE)); pDev->libusb_dev = udev_get_libusb_dev(bus_number, dev_number); - if (pDev->libusb_dev == NULL){ + + if (pDev->libusb_dev == NULL) + { printf("libusb_device_new: ERROR!!\n"); zfree(pDev); return NULL; } - ret = libusb_open (pDev->libusb_dev, &pDev->libusb_handle); - if (ret < 0){ + status = libusb_open(pDev->libusb_dev, &pDev->libusb_handle); + + if (status < 0) + { printf("libusb_open: ERROR!!\n"); zfree(pDev); return NULL; diff --git a/channels/urbdrc/libusb/libusb_udevman.c b/channels/urbdrc/libusb/libusb_udevman.c index 7d71d9e4d..c594cbf9c 100644 --- a/channels/urbdrc/libusb/libusb_udevman.c +++ b/channels/urbdrc/libusb/libusb_udevman.c @@ -22,6 +22,11 @@ #include #include +#include +#include + +#include + #include "urbdrc_types.h" #include "urbdrc_main.h" @@ -61,19 +66,20 @@ struct _UDEVMAN int sem_timeout; pthread_mutex_t devman_loading; - sem_t sem_urb_lock; + sem_t sem_urb_lock; }; -typedef UDEVMAN * PUDEVMAN; +typedef UDEVMAN* PUDEVMAN; static void udevman_rewind(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; udevman->idev = udevman->head; } static int udevman_has_next(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; + if (udevman->idev == NULL) return 0; else @@ -82,60 +88,63 @@ static int udevman_has_next(IUDEVMAN* idevman) static IUDEVICE* udevman_get_next(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN*) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; IUDEVICE* pdev; pdev = udevman->idev; - udevman->idev = (IUDEVICE*) ((UDEVICE*)udevman->idev)->next; + udevman->idev = (IUDEVICE*) ((UDEVICE*) udevman->idev)->next; return pdev; } static IUDEVICE* udevman_get_udevice_by_addr(IUDEVMAN* idevman, int bus_number, int dev_number) { - IUDEVICE * pdev; + IUDEVICE* pdev; idevman->loading_lock(idevman); - idevman->rewind (idevman); - while (idevman->has_next (idevman)) + idevman->rewind(idevman); + + while (idevman->has_next(idevman)) { - pdev = idevman->get_next (idevman); - if (pdev->get_bus_number(pdev) == bus_number && - pdev->get_dev_number(pdev) == dev_number) + pdev = idevman->get_next(idevman); + + if ((pdev->get_bus_number(pdev) == bus_number) && (pdev->get_dev_number(pdev) == dev_number)) { idevman->loading_unlock(idevman); return pdev; } } + idevman->loading_unlock(idevman); LLOGLN(libusb_debug, ("%s: bus:%d dev:%d not exist in udevman", __func__, bus_number, dev_number)); + return NULL; } static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_number, - int UsbDevice, - UINT16 idVendor, - UINT16 idProduct, - int flag) + int UsbDevice, UINT16 idVendor, UINT16 idProduct, int flag) { - UDEVMAN * udevman = (UDEVMAN *) idevman; - IUDEVICE * pdev = NULL; - IUDEVICE ** devArray; + UDEVMAN* udevman = (UDEVMAN*) idevman; + IUDEVICE* pdev = NULL; + IUDEVICE** devArray; int i, num, addnum = 0; - pdev = (IUDEVICE *)udevman_get_udevice_by_addr(idevman, bus_number, dev_number); + pdev = (IUDEVICE*) udevman_get_udevice_by_addr(idevman, bus_number, dev_number); + if (pdev != NULL) return 0; if (flag == UDEVMAN_FLAG_ADD_BY_ADDR) { pdev = udev_new_by_addr(bus_number, dev_number); + if (pdev == NULL) return 0; pdev->set_UsbDevice(pdev, UsbDevice); idevman->loading_lock(idevman); + if (udevman->head == NULL) { /* linked list is empty */ @@ -149,6 +158,7 @@ static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_n pdev->set_p_prev(pdev, udevman->tail); udevman->tail = pdev; } + udevman->device_num += 1; idevman->loading_unlock(idevman); } @@ -157,13 +167,13 @@ static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_n addnum = 0; /* register all device that match pid vid */ num = udev_new_by_id(idVendor, idProduct, &devArray); + for (i = 0; i < num; i++) { pdev = devArray[i]; + if (udevman_get_udevice_by_addr(idevman, - pdev->get_bus_number(pdev), - pdev->get_dev_number(pdev)) - != NULL) + pdev->get_bus_number(pdev), pdev->get_dev_number(pdev)) != NULL) { zfree(pdev); continue; @@ -171,6 +181,7 @@ static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_n pdev->set_UsbDevice(pdev, UsbDevice); idevman->loading_lock(idevman); + if (udevman->head == NULL) { /* linked list is empty */ @@ -184,10 +195,12 @@ static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_n pdev->set_p_prev(pdev, udevman->tail); udevman->tail = pdev; } + udevman->device_num += 1; idevman->loading_unlock(idevman); addnum++; } + zfree(devArray); return addnum; } @@ -196,23 +209,24 @@ static int udevman_register_udevice(IUDEVMAN* idevman, int bus_number, int dev_n printf("udevman_register_udevice: function error!!"); return 0; } + return 1; } - static int udevman_unregister_udevice(IUDEVMAN* idevman, int bus_number, int dev_number) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; UDEVICE * pdev, * dev; int ret = 0, err = 0; - dev = (UDEVICE *)udevman_get_udevice_by_addr(idevman, bus_number, dev_number); + dev = (UDEVICE*) udevman_get_udevice_by_addr(idevman, bus_number, dev_number); idevman->loading_lock(idevman); idevman->rewind(idevman); + while (idevman->has_next(idevman) != 0) { - pdev = (UDEVICE *)idevman->get_next(idevman); + pdev = (UDEVICE*) idevman->get_next(idevman); if (pdev == dev) /* device exists */ { @@ -280,12 +294,11 @@ static int udevman_unregister_udevice(IUDEVMAN* idevman, int bus_number, int dev return 1; /* unregistration successful */ } - /* if we reach this point, the device wasn't found */ return 0; } -static void udevman_parse_device_addr (char *str, int *id1, int *id2, char sign) +static void udevman_parse_device_addr(char *str, int *id1, int *id2, char sign) { char s1[8], *s2; memset(s1, 0, sizeof(s1)); @@ -297,9 +310,9 @@ static void udevman_parse_device_addr (char *str, int *id1, int *id2, char sign) *id2 = atoi(s2); } -static void udevman_parse_device_pid_vid (char *str, int *id1, int *id2, char sign) +static void udevman_parse_device_pid_vid(char *str, int *id1, int *id2, char sign) { - char s1[8], *s2; + char s1[8], *s2; memset(s1, 0, sizeof(s1)); s2 = (strchr(str, sign)) + 1; @@ -319,102 +332,108 @@ static int udevman_check_device_exist_by_id(IUDEVMAN* idevman, UINT16 idVendor, static int udevman_is_auto_add(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; return (udevman->flags & UDEVMAN_FLAG_ADD_BY_AUTO) ? 1 : 0; } static IUDEVICE* udevman_get_udevice_by_UsbDevice_try_again(IUDEVMAN* idevman, UINT32 UsbDevice) { - UDEVICE * pdev; + UDEVICE* pdev; idevman->loading_lock(idevman); - idevman->rewind (idevman); - while (idevman->has_next (idevman)) + idevman->rewind(idevman); + + while (idevman->has_next(idevman)) { - pdev = (UDEVICE *)idevman->get_next (idevman); + pdev = (UDEVICE*) idevman->get_next(idevman); + if (pdev->UsbDevice == UsbDevice) { idevman->loading_unlock(idevman); - return (IUDEVICE *)pdev; + return (IUDEVICE*) pdev; } } + idevman->loading_unlock(idevman); + return NULL; } static IUDEVICE* udevman_get_udevice_by_UsbDevice(IUDEVMAN* idevman, UINT32 UsbDevice) { - UDEVICE * pdev; + UDEVICE* pdev; idevman->loading_lock(idevman); - idevman->rewind (idevman); - while (idevman->has_next (idevman)) + idevman->rewind(idevman); + + while (idevman->has_next(idevman)) { - pdev = (UDEVICE *)idevman->get_next (idevman); + pdev = (UDEVICE*) idevman->get_next(idevman); + if (pdev->UsbDevice == UsbDevice) { idevman->loading_unlock(idevman); - return (IUDEVICE *)pdev; + return (IUDEVICE*) pdev; } } + idevman->loading_unlock(idevman); + /* try again */ - pdev = (UDEVICE *)idevman->get_udevice_by_UsbDevice_try_again(idevman, UsbDevice); + + pdev = (UDEVICE*) idevman->get_udevice_by_UsbDevice_try_again(idevman, UsbDevice); + if (pdev) { - return (IUDEVICE *)pdev; + return (IUDEVICE*) pdev; } - LLOGLN(libusb_debug, ("udevman_get_udevice_by_UsbDevice: 0x%x ERROR!!\n", - UsbDevice)); + LLOGLN(libusb_debug, ("udevman_get_udevice_by_UsbDevice: 0x%x ERROR!!\n", UsbDevice)); + return NULL; } - static void udevman_loading_lock(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; pthread_mutex_lock(&udevman->devman_loading); } static void udevman_loading_unlock(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; pthread_mutex_unlock(&udevman->devman_loading); } - static void udevman_wait_urb(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; sem_wait(&udevman->sem_urb_lock); } - static void udevman_push_urb(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; sem_post(&udevman->sem_urb_lock); } - BASIC_STATE_FUNC_DEFINED(defUsbDevice, UINT32) BASIC_STATE_FUNC_DEFINED(device_num, int) BASIC_STATE_FUNC_DEFINED(sem_timeout, int) - static void udevman_free(IUDEVMAN* idevman) { - UDEVMAN * udevman = (UDEVMAN *) idevman; + UDEVMAN* udevman = (UDEVMAN*) idevman; + pthread_mutex_destroy(&udevman->devman_loading); sem_destroy(&udevman->sem_urb_lock); libusb_exit(NULL); /* free udevman */ + if (udevman) zfree(udevman); } - static void udevman_load_interface(UDEVMAN * udevman) { /* standard */ @@ -442,25 +461,123 @@ static void udevman_load_interface(UDEVMAN * udevman) udevman->iface.wait_urb = udevman_wait_urb; } +COMMAND_LINE_ARGUMENT_A urbdrc_udevman_args[] = +{ + { "dbg", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "debug" }, + { "dev", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "device list" }, + { "id", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_VID_PID" }, + { "addr", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_ADDR" }, + { "auto", COMMAND_LINE_VALUE_FLAG, "", NULL, BoolValueFalse, -1, NULL, "FLAG_ADD_BY_AUTO" }, + { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL } +}; +static void urbdrc_udevman_register_devices(UDEVMAN* udevman, char* devices) +{ + char* token; + int idVendor; + int idProduct; + int bus_number; + int dev_number; + int success = 0; + char hardware_id[16]; + char* default_devices = "id"; + UINT32 UsbDevice = BASE_USBDEVICE_NUM; + + if (!devices) + devices = default_devices; + + /* register all usb devices */ + token = strtok(devices, "#"); + + while (token) + { + bus_number = 0; + dev_number = 0; + idVendor = 0; + idProduct = 0; + + strcpy(hardware_id, token); + token = strtok(NULL, "#"); + + if (udevman->flags & UDEVMAN_FLAG_ADD_BY_VID_PID) + { + udevman_parse_device_pid_vid(hardware_id, &idVendor, &idProduct, '_'); + success = udevman->iface.register_udevice((IUDEVMAN*) udevman, + 0, 0, UsbDevice, (UINT16) idVendor, (UINT16) idProduct, UDEVMAN_FLAG_ADD_BY_VID_PID); + } + else if (udevman->flags & UDEVMAN_FLAG_ADD_BY_ADDR) + { + udevman_parse_device_addr(hardware_id, &bus_number, &dev_number, '_'); + + success = udevman->iface.register_udevice((IUDEVMAN*) udevman, + bus_number, dev_number, UsbDevice, 0, 0, UDEVMAN_FLAG_ADD_BY_ADDR); + } + + if (success) + UsbDevice++; + } + + udevman->defUsbDevice = UsbDevice; +} + +static void urbdrc_udevman_parse_addin_args(UDEVMAN* udevman, ADDIN_ARGV* args) +{ + int status; + DWORD flags; + COMMAND_LINE_ARGUMENT_A* arg; + + flags = COMMAND_LINE_SIGIL_NONE | COMMAND_LINE_SEPARATOR_COLON; + + status = CommandLineParseArgumentsA(args->argc, (const char**) args->argv, + urbdrc_udevman_args, flags, udevman, NULL, NULL); + + arg = urbdrc_udevman_args; + + do + { + if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT)) + continue; + + CommandLineSwitchStart(arg) + + CommandLineSwitchCase(arg, "dbg") + { + urbdrc_debug = 0; + } + CommandLineSwitchCase(arg, "dev") + { + urbdrc_udevman_register_devices(udevman, arg->Value); + } + CommandLineSwitchCase(arg, "id") + { + udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID; + } + CommandLineSwitchCase(arg, "addr") + { + udevman->flags = UDEVMAN_FLAG_ADD_BY_ADDR; + } + CommandLineSwitchCase(arg, "auto") + { + udevman->flags |= UDEVMAN_FLAG_ADD_BY_AUTO; + } + CommandLineSwitchDefault(arg) + { + + } + + CommandLineSwitchEnd(arg) + } + while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); +} int FreeRDPUDEVMANEntry(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS pEntryPoints) { UDEVMAN* udevman; - RDP_PLUGIN_DATA * plugin_data = pEntryPoints->plugin_data; - UINT32 UsbDevice = BASE_USBDEVICE_NUM; - char * token; - char * message = "id"; - char hardware_id[16]; - int idVendor; - int idProduct; - int bus_number; - int dev_number; - int success = 0; + ADDIN_ARGV* args = pEntryPoints->args; libusb_init(NULL); - udevman = (PUDEVMAN)malloc(sizeof(UDEVMAN)); + udevman = (PUDEVMAN) malloc(sizeof(UDEVMAN)); udevman->device_num = 0; udevman->idev = NULL; udevman->head = NULL; @@ -474,66 +591,11 @@ int FreeRDPUDEVMANEntry(PFREERDP_URBDRC_SERVICE_ENTRY_POINTS pEntryPoints) /* load usb device service management */ udevman_load_interface(udevman); - /* set debug flag, to enable Debug message for usb data transfer*/ - if (plugin_data->data[2]) - message = (char *)plugin_data->data[2]; + /* set debug flag, to enable Debug message for usb data transfer */ - if (strstr(message, "id")) - udevman->flags = UDEVMAN_FLAG_ADD_BY_VID_PID; - else if (strstr(message, "addr")) - udevman->flags = UDEVMAN_FLAG_ADD_BY_ADDR; - - if (strstr(message, "auto")) - udevman->flags |= UDEVMAN_FLAG_ADD_BY_AUTO; libusb_debug = 10; - if (strstr(message, "debug")) - { - libusb_debug = 0; - udevman->flags |= UDEVMAN_FLAG_DEBUG; - } - /* register all usb device */ - token = strtok((char *)plugin_data->data[1], "#"); - while (token) - { - bus_number = 0; - dev_number = 0; - idVendor = 0; - idProduct = 0; - strcpy(hardware_id, token); - token = strtok(NULL, "#"); - if (udevman->flags & UDEVMAN_FLAG_ADD_BY_VID_PID) - { - udevman_parse_device_pid_vid(hardware_id, &idVendor, - &idProduct, - '_'); - success = udevman->iface.register_udevice((IUDEVMAN *)udevman, - 0, - 0, - UsbDevice, - (UINT16) idVendor, - (UINT16) idProduct, - UDEVMAN_FLAG_ADD_BY_VID_PID); - } - else if (udevman->flags & UDEVMAN_FLAG_ADD_BY_ADDR) - { - udevman_parse_device_addr(hardware_id, &bus_number, - &dev_number, - '_'); - success = udevman->iface.register_udevice((IUDEVMAN *)udevman, - bus_number, - dev_number, - UsbDevice, - 0, - 0, - UDEVMAN_FLAG_ADD_BY_ADDR); - } - - if (success) - UsbDevice++; - } - - udevman->defUsbDevice = UsbDevice; + urbdrc_udevman_parse_addin_args(udevman, args); pEntryPoints->pRegisterUDEVMAN(pEntryPoints->plugin, (IUDEVMAN*) udevman); diff --git a/channels/urbdrc/libusb/request_queue.c b/channels/urbdrc/libusb/request_queue.c index 48d856d96..893d4f236 100644 --- a/channels/urbdrc/libusb/request_queue.c +++ b/channels/urbdrc/libusb/request_queue.c @@ -43,12 +43,11 @@ int request_queue_has_next(REQUEST_QUEUE* queue) } TRANSFER_REQUEST* request_queue_register_request(REQUEST_QUEUE* queue, UINT32 RequestId, - struct libusb_transfer * transfer, - BYTE endpoint) + struct libusb_transfer* transfer, BYTE endpoint) { - TRANSFER_REQUEST* request; + TRANSFER_REQUEST* request; - request = (TRANSFER_REQUEST*)malloc(sizeof(TRANSFER_REQUEST)); + request = (TRANSFER_REQUEST*) malloc(sizeof(TRANSFER_REQUEST)); request->prev = NULL; request->next = NULL; @@ -57,7 +56,9 @@ TRANSFER_REQUEST* request_queue_register_request(REQUEST_QUEUE* queue, UINT32 Re request->transfer = transfer; request->endpoint = endpoint; request->submit = 0; + pthread_mutex_lock(&queue->request_loading); + if (queue->head == NULL) { /* linked queue is empty */ @@ -67,22 +68,24 @@ TRANSFER_REQUEST* request_queue_register_request(REQUEST_QUEUE* queue, UINT32 Re else { /* append data to the end of the linked queue */ - queue->tail->next = (void*)request; - request->prev = (void*)queue->tail; + queue->tail->next = (void*) request; + request->prev = (void*) queue->tail; queue->tail = request; } + queue->request_num += 1; pthread_mutex_unlock(&queue->request_loading); + return request; } -void request_queue_rewind(REQUEST_QUEUE *queue) +void request_queue_rewind(REQUEST_QUEUE* queue) { queue->ireq = queue->head; } /* Get first*/ -TRANSFER_REQUEST* request_queue_get_request_by_endpoint(REQUEST_QUEUE *queue, BYTE ep) +TRANSFER_REQUEST* request_queue_get_request_by_endpoint(REQUEST_QUEUE* queue, BYTE ep) { TRANSFER_REQUEST * request; pthread_mutex_lock(&queue->request_loading); @@ -101,7 +104,7 @@ TRANSFER_REQUEST* request_queue_get_request_by_endpoint(REQUEST_QUEUE *queue, BY return NULL; } -int request_queue_unregister_request(REQUEST_QUEUE *queue, UINT32 RequestId) +int request_queue_unregister_request(REQUEST_QUEUE* queue, UINT32 RequestId) { TRANSFER_REQUEST *request, *request_temp; pthread_mutex_lock(&queue->request_loading); @@ -110,27 +113,28 @@ int request_queue_unregister_request(REQUEST_QUEUE *queue, UINT32 RequestId) while (queue->has_next(queue) != 0) { request = queue->get_next(queue); + if (request->RequestId == RequestId) { if (request->prev != NULL) { - request_temp = (TRANSFER_REQUEST*)request->prev; - request_temp->next = (TRANSFER_REQUEST*)request->next; + request_temp = (TRANSFER_REQUEST*) request->prev; + request_temp->next = (TRANSFER_REQUEST*) request->next; } else { - queue->head = (TRANSFER_REQUEST*)request->next; + queue->head = (TRANSFER_REQUEST*) request->next; } if (request->next != NULL) { - request_temp = (TRANSFER_REQUEST*)request->next; - request_temp->prev = (TRANSFER_REQUEST*)request->prev; + request_temp = (TRANSFER_REQUEST*) request->next; + request_temp->prev = (TRANSFER_REQUEST*) request->prev; } else { - queue->tail = (TRANSFER_REQUEST*)request->prev; + queue->tail = (TRANSFER_REQUEST*) request->prev; } @@ -156,7 +160,7 @@ REQUEST_QUEUE* request_queue_new() { REQUEST_QUEUE* queue; - queue = (REQUEST_QUEUE*)malloc(sizeof(REQUEST_QUEUE)); + queue = (REQUEST_QUEUE*) malloc(sizeof(REQUEST_QUEUE)); queue->request_num = 0; queue->ireq = NULL; queue->head = NULL; diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index a70d9d295..cf16da28e 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -134,7 +134,7 @@ static BOOL xf_event_MotionNotify(xfInfo* xfi, XEvent* event, BOOL app) { return TRUE; } - // Translate to desktop coordinates + /* Translate to desktop coordinates */ XTranslateCoordinates(xfi->display, event->xmotion.window, RootWindowOfScreen(xfi->screen), x, y, &x, &y, &childWindow); @@ -197,18 +197,18 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) flags = PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0088; break; - case 6: // wheel left or back - case 8: // back - case 97: // Xming + case 6: /* wheel left or back */ + case 8: /* back */ + case 97: /* Xming */ extended = TRUE; x = event->xbutton.x; y = event->xbutton.y; flags = PTR_XFLAGS_DOWN | PTR_XFLAGS_BUTTON1; break; - case 7: // wheel right or forward - case 9: // forward - case 112: // Xming + case 7: /* wheel right or forward */ + case 9: /* forward */ + case 112: /* Xming */ extended = TRUE; x = event->xbutton.x; y = event->xbutton.y; @@ -237,7 +237,7 @@ static BOOL xf_event_ButtonPress(xfInfo* xfi, XEvent* event, BOOL app) { return TRUE; } - // Translate to desktop coordinates + /* Translate to desktop coordinates */ XTranslateCoordinates(xfi->display, event->xbutton.window, RootWindowOfScreen(xfi->screen), x, y, &x, &y, &childWindow); @@ -320,7 +320,7 @@ static BOOL xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, BOOL app) { return TRUE; } - // Translate to desktop coordinates + /* Translate to desktop coordinates */ XTranslateCoordinates(xfi->display, event->xbutton.window, RootWindowOfScreen(xfi->screen), x, y, &x, &y, &childWindow); @@ -393,7 +393,7 @@ static BOOL xf_event_FocusIn(xfInfo* xfi, XEvent* event, BOOL app) window = window_list_get_by_extra_id(rail->list, (void*) event->xany.window); - //Update the server with any window changes that occured while the window was not focused. + /* Update the server with any window changes that occured while the window was not focused. */ if (window != NULL) xf_rail_adjust_position(xfi, window); } @@ -537,10 +537,12 @@ static BOOL xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, BOOL app) (UINT32) xfw->handle, xfw->left, xfw->top, xfw->right, xfw->bottom, xfw->width, xfw->height, event->xconfigure.send_event); - /* additonal checks for not in a local move and not ignoring configure to send + /* + * Additonal checks for not in a local move and not ignoring configure to send * position update to server, also should the window not be focused then do not * send to server yet(ie. resizing using window decoration). - * The server will be updated when the window gets refocused. */ + * The server will be updated when the window gets refocused. + */ if (app && xfw->decorations) { /* moving resizing using window decoration */ @@ -590,9 +592,12 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) if (window != NULL) { /* local restore event */ - //This is now handled as part of the PropertyNotify - //Doing this here would inhibit the ability to restore a maximized window - //that is minimized back to the maximized state + + /* This is now handled as part of the PropertyNotify + * Doing this here would inhibit the ability to restore a maximized window + * that is minimized back to the maximized state + */ + //xf_rail_send_client_system_command(xfi, window->windowId, SC_RESTORE); xfWindow *xfw = (xfWindow*) window->extra; xfw->is_mapped = TRUE; @@ -667,9 +672,12 @@ static BOOL xf_event_SelectionClear(xfInfo* xfi, XEvent* event, BOOL app) static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) { - //This section handles sending the appropriate commands to the rail server - //when the window has been minimized, maximized, restored locally - //ie. not using the buttons on the rail window itself + /* + * This section handles sending the appropriate commands to the rail server + * when the window has been minimized, maximized, restored locally + * ie. not using the buttons on the rail window itself + */ + if (app == TRUE) { rdpWindow* window; @@ -699,7 +707,7 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) DEBUG_X11_LMS("No return _NET_WM_STATE, window is not maximized"); } - for (i=0;idisplay, "_NET_WM_STATE_MAXIMIZED_VERT", False)) { @@ -722,11 +730,9 @@ static BOOL xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, BOOL app) } else { - //If the window is in the iconic state + /* If the window is in the iconic state */ if (((UINT32) *prop == 3)) - { minimized = TRUE; - } else minimized = FALSE; @@ -773,9 +779,10 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even switch (xfi->window->local_move.state) { case LMS_NOT_ACTIVE: - // No local move in progress, nothing to do + /* No local move in progress, nothing to do */ + + /* Prevent Configure from happening during indeterminant state of Horz or Vert Max only */ - //Prevent Configure from happening during indeterminant state of Horz or Vert Max only if ( (event->type == ConfigureNotify) && xfi->window->rail_ignore_configure) { DEBUG_X11_LMS("ConfigureNotify Event Ignored"); @@ -784,45 +791,41 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even } break; + case LMS_STARTING: - // Local move initiated by RDP server, but we - // have not yet seen any updates from the X server + /* Local move initiated by RDP server, but we have not yet seen any updates from the X server */ switch(event->type) { case ConfigureNotify: - // Starting to see move events - // from the X server. Local - // move is now in progress. + /* Starting to see move events from the X server. Local move is now in progress. */ xfi->window->local_move.state = LMS_ACTIVE; - // Allow these events to be processed during move to keep - // our state up to date. + /* Allow these events to be processed during move to keep our state up to date. */ break; case ButtonPress: case ButtonRelease: case KeyPress: case KeyRelease: case UnmapNotify: - // A button release event means the X - // window server did not grab the - // mouse before the user released it. - // In this case we must cancel the - // local move. The event will be - // processed below as normal, below. + /* + * A button release event means the X window server did not grab the + * mouse before the user released it. In this case we must cancel the + * local move. The event will be processed below as normal, below. + */ break; case VisibilityNotify: case PropertyNotify: case Expose: - // Allow these events to pass + /* Allow these events to pass */ break; default: - // Eat any other events + /* Eat any other events */ return TRUE; } break; case LMS_ACTIVE: - // Local move is in progress + /* Local move is in progress */ switch(event->type) { case ConfigureNotify: @@ -830,19 +833,18 @@ static BOOL xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*even case PropertyNotify: case Expose: case GravityNotify: - // Keep us up to date on position + /* Keep us up to date on position */ break; default: DEBUG_X11_LMS("Event Type to break LMS: %s", X11_EVENT_STRINGS[event->type]); - // Any other event terminates move + /* Any other event terminates move */ xf_rail_end_local_move(xfi, window); break; } break; case LMS_TERMINATING: - // Already sent RDP end move to sever - // Allow events to pass. + /* Already sent RDP end move to server. Allow events to pass. */ break; } @@ -859,11 +861,11 @@ BOOL xf_event_process(freerdp* instance, XEvent* event) if (xfi->remote_app) { - window = window_list_get_by_extra_id( - rail->list, (void*) event->xexpose.window); + window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window); + if (window) { - // Update "current" window for cursor change orders + /* Update "current" window for cursor change orders */ xfi->window = (xfWindow *) window->extra; if (xf_event_suppress_events(xfi, window, event)) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index d4a4da714..4ab82b1ec 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -65,6 +65,7 @@ COMMAND_LINE_ARGUMENT_A args[] = { "shell-dir", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Shell working directory" }, { "audio", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "Audio output mode" }, { "mic", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Audio input (microphone)" }, + { "clipboard", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect clipboard" }, { "fonts", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Smooth fonts (cleartype)" }, { "aero", COMMAND_LINE_VALUE_BOOL, NULL, NULL, BoolValueFalse, -1, NULL, "Desktop composition" }, { "window-drag", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Full window drag" }, @@ -644,6 +645,10 @@ int freerdp_client_parse_command_line_arguments(int argc, char** argv, rdpSettin { settings->CompressionEnabled = arg->Value ? TRUE : FALSE; } + CommandLineSwitchCase(arg, "clipboard") + { + settings->RedirectClipboard = arg->Value ? TRUE : FALSE; + } CommandLineSwitchCase(arg, "shell") { settings->AlternateShell = _strdup(arg->Value); @@ -857,6 +862,17 @@ int freerdp_client_load_addins(rdpChannels* channels, rdpSettings* settings) } } + if (settings->RedirectClipboard) + { + entry = freerdp_load_channel_addin_entry("cliprdr", NULL, NULL, 0); + + if (entry) + { + if (freerdp_channels_client_load(channels, settings, entry, settings) == 0) + printf("loading channel %s\n", "cliprdr"); + } + } + if (settings->RemoteApplicationMode) { entry = freerdp_load_channel_addin_entry("rail", NULL, NULL, 0); diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 778bde017..503034e2a 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -930,6 +930,12 @@ struct rdp_settings /* Parallel Port Redirection */ ALIGN64 BOOL RedirectParallelPorts; /* */ + /** + * Other Redirection + */ + + ALIGN64 BOOL RedirectClipboard; /* */ + /** * Static Virtual Channels */