VirtualBox

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

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

First part of fix for udevd::chmod vs. VBoxSVC race on attach.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.1 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 // public methods only for internal purposes
86
87 /* @note Must be called from under the object read lock. */
88 const Guid &id() const { return mId; }
89
90 /* @note Must be called from under the object read lock. */
91 USBDeviceState_T state() const { return mState; }
92
93 /* @note Must be called from under the object read lock. */
94 USBDeviceState_T pendingState() const { return mPendingState; }
95
96 /* @note Must be called from under the object read lock. */
97 ComObjPtr <SessionMachine> &machine() { return mMachine; }
98
99 /* @note Must be called from under the object read lock. */
100 bool isStatePending() const { return mIsStatePending; }
101
102 /* @note Must be called from under the object read lock. */
103 PCUSBDEVICE usbData() const { return mUsb; }
104
105 Utf8Str name();
106
107 bool requestCapture (SessionMachine *aMachine);
108 void requestRelease();
109 void requestHold();
110
111 void setHeld();
112 void reset();
113
114 void handlePendingStateChange();
115 void cancelPendingState();
116
117 bool isMatch (const USBDeviceFilter::Data &aData);
118
119 int compare (PCUSBDEVICE aDev2);
120 static int compare (PCUSBDEVICE aDev1, PCUSBDEVICE aDev2,
121 bool aIsStrict = true);
122
123 bool updateState (PCUSBDEVICE aDev);
124
125 // for VirtualBoxSupportErrorInfoImpl
126 static const wchar_t *getComponentName() { return L"HostUSBDevice"; }
127
128private:
129
130 const Guid mId;
131 USBDeviceState_T mState;
132 USBDeviceState_T mPendingState;
133 ComObjPtr <SessionMachine> mMachine;
134 bool mIsStatePending : 1;
135
136 /** Pointer to the USB Proxy Service instance. */
137 USBProxyService *mUSBProxyService;
138
139 /** Pointer to the USB Device structure owned by this device.
140 * Only used for host devices. */
141 PUSBDEVICE mUsb;
142
143 friend class USBProxyService;
144#ifdef __LINUX__
145 friend class USBProxyServiceLinux;
146#endif
147};
148
149
150COM_DECL_READONLY_ENUM_AND_COLLECTION_BEGIN (HostUSBDevice)
151
152 STDMETHOD(FindById) (INPTR GUIDPARAM aId, IHostUSBDevice **aDevice)
153 {
154 Guid idToFind = aId;
155 if (idToFind.isEmpty())
156 return E_INVALIDARG;
157 if (!aDevice)
158 return E_POINTER;
159
160 *aDevice = NULL;
161 Vector::value_type found;
162 Vector::iterator it = vec.begin();
163 while (!found && it != vec.end())
164 {
165 Guid id;
166 (*it)->COMGETTER(Id) (id.asOutParam());
167 if (id == idToFind)
168 found = *it;
169 ++ it;
170 }
171
172 if (!found)
173 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
174 "Could not find a USB device with UUID {%s}"),
175 idToFind.toString().raw());
176
177 return found.queryInterfaceTo (aDevice);
178 }
179
180 STDMETHOD(FindByAddress) (INPTR BSTR aAddress, IHostUSBDevice **aDevice)
181 {
182 if (!aAddress)
183 return E_INVALIDARG;
184 if (!aDevice)
185 return E_POINTER;
186
187 *aDevice = NULL;
188 Vector::value_type found;
189 Vector::iterator it = vec.begin();
190 while (!found && it != vec.end())
191 {
192 Bstr address;
193 (*it)->COMGETTER(Address) (address.asOutParam());
194 if (address == aAddress)
195 found = *it;
196 ++ it;
197 }
198
199 if (!found)
200 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
201 "Could not find a USB device with address '%ls'"),
202 aAddress);
203
204 return found.queryInterfaceTo (aDevice);
205 }
206
207COM_DECL_READONLY_ENUM_AND_COLLECTION_END (HostUSBDevice)
208
209
210#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