VirtualBox

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

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

Drop holdDevice(). darwin changes.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.8 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 RT_OS_LINUX
180 friend class USBProxyServiceLinux;
181#endif
182#ifdef RT_OS_DARWIN
183 /** One-shot filter id. */
184 void *mOneShotId;
185
186 friend class USBProxyServiceDarwin;
187#endif
188};
189
190
191COM_DECL_READONLY_ENUM_AND_COLLECTION_BEGIN (HostUSBDevice)
192
193 STDMETHOD(FindById) (INPTR GUIDPARAM aId, IHostUSBDevice **aDevice)
194 {
195 Guid idToFind = aId;
196 if (idToFind.isEmpty())
197 return E_INVALIDARG;
198 if (!aDevice)
199 return E_POINTER;
200
201 *aDevice = NULL;
202 Vector::value_type found;
203 Vector::iterator it = vec.begin();
204 while (!found && it != vec.end())
205 {
206 Guid id;
207 (*it)->COMGETTER(Id) (id.asOutParam());
208 if (id == idToFind)
209 found = *it;
210 ++ it;
211 }
212
213 if (!found)
214 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
215 "Could not find a USB device with UUID {%s}"),
216 idToFind.toString().raw());
217
218 return found.queryInterfaceTo (aDevice);
219 }
220
221 STDMETHOD(FindByAddress) (INPTR BSTR aAddress, IHostUSBDevice **aDevice)
222 {
223 if (!aAddress)
224 return E_INVALIDARG;
225 if (!aDevice)
226 return E_POINTER;
227
228 *aDevice = NULL;
229 Vector::value_type found;
230 Vector::iterator it = vec.begin();
231 while (!found && it != vec.end())
232 {
233 Bstr address;
234 (*it)->COMGETTER(Address) (address.asOutParam());
235 if (address == aAddress)
236 found = *it;
237 ++ it;
238 }
239
240 if (!found)
241 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
242 "Could not find a USB device with address '%ls'"),
243 aAddress);
244
245 return found.queryInterfaceTo (aDevice);
246 }
247
248COM_DECL_READONLY_ENUM_AND_COLLECTION_END (HostUSBDevice)
249
250
251#endif // ____H_HOSTUSBDEVICEIMPL
Note: See TracBrowser for help on using the repository browser.

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