VirtualBox

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

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

Main: Preparations for async USB handling.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1/** @file
2 *
3 * VirtualBox IHostUSBDevice COM interface implementation
4 */
5
6/*
7 * Copyright (C) 2006 InnoTek Systemberatung 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, ComWeakRef> &machine() { return mMachine; }
98
99/// @todo remove
100#if 0
101 /* @note Must be called from under the object read lock. */
102 bool isIgnored() { return mIgnored; }
103#endif
104
105 /* @note Must be called from under the object read lock. */
106 bool isStatePending() const { return mIsStatePending; }
107
108 /* @note Must be called from under the object read lock. */
109 PCUSBDEVICE usbData() const { return mUsb; }
110
111 Utf8Str name();
112
113/// @todo remove
114#if 0
115 void setIgnored();
116#endif
117
118 bool setCaptured (SessionMachine *aMachine);
119 int setHostDriven();
120 int reset();
121
122/// @todo remove
123#if 0
124 void setHostState (USBDeviceState_T aState);
125#endif
126
127 bool isMatch (const USBDeviceFilter::Data &aData);
128
129 int compare (PCUSBDEVICE pDev2);
130 static int compare (PCUSBDEVICE pDev1, PCUSBDEVICE pDev2);
131
132 bool updateState (PCUSBDEVICE aDev);
133
134 // for VirtualBoxSupportErrorInfoImpl
135 static const wchar_t *getComponentName() { return L"HostUSBDevice"; }
136
137private:
138
139 const Guid mId;
140 USBDeviceState_T mState;
141 USBDeviceState_T mPendingState;
142 ComObjPtr <SessionMachine, ComWeakRef> mMachine;
143 bool mIsStatePending : 1;
144/// @todo remove
145#if 0
146 bool mIgnored : 1;
147#endif
148
149 /** Pointer to the USB Proxy Service instance. */
150 USBProxyService *mUSBProxyService;
151
152 /** Pointer to the USB Device structure owned by this device.
153 * Only used for host devices. */
154 PUSBDEVICE mUsb;
155};
156
157
158COM_DECL_READONLY_ENUM_AND_COLLECTION_BEGIN (HostUSBDevice)
159
160 STDMETHOD(FindById) (INPTR GUIDPARAM aId, IHostUSBDevice **aDevice)
161 {
162 Guid idToFind = aId;
163 if (idToFind.isEmpty())
164 return E_INVALIDARG;
165 if (!aDevice)
166 return E_POINTER;
167
168 *aDevice = NULL;
169 Vector::value_type found;
170 Vector::iterator it = vec.begin();
171 while (!found && it != vec.end())
172 {
173 Guid id;
174 (*it)->COMGETTER(Id) (id.asOutParam());
175 if (id == idToFind)
176 found = *it;
177 ++ it;
178 }
179
180 if (!found)
181 return setError (E_INVALIDARG, HostUSBDeviceCollection::tr (
182 "Could not find a USB device with UUID {%s}"),
183 idToFind.toString().raw());
184
185 return found.queryInterfaceTo (aDevice);
186 }
187
188 STDMETHOD(FindByAddress) (INPTR BSTR aAddress, IHostUSBDevice **aDevice)
189 {
190 if (!aAddress)
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 Bstr address;
201 (*it)->COMGETTER(Address) (address.asOutParam());
202 if (address == aAddress)
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 address '%ls'"),
210 aAddress);
211
212 return found.queryInterfaceTo (aDevice);
213 }
214
215COM_DECL_READONLY_ENUM_AND_COLLECTION_END (HostUSBDevice)
216
217
218#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