From 34498d4064172b2f5722a73da273bf356aab6b53 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Tue, 3 Mar 2020 11:09:27 +0100 Subject: [PATCH] URBDRC: Only mark closed if control is closed. --- channels/urbdrc/client/libusb/libusb_udevice.c | 9 +++++++-- channels/urbdrc/client/libusb/libusb_udevman.c | 1 + channels/urbdrc/client/urbdrc_main.c | 10 +++++++++- channels/urbdrc/client/urbdrc_main.h | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/channels/urbdrc/client/libusb/libusb_udevice.c b/channels/urbdrc/client/libusb/libusb_udevice.c index ab53556d9..94117bcf3 100644 --- a/channels/urbdrc/client/libusb/libusb_udevice.c +++ b/channels/urbdrc/client/libusb/libusb_udevice.c @@ -1014,11 +1014,16 @@ static int libusb_udev_is_exist(IUDEVICE* idev) static int libusb_udev_is_channel_closed(IUDEVICE* idev) { UDEVICE* pdev = (UDEVICE*)idev; + IUDEVMAN* udevman; if (!pdev || !pdev->urbdrc) return 1; - if (pdev->urbdrc->status & URBDRC_DEVICE_CHANNEL_CLOSED) - return 1; + udevman = pdev->urbdrc->udevman; + if (udevman) + { + if (udevman->status & URBDRC_DEVICE_CHANNEL_CLOSED) + return 1; + } if (pdev->status & URBDRC_DEVICE_CHANNEL_CLOSED) return 1; diff --git a/channels/urbdrc/client/libusb/libusb_udevman.c b/channels/urbdrc/client/libusb/libusb_udevman.c index db4567386..a259ad1a9 100644 --- a/channels/urbdrc/client/libusb/libusb_udevman.c +++ b/channels/urbdrc/client/libusb/libusb_udevman.c @@ -645,6 +645,7 @@ static BOOL udevman_initialize(IUDEVMAN* idevman, UINT32 channelId) if (!udevman) return FALSE; + idevman->status &= ~URBDRC_DEVICE_CHANNEL_CLOSED; idevman->controlChannelId = channelId; return TRUE; } diff --git a/channels/urbdrc/client/urbdrc_main.c b/channels/urbdrc/client/urbdrc_main.c index ce7a9c729..cf5673473 100644 --- a/channels/urbdrc/client/urbdrc_main.c +++ b/channels/urbdrc/client/urbdrc_main.c @@ -612,7 +612,15 @@ static UINT urbdrc_on_close(IWTSVirtualChannelCallback* pChannelCallback) { URBDRC_PLUGIN* urbdrc = (URBDRC_PLUGIN*)callback->plugin; if (urbdrc) - urbdrc->status |= URBDRC_DEVICE_CHANNEL_CLOSED; + { + IUDEVMAN* udevman = urbdrc->udevman; + if (udevman && callback->channel_mgr) + { + UINT32 control = callback->channel_mgr->GetChannelId(callback->channel); + if (udevman->controlChannelId == control) + udevman->status |= URBDRC_DEVICE_CHANNEL_CLOSED; + } + } } free(callback); return CHANNEL_RC_OK; diff --git a/channels/urbdrc/client/urbdrc_main.h b/channels/urbdrc/client/urbdrc_main.h index ca6ab1fcd..5ec839983 100644 --- a/channels/urbdrc/client/urbdrc_main.h +++ b/channels/urbdrc/client/urbdrc_main.h @@ -83,7 +83,6 @@ struct _URBDRC_PLUGIN UINT32 vchannel_status; char* subsystem; - UINT32 status; wLog* log; }; @@ -220,6 +219,7 @@ struct _IUDEVMAN IWTSPlugin* plugin; UINT32 controlChannelId; + UINT32 status; }; enum