VirtualBox

source: vbox/trunk/src/VBox/Main/src-client/USBDeviceImpl.cpp@ 59341

Last change on this file since 59341 was 59117, checked in by vboxsync, 9 years ago

USB,Main: Rework USBProxyService. Split it into a USBProxyService and USBProxyBackend class, USBProxyService can use multiple USBProxyBackend instances as sources for USB devices to attach to a VM which will be used for USB/IP support. Change the PDM USB API to contain a backend parameter instead of a remote flag to indicate the USB backend to use for the given device.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 KB
Line 
1/* $Id: USBDeviceImpl.cpp 59117 2015-12-14 14:04:37Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2011 Oracle Corporation
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#include "USBDeviceImpl.h"
19
20#include "AutoCaller.h"
21#include "Logging.h"
22
23#include <iprt/cpp/utils.h>
24
25// constructor / destructor
26/////////////////////////////////////////////////////////////////////////////
27
28DEFINE_EMPTY_CTOR_DTOR (OUSBDevice)
29
30HRESULT OUSBDevice::FinalConstruct()
31{
32 return BaseFinalConstruct();
33}
34
35void OUSBDevice::FinalRelease()
36{
37 uninit ();
38 BaseFinalRelease();
39}
40
41// public initializer/uninitializer for internal purposes only
42/////////////////////////////////////////////////////////////////////////////
43
44/**
45 * Initializes the USB device object.
46 *
47 * @returns COM result indicator
48 * @param aUSBDevice The USB device (interface) to clone.
49 */
50HRESULT OUSBDevice::init(IUSBDevice *aUSBDevice)
51{
52 LogFlowThisFunc(("aUSBDevice=%p\n", aUSBDevice));
53
54 ComAssertRet(aUSBDevice, E_INVALIDARG);
55
56 /* Enclose the state transition NotReady->InInit->Ready */
57 AutoInitSpan autoInitSpan(this);
58 AssertReturn(autoInitSpan.isOk(), E_FAIL);
59
60 HRESULT hrc = aUSBDevice->COMGETTER(VendorId)(&unconst(mData.vendorId));
61 ComAssertComRCRet(hrc, hrc);
62 ComAssertRet(mData.vendorId, E_INVALIDARG);
63
64 hrc = aUSBDevice->COMGETTER(ProductId)(&unconst(mData.productId));
65 ComAssertComRCRet(hrc, hrc);
66
67 hrc = aUSBDevice->COMGETTER(Revision)(&unconst(mData.revision));
68 ComAssertComRCRet(hrc, hrc);
69
70 BSTR tmp;
71 BSTR *bptr = &tmp;
72
73 hrc = aUSBDevice->COMGETTER(Manufacturer)(bptr);
74 ComAssertComRCRet(hrc, hrc);
75 unconst(mData.manufacturer) = Utf8Str(tmp);
76
77 hrc = aUSBDevice->COMGETTER(Product)(bptr);
78 ComAssertComRCRet(hrc, hrc);
79 unconst(mData.product) = Utf8Str(tmp);
80
81 hrc = aUSBDevice->COMGETTER(SerialNumber)(bptr);
82 ComAssertComRCRet(hrc, hrc);
83 unconst(mData.serialNumber) = Utf8Str(tmp);
84
85 hrc = aUSBDevice->COMGETTER(Address)(bptr);
86 ComAssertComRCRet(hrc, hrc);
87 unconst(mData.address) = Utf8Str(tmp);
88
89 hrc = aUSBDevice->COMGETTER(Backend)(bptr);
90 ComAssertComRCRet(hrc, hrc);
91 unconst(mData.backend) = Utf8Str(tmp);
92
93 hrc = aUSBDevice->COMGETTER(Port)(&unconst(mData.port));
94 ComAssertComRCRet(hrc, hrc);
95
96 hrc = aUSBDevice->COMGETTER(Version)(&unconst(mData.version));
97 ComAssertComRCRet(hrc, hrc);
98
99 hrc = aUSBDevice->COMGETTER(PortVersion)(&unconst(mData.portVersion));
100 ComAssertComRCRet(hrc, hrc);
101
102 hrc = aUSBDevice->COMGETTER(Speed)(&unconst(mData.speed));
103 ComAssertComRCRet(hrc, hrc);
104
105 hrc = aUSBDevice->COMGETTER(Remote)(&unconst(mData.remote));
106 ComAssertComRCRet(hrc, hrc);
107
108 Bstr uuid;
109 hrc = aUSBDevice->COMGETTER(Id)(uuid.asOutParam());
110 ComAssertComRCRet(hrc, hrc);
111 unconst(mData.id) = Guid(uuid);
112
113 /* Confirm a successful initialization */
114 autoInitSpan.setSucceeded();
115
116 return S_OK;
117}
118
119/**
120 * Uninitializes the instance and sets the ready flag to FALSE.
121 * Called either from FinalRelease() or by the parent when it gets destroyed.
122 */
123void OUSBDevice::uninit()
124{
125 LogFlowThisFunc(("\n"));
126
127 /* Enclose the state transition Ready->InUninit->NotReady */
128 AutoUninitSpan autoUninitSpan(this);
129 if (autoUninitSpan.uninitDone())
130 return;
131
132 unconst(mData.id).clear();
133
134 unconst(mData.vendorId) = 0;
135 unconst(mData.productId) = 0;
136 unconst(mData.revision) = 0;
137
138 unconst(mData.manufacturer).setNull();
139 unconst(mData.product).setNull();
140 unconst(mData.serialNumber).setNull();
141
142 unconst(mData.address).setNull();
143 unconst(mData.backend).setNull();
144
145 unconst(mData.port) = 0;
146 unconst(mData.version) = 1;
147 unconst(mData.portVersion) = 1;
148
149 unconst(mData.remote) = FALSE;
150}
151
152// IUSBDevice properties
153/////////////////////////////////////////////////////////////////////////////
154
155/**
156 * Returns the GUID.
157 *
158 * @returns COM status code
159 * @param aId Address of result variable.
160 */
161HRESULT OUSBDevice::getId(com::Guid &aId)
162{
163 /* this is const, no need to lock */
164 aId = mData.id;
165
166 return S_OK;
167}
168
169
170/**
171 * Returns the vendor Id.
172 *
173 * @returns COM status code
174 * @param aVendorId Where to store the vendor id.
175 */
176HRESULT OUSBDevice::getVendorId(USHORT *aVendorId)
177{
178 /* this is const, no need to lock */
179 *aVendorId = mData.vendorId;
180
181 return S_OK;
182}
183
184
185/**
186 * Returns the product Id.
187 *
188 * @returns COM status code
189 * @param aProductId Where to store the product id.
190 */
191HRESULT OUSBDevice::getProductId(USHORT *aProductId)
192{
193 /* this is const, no need to lock */
194 *aProductId = mData.productId;
195
196 return S_OK;
197}
198
199
200/**
201 * Returns the revision BCD.
202 *
203 * @returns COM status code
204 * @param aRevision Where to store the revision BCD.
205 */
206HRESULT OUSBDevice::getRevision(USHORT *aRevision)
207{
208 /* this is const, no need to lock */
209 *aRevision = mData.revision;
210
211 return S_OK;
212}
213
214/**
215 * Returns the manufacturer string.
216 *
217 * @returns COM status code
218 * @param aManufacturer Where to put the return string.
219 */
220HRESULT OUSBDevice::getManufacturer(com::Utf8Str &aManufacturer)
221{
222 /* this is const, no need to lock */
223 aManufacturer = mData.manufacturer;
224
225 return S_OK;
226}
227
228
229/**
230 * Returns the product string.
231 *
232 * @returns COM status code
233 * @param aProduct Where to put the return string.
234 */
235HRESULT OUSBDevice::getProduct(com::Utf8Str &aProduct)
236{
237 /* this is const, no need to lock */
238 aProduct = mData.product;
239
240 return S_OK;
241}
242
243
244/**
245 * Returns the serial number string.
246 *
247 * @returns COM status code
248 * @param aSerialNumber Where to put the return string.
249 */
250HRESULT OUSBDevice::getSerialNumber(com::Utf8Str &aSerialNumber)
251{
252 /* this is const, no need to lock */
253 aSerialNumber = mData.serialNumber;
254
255 return S_OK;
256}
257
258
259/**
260 * Returns the host specific device address.
261 *
262 * @returns COM status code
263 * @param aAddress Where to put the return string.
264 */
265HRESULT OUSBDevice::getAddress(com::Utf8Str &aAddress)
266{
267 /* this is const, no need to lock */
268 aAddress = mData.address;
269
270 return S_OK;
271}
272
273HRESULT OUSBDevice::getPort(USHORT *aPort)
274{
275 /* this is const, no need to lock */
276 *aPort = mData.port;
277
278 return S_OK;
279}
280
281HRESULT OUSBDevice::getVersion(USHORT *aVersion)
282{
283 /* this is const, no need to lock */
284 *aVersion = mData.version;
285
286 return S_OK;
287}
288
289HRESULT OUSBDevice::getPortVersion(USHORT *aPortVersion)
290{
291 /* this is const, no need to lock */
292 *aPortVersion = mData.portVersion;
293
294 return S_OK;
295}
296
297HRESULT OUSBDevice::getSpeed(USBConnectionSpeed_T *aSpeed)
298{
299 /* this is const, no need to lock */
300 *aSpeed = mData.speed;
301
302 return S_OK;
303}
304
305HRESULT OUSBDevice::getRemote(BOOL *aRemote)
306{
307 /* this is const, no need to lock */
308 *aRemote = mData.remote;
309
310 return S_OK;
311}
312
313/**
314 * Returns the device specific backend.
315 *
316 * @returns COM status code
317 * @param aBackend Where to put the return string.
318 */
319HRESULT OUSBDevice::getBackend(com::Utf8Str &aBackend)
320{
321 /* this is const, no need to lock */
322 aBackend = mData.backend;
323
324 return S_OK;
325}
326
327// private methods
328/////////////////////////////////////////////////////////////////////////////
329/* 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