VirtualBox

source: vbox/trunk/src/VBox/Main/src-client/RemoteUSBDeviceImpl.cpp@ 35650

Last change on this file since 35650 was 35638, checked in by vboxsync, 14 years ago

Main. QT/FE: fix long standing COM issue

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1/* $Id: RemoteUSBDeviceImpl.cpp 35638 2011-01-19 19:10:49Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox IHostUSBDevice COM interface implementation
6 * for remote (VRDP) USB devices
7 */
8
9/*
10 * Copyright (C) 2006-2008 Oracle Corporation
11 *
12 * This file is part of VirtualBox Open Source Edition (OSE), as
13 * available from http://www.virtualbox.org. This file is free software;
14 * you can redistribute it and/or modify it under the terms of the GNU
15 * General Public License (GPL) as published by the Free Software
16 * Foundation, in version 2 as it comes in the "COPYING" file of the
17 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19 */
20
21#include "RemoteUSBDeviceImpl.h"
22
23#include "AutoCaller.h"
24#include "Logging.h"
25
26#include <iprt/cpp/utils.h>
27
28#include <VBox/err.h>
29
30#include <VBox/RemoteDesktop/VRDE.h>
31#include <VBox/vrdpusb.h>
32
33// constructor / destructor
34/////////////////////////////////////////////////////////////////////////////
35
36DEFINE_EMPTY_CTOR_DTOR (RemoteUSBDevice)
37
38HRESULT RemoteUSBDevice::FinalConstruct()
39{
40 return BaseFinalConstruct();
41}
42
43void RemoteUSBDevice::FinalRelease()
44{
45 uninit();
46 BaseFinalRelease();
47}
48
49// public initializer/uninitializer for internal purposes only
50/////////////////////////////////////////////////////////////////////////////
51
52/** @todo (sunlover) REMOTE_USB Device states. */
53
54/**
55 * Initializes the remote USB device object.
56 */
57HRESULT RemoteUSBDevice::init (uint32_t u32ClientId, VRDEUSBDEVICEDESC *pDevDesc)
58{
59 LogFlowThisFunc(("u32ClientId=%d,pDevDesc=%p\n", u32ClientId, pDevDesc));
60
61 /* Enclose the state transition NotReady->InInit->Ready */
62 AutoInitSpan autoInitSpan(this);
63 AssertReturn(autoInitSpan.isOk(), E_FAIL);
64
65 unconst(mData.id).create();
66
67 unconst(mData.vendorId) = pDevDesc->idVendor;
68 unconst(mData.productId) = pDevDesc->idProduct;
69 unconst(mData.revision) = pDevDesc->bcdRev;
70
71 unconst(mData.manufacturer) = pDevDesc->oManufacturer? (char *)pDevDesc + pDevDesc->oManufacturer: "";
72 unconst(mData.product) = pDevDesc->oProduct? (char *)pDevDesc + pDevDesc->oProduct: "";
73 unconst(mData.serialNumber) = pDevDesc->oSerialNumber? (char *)pDevDesc + pDevDesc->oSerialNumber: "";
74
75 char id[64];
76 RTStrPrintf(id, sizeof (id), REMOTE_USB_BACKEND_PREFIX_S "0x%08X&0x%08X", pDevDesc->id, u32ClientId);
77 unconst(mData.address) = id;
78
79 unconst(mData.port) = pDevDesc->idPort;
80 unconst(mData.version) = pDevDesc->bcdUSB >> 8;
81 unconst(mData.portVersion) = mData.version; /** @todo fix this */
82
83 mData.state = USBDeviceState_Available;
84
85 mData.dirty = false;
86 unconst(mData.devId) = pDevDesc->id;
87
88 unconst(mData.clientId) = u32ClientId;
89
90 /* Confirm a successful initialization */
91 autoInitSpan.setSucceeded();
92
93 return S_OK;
94}
95
96
97/**
98 * Uninitializes the instance and sets the ready flag to FALSE.
99 * Called either from FinalRelease() or by the parent when it gets destroyed.
100 */
101void RemoteUSBDevice::uninit()
102{
103 LogFlowThisFunc(("\n"));
104
105 /* Enclose the state transition Ready->InUninit->NotReady */
106 AutoUninitSpan autoUninitSpan(this);
107 if (autoUninitSpan.uninitDone())
108 return;
109
110 unconst(mData.id).clear();
111
112 unconst(mData.vendorId) = 0;
113 unconst(mData.productId) = 0;
114 unconst(mData.revision) = 0;
115
116 unconst(mData.manufacturer).setNull();
117 unconst(mData.product).setNull();
118 unconst(mData.serialNumber).setNull();
119
120 unconst(mData.address).setNull();
121
122 unconst(mData.port) = 0;
123 unconst(mData.version) = 1;
124 unconst(mData.portVersion) = 1;
125
126 unconst(mData.dirty) = FALSE;
127
128 unconst(mData.devId) = 0;
129 unconst(mData.clientId) = 0;
130}
131
132// IUSBDevice properties
133/////////////////////////////////////////////////////////////////////////////
134
135STDMETHODIMP RemoteUSBDevice::COMGETTER(Id) (BSTR *aId)
136{
137 CheckComArgOutPointerValid(aId);
138
139 AutoCaller autoCaller(this);
140 if (FAILED(autoCaller.rc())) return autoCaller.rc();
141
142 /* this is const, no need to lock */
143 mData.id.toUtf16().detachTo(aId);
144
145 return S_OK;
146}
147
148STDMETHODIMP RemoteUSBDevice::COMGETTER(VendorId) (USHORT *aVendorId)
149{
150 CheckComArgOutPointerValid(aVendorId);
151
152 AutoCaller autoCaller(this);
153 if (FAILED(autoCaller.rc())) return autoCaller.rc();
154
155 /* this is const, no need to lock */
156 *aVendorId = mData.vendorId;
157
158 return S_OK;
159}
160
161STDMETHODIMP RemoteUSBDevice::COMGETTER(ProductId) (USHORT *aProductId)
162{
163 CheckComArgOutPointerValid(aProductId);
164
165 AutoCaller autoCaller(this);
166 if (FAILED(autoCaller.rc())) return autoCaller.rc();
167
168 /* this is const, no need to lock */
169 *aProductId = mData.productId;
170
171 return S_OK;
172}
173
174STDMETHODIMP RemoteUSBDevice::COMGETTER(Revision) (USHORT *aRevision)
175{
176 CheckComArgOutPointerValid(aRevision);
177
178 AutoCaller autoCaller(this);
179 if (FAILED(autoCaller.rc())) return autoCaller.rc();
180
181 /* this is const, no need to lock */
182 *aRevision = mData.revision;
183
184 return S_OK;
185}
186
187STDMETHODIMP RemoteUSBDevice::COMGETTER(Manufacturer) (BSTR *aManufacturer)
188{
189 CheckComArgOutPointerValid(aManufacturer);
190
191 AutoCaller autoCaller(this);
192 if (FAILED(autoCaller.rc())) return autoCaller.rc();
193
194 /* this is const, no need to lock */
195 mData.manufacturer.cloneTo(aManufacturer);
196
197 return S_OK;
198}
199
200STDMETHODIMP RemoteUSBDevice::COMGETTER(Product) (BSTR *aProduct)
201{
202 CheckComArgOutPointerValid(aProduct);
203
204 AutoCaller autoCaller(this);
205 if (FAILED(autoCaller.rc())) return autoCaller.rc();
206
207 /* this is const, no need to lock */
208 mData.product.cloneTo(aProduct);
209
210 return S_OK;
211}
212
213STDMETHODIMP RemoteUSBDevice::COMGETTER(SerialNumber) (BSTR *aSerialNumber)
214{
215 CheckComArgOutPointerValid(aSerialNumber);
216
217 AutoCaller autoCaller(this);
218 if (FAILED(autoCaller.rc())) return autoCaller.rc();
219
220 /* this is const, no need to lock */
221 mData.serialNumber.cloneTo(aSerialNumber);
222
223 return S_OK;
224}
225
226STDMETHODIMP RemoteUSBDevice::COMGETTER(Address) (BSTR *aAddress)
227{
228 CheckComArgOutPointerValid(aAddress);
229
230 AutoCaller autoCaller(this);
231 if (FAILED(autoCaller.rc())) return autoCaller.rc();
232
233 /* this is const, no need to lock */
234 mData.address.cloneTo(aAddress);
235
236 return S_OK;
237}
238
239STDMETHODIMP RemoteUSBDevice::COMGETTER(Port) (USHORT *aPort)
240{
241 CheckComArgOutPointerValid(aPort);
242
243 AutoCaller autoCaller(this);
244 if (FAILED(autoCaller.rc())) return autoCaller.rc();
245
246 /* this is const, no need to lock */
247 *aPort = mData.port;
248
249 return S_OK;
250}
251
252STDMETHODIMP RemoteUSBDevice::COMGETTER(Version) (USHORT *aVersion)
253{
254 CheckComArgOutPointerValid(aVersion);
255
256 AutoCaller autoCaller(this);
257 if (FAILED(autoCaller.rc())) return autoCaller.rc();
258
259 /* this is const, no need to lock */
260 *aVersion = mData.version;
261
262 return S_OK;
263}
264
265STDMETHODIMP RemoteUSBDevice::COMGETTER(PortVersion) (USHORT *aPortVersion)
266{
267 CheckComArgOutPointerValid(aPortVersion);
268
269 AutoCaller autoCaller(this);
270 if (FAILED(autoCaller.rc())) return autoCaller.rc();
271
272 /* this is const, no need to lock */
273 *aPortVersion = mData.portVersion;
274
275 return S_OK;
276}
277
278STDMETHODIMP RemoteUSBDevice::COMGETTER(Remote) (BOOL *aRemote)
279{
280 CheckComArgOutPointerValid(aRemote);
281
282 AutoCaller autoCaller(this);
283 if (FAILED(autoCaller.rc())) return autoCaller.rc();
284
285 /* RemoteUSBDevice is always remote. */
286 /* this is const, no need to lock */
287 *aRemote = TRUE;
288
289 return S_OK;
290}
291
292// IHostUSBDevice properties
293////////////////////////////////////////////////////////////////////////////////
294
295STDMETHODIMP RemoteUSBDevice::COMGETTER(State) (USBDeviceState_T *aState)
296{
297 CheckComArgOutPointerValid(aState);
298
299 AutoCaller autoCaller(this);
300 if (FAILED(autoCaller.rc())) return autoCaller.rc();
301
302 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
303
304 *aState = mData.state;
305
306 return S_OK;
307}
308
309// public methods only for internal purposes
310////////////////////////////////////////////////////////////////////////////////
311/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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