VirtualBox

source: vbox/trunk/src/VBox/Main/include/HostUSBDeviceImpl.h@ 3566

Last change on this file since 3566 was 3566, checked in by vboxsync, 18 years ago

Async USB detach (for darwin) with async operation timeout (not enabled on windows). Drop the USBProxyService::reset method. (Hope I didn't break anything, it's only tested on Darwin...)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1/** @file
2 *
3 * VirtualBox IHostUSBDevice COM interface implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * If you received this file as part of a commercial VirtualBox
18 * distribution, then only the terms of your commercial VirtualBox
19 * license agreement apply instead of the previous paragraph.
20 */
21
22#ifndef ____H_HOSTUSBDEVICEIMPL
23#define ____H_HOSTUSBDEVICEIMPL
24
25#include "VirtualBoxBase.h"
26#include "USBDeviceFilterImpl.h"
27/* #include "USBProxyService.h" circular on Host/HostUSBDevice, the includer
28 * must include this. */
29#include "Collection.h"
30
31#include <VBox/usb.h>
32
33class SessionMachine;
34class USBProxyService;
35
36/**
37 * Object class used to hold Host USB Device properties.
38 */
39class ATL_NO_VTABLE HostUSBDevice :
40 public VirtualBoxBaseNEXT,
41 public VirtualBoxSupportErrorInfoImpl <HostUSBDevice, IHostUSBDevice>,
42 public VirtualBoxSupportTranslation <HostUSBDevice>,
43 public IHostUSBDevice
44{
45public:
46
47 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT (HostUSBDevice)
48
49 DECLARE_NOT_AGGREGATABLE(HostUSBDevice)
50
51 DECLARE_PROTECT_FINAL_CONSTRUCT()
52
53 BEGIN_COM_MAP(HostUSBDevice)
54 COM_INTERFACE_ENTRY(ISupportErrorInfo)
55 COM_INTERFACE_ENTRY(IHostUSBDevice)
56 COM_INTERFACE_ENTRY(IUSBDevice)
57 END_COM_MAP()
58
59 NS_DECL_ISUPPORTS
60
61 DECLARE_EMPTY_CTOR_DTOR (HostUSBDevice)
62
63 HRESULT FinalConstruct();
64 void FinalRelease();
65
66 // public initializer/uninitializer for internal purposes only
67 HRESULT init(PUSBDEVICE aUsb, USBProxyService *aUSBProxyService);
68 void uninit();
69
70 // IUSBDevice properties
71 STDMETHOD(COMGETTER(Id))(GUIDPARAMOUT aId);
72 STDMETHOD(COMGETTER(VendorId))(USHORT *aVendorId);
73 STDMETHOD(COMGETTER(ProductId))(USHORT *aProductId);
74 STDMETHOD(COMGETTER(Revision))(USHORT *aRevision);
75 STDMETHOD(COMGETTER(Manufacturer))(BSTR *aManufacturer);
76 STDMETHOD(COMGETTER(Product))(BSTR *aProduct);
77 STDMETHOD(COMGETTER(SerialNumber))(BSTR *aSerialNumber);
78 STDMETHOD(COMGETTER(Address))(BSTR *aAddress);
79 STDMETHOD(COMGETTER(Port))(USHORT *aPort);
80 STDMETHOD(COMGETTER(Remote))(BOOL *aRemote);
81
82 // IHostUSBDevice properties
83 STDMETHOD(COMGETTER(State))(USBDeviceState_T *aState);
84
85 /** Additional internal states.
86 * The async detach stuff for Darwin is a two stage journey with a variation
87 * (filters) depending on who won the race to lock the Host object.
88 *
89 * @remark Trying out mac os x style enum naming convention here. nice or what?
90 */
91 typedef enum
92 {
93 /** Nothing is pending here, check mPendingState. */
94 kNothingPending,
95 /** 1st stage of the detch, waiting for the logical detach notification. */
96 kDetachingPendingDetach,
97 /** 1st stage of the detch, waiting for the logical detach notification - re-run filters.
98 * Prev: kDetachingPendingDetach */
99 kDetachingPendingDetachFilters,
100 /** 2nd stage of the detach, waiting for the logical attach notification.
101 * Prev: kDetachingPendingDetach */
102 kDetachingPendingAttach,
103 /** 2nd stage of the detach, waiting for the logical attach notification - re-run filters.
104 * Prev: kDetachingPendingDetachFilters */
105 kDetachingPendingAttachFilters
106 } InternalState;
107
108 // public methods only for internal purposes
109
110 /** @note Must be called from under the object read lock. */
111 const Guid &id() const { return mId; }
112
113 /** @note Must be called from under the object read lock. */
114 USBDeviceState_T state() const { return mState; }
115
116 /** @note Must be called from under the object read lock. */
117 USBDeviceState_T pendingState() const { return mPendingState; }
118
119 /** @note Must be called from under the object read lock. */
120 InternalState pendingStateEx() const { return mPendingStateEx; }
121
122 /** @note Must be called from under the object read lock. */
123 ComObjPtr <SessionMachine> &machine() { return mMachine; }
124
125 /** @note Must be called from under the object read lock. */
126 bool isStatePending() const { return mIsStatePending; }
127
128 /** @note Must be called from under the object read lock. */
129 PCUSBDEVICE usbData() const { return mUsb; }
130
131 Utf8Str name();
132
133 bool requestCapture (SessionMachine *aMachine);
134 void requestRelease();
135 void requestHold();
136
137 void setHeld();
138 void onDetachedPhys();
139
140 void handlePendingStateChange();
141 void cancelPendingState(bool aTimeout = false);
142
143 bool isMatch (const USBDeviceFilter::Data &aData);
144
145 int compare (PCUSBDEVICE aDev2);
146 static int compare (PCUSBDEVICE aDev1, PCUSBDEVICE aDev2,
147 bool aIsStrict = true);
148
149 bool updateState (PCUSBDEVICE aDev);
150
151 void checkForAsyncTimeout();
152
153 bool setLogicalReconnect (InternalState aStage);
154
155 // for VirtualBoxSupportErrorInfoImpl
156 static const wchar_t *getComponentName() { return L"HostUSBDevice"; }
157
158private:
159
160 const Guid mId;
161 USBDeviceState_T mState;
162 USBDeviceState_T mPendingState;
163 /** Same as mPendingState but for the internal states. */
164 InternalState mPendingStateEx;
165 /** RTTimeNanoTS() of when mIsStatePending was set or mDetaching changed
166 * from kNotDetaching. For operations that cannot be cancelled it's 0. */
167 uint64_t mPendingSince;
168 ComObjPtr <SessionMachine> mMachine;
169 bool mIsStatePending : 1;
170
171 /** Pointer to the USB Proxy Service instance. */
172 USBProxyService *mUSBProxyService;
173
174 /** Pointer to the USB Device structure owned by this device.
175 * Only used for host devices. */
176 PUSBDEVICE mUsb;
177
178 friend class USBProxyService;
179#ifdef __LINUX__
180 friend class USBProxyServiceLinux;
181#endif
182};
183
184
185COM_DECL_READONLY_ENUM_AND_COLLECTION_BEGIN (HostUSBDevice)
186
187 STDMETHOD(FindById) (INPTR GUIDPARAM aId, IHostUSBDevice **aDevice)
188 {
189 Guid idToFind = aId;
190 if (idToFind.isEmpty())
191 return E_INVALIDARG;
192 if (!aDevice)
193 return E_POINTER;
194
195 *aDevice = NULL;
196 Vector::value_type found;
197 Vector::iterator it = vec.begin();
198 while (!found && it != vec.end())
199 {
200 Guid id;
201 (*it)->COMGETTER(Id) (id.asOutParam());
202 if (id == idToFind)
203 found = *it;
204 ++ it;
205 }
206
207 if (!found)
208 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
209 "Could not find a USB device with UUID {%s}"),
210 idToFind.toString().raw());
211
212 return found.queryInterfaceTo (aDevice);
213 }
214
215 STDMETHOD(FindByAddress) (INPTR BSTR aAddress, IHostUSBDevice **aDevice)
216 {
217 if (!aAddress)
218 return E_INVALIDARG;
219 if (!aDevice)
220 return E_POINTER;
221
222 *aDevice = NULL;
223 Vector::value_type found;
224 Vector::iterator it = vec.begin();
225 while (!found && it != vec.end())
226 {
227 Bstr address;
228 (*it)->COMGETTER(Address) (address.asOutParam());
229 if (address == aAddress)
230 found = *it;
231 ++ it;
232 }
233
234 if (!found)
235 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
236 "Could not find a USB device with address '%ls'"),
237 aAddress);
238
239 return found.queryInterfaceTo (aDevice);
240 }
241
242COM_DECL_READONLY_ENUM_AND_COLLECTION_END (HostUSBDevice)
243
244
245#endif // ____H_HOSTUSBDEVICEIMPL
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette