VirtualBox

source: vbox/trunk/src/VBox/Main/include/USBProxyService.h@ 5190

Last change on this file since 5190 was 4071, checked in by vboxsync, 17 years ago

Biggest check-in ever. New source code headers for all (C) innotek files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.2 KB
Line 
1/* $Id: USBProxyService.h 4071 2007-08-07 17:07:59Z vboxsync $ */
2/** @file
3 * VirtualBox USB Proxy Service (base) class.
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
18
19#ifndef ____H_USBPROXYSERVICE
20#define ____H_USBPROXYSERVICE
21
22#include "HostImpl.h"
23#include "HostUSBDeviceImpl.h"
24
25/**
26 * Base class for the USB Proxy service.
27 */
28class USBProxyService
29{
30public:
31 USBProxyService (Host *aHost);
32 virtual ~USBProxyService();
33
34 /**
35 * A filter was inserted / loaded.
36 *
37 * @param aFilter Pointer to the inserted filter.
38 * @return ID of the inserted filter
39 */
40#ifdef VBOX_WITH_USBFILTER
41 virtual void *insertFilter (PCUSBFILTER aFilter);
42#else
43 virtual void *insertFilter (IUSBDeviceFilter *aFilter);
44#endif
45
46 /**
47 * A filter was removed.
48 *
49 * @param aId ID of the filter to remove
50 */
51 virtual void removeFilter (void *aId);
52
53 /**
54 * A VM is trying to capture a device, do necessary preperations.
55 *
56 * @returns VBox status code.
57 * @param aDevice The device in question.
58 */
59 virtual int captureDevice (HostUSBDevice *aDevice);
60
61 /**
62 * The device is going to be detached from a VM.
63 *
64 * @param aDevice The device in question.
65 */
66 virtual void detachingDevice (HostUSBDevice *aDevice);
67
68 /**
69 * A VM is releasing a device back to the host.
70 *
71 * @returns VBox status code.
72 * @param aDevice The device in question.
73 */
74 virtual int releaseDevice (HostUSBDevice *aDevice);
75
76 /**
77 * Updates the device state.
78 * This is responsible for calling HostUSBDevice::updateState() and check for async completion.
79 *
80 * @returns true if there is a state change.
81 * @param aDevice The device in question.
82 * @param aUSBDevice The USB device structure for the last enumeration.
83 */
84 virtual bool updateDeviceState (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
85
86 /**
87 * Add device notification hook for the OS specific code.
88 *
89 * @param aDevice The device in question.
90 * @param aUSBDevice The USB device structure.
91 */
92 virtual void deviceAdded (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
93
94 /**
95 * Remove device notification hook for the OS specific code.
96 *
97 * @param aDevice The device in question.
98 */
99 virtual void deviceRemoved (HostUSBDevice *aDevice);
100
101 /**
102 * Query if the service is active and working.
103 *
104 * @returns true if the service is up running.
105 * @returns false if the service isn't running.
106 */
107 bool isActive (void);
108
109 /**
110 * Get last error.
111 * Can be used to check why the proxy !isActive() upon construction.
112 *
113 * @returns VBox status code.
114 */
115 int getLastError (void);
116
117 /**
118 * Calculate the hash of the serial string.
119 *
120 * 64bit FNV1a, chosen because it is designed to hash in to a power of two
121 * space, and is much quicker and simpler than, say, a half MD4.
122 *
123 * @returns the hash.
124 * @param aSerial The serial string.
125 */
126 static uint64_t calcSerialHash (const char *aSerial);
127
128#ifdef VBOX_WITH_USBFILTER
129 /**
130 * Initializes a filter with the data from the specified device.
131 *
132 * @param aFilter The filter to fill.
133 * @param aDevice The device to fill it with.
134 */
135 static void initFilterFromDevice (PUSBFILTER aFilter, HostUSBDevice *aDevice);
136#endif
137
138protected:
139
140 /**
141 * Starts the service.
142 *
143 * @returns VBox status.
144 */
145 int start (void);
146
147 /**
148 * Stops the service.
149 *
150 * @returns VBox status.
151 */
152 int stop (void);
153
154 /**
155 * Wait for a change in the USB devices attached to the host.
156 *
157 * @returns VBox status (ignored).
158 * @param aMillies Number of milliseconds to wait.
159 */
160 virtual int wait (unsigned aMillies);
161
162 /**
163 * Interrupt any wait() call in progress.
164 *
165 * @returns VBox status.
166 */
167 virtual int interruptWait (void);
168
169 /**
170 * Get a list of USB device currently attached to the host.
171 *
172 * @returns Pointer to a list of USB devices.
173 * The list nodes are freed individually by calling freeDevice().
174 */
175 virtual PUSBDEVICE getDevices (void);
176
177 /**
178 * First call made on the service thread, use it to do
179 * thread initialization.
180 */
181 virtual void serviceThreadInit (void);
182
183 /**
184 * First call made on the service thread, use it to do
185 * thread termination.
186 */
187 virtual void serviceThreadTerm (void);
188
189 /**
190 * Implement fake capture, ++.
191 *
192 * @returns true if there is a state change.
193 * @param pDevice The device in question.
194 * @param pUSBDevice The USB device structure for the last enumeration.
195 */
196 bool updateDeviceStateFake (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
197
198
199public:
200 /**
201 * Free all the members of a USB device returned by getDevice().
202 *
203 * @param pDevice Pointer to the device.
204 */
205 static void freeDeviceMembers (PUSBDEVICE pDevice);
206
207 /**
208 * Free one USB device returned by getDevice().
209 *
210 * @param pDevice Pointer to the device.
211 */
212 static void freeDevice (PUSBDEVICE pDevice);
213
214private:
215 /**
216 * Process any relevant changes in the attached USB devices.
217 */
218 void processChanges (void);
219
220 /**
221 * The service thread created by start().
222 *
223 * @param Thread The thread handle.
224 * @param pvUser Pointer to the USBProxyService instance.
225 */
226 static DECLCALLBACK (int) serviceThread (RTTHREAD Thread, void *pvUser);
227
228protected:
229 /** Pointer to the Host object. */
230 Host *mHost;
231 /** Thread handle of the service thread. */
232 RTTHREAD mThread;
233 /** Flag which stop() sets to cause serviceThread to return. */
234 bool volatile mTerminate;
235 /** List of smart HostUSBDevice pointers. */
236 typedef std::list <ComObjPtr <HostUSBDevice> > HostUSBDeviceList;
237 /** List of the known USB devices. */
238 HostUSBDeviceList mDevices;
239 /** VBox status code of the last failure.
240 * (Only used by start(), stop() and the child constructors.) */
241 int mLastError;
242};
243
244
245#ifdef VBOX_WITH_USB
246
247# ifdef RT_OS_DARWIN
248# include <VBox/param.h>
249# undef PAGE_SHIFT
250# undef PAGE_SIZE
251# define OSType Carbon_OSType
252# include <Carbon/Carbon.h>
253# undef OSType
254
255/**
256 * The Darwin hosted USB Proxy Service.
257 */
258class USBProxyServiceDarwin : public USBProxyService
259{
260public:
261 USBProxyServiceDarwin (Host *aHost);
262 ~USBProxyServiceDarwin();
263
264#ifdef VBOX_WITH_USBFILTER
265 virtual void *insertFilter (PCUSBFILTER aFilter);
266 virtual void removeFilter (void *aId);
267#endif
268
269 virtual int captureDevice (HostUSBDevice *aDevice);
270 virtual void detachingDevice (HostUSBDevice *aDevice);
271 virtual int releaseDevice (HostUSBDevice *aDevice);
272 virtual bool updateDeviceState (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
273
274protected:
275 virtual int wait (unsigned aMillies);
276 virtual int interruptWait (void);
277 virtual PUSBDEVICE getDevices (void);
278 virtual void serviceThreadInit (void);
279 virtual void serviceThreadTerm (void);
280
281private:
282 /** Reference to the runloop of the service thread.
283 * This is NULL if the service thread isn't running. */
284 CFRunLoopRef mServiceRunLoopRef;
285 /** The opaque value returned by DarwinSubscribeUSBNotifications. */
286 void *mNotifyOpaque;
287 /** A hack to work around the problem with the usb device enumeration
288 * not including newly attached devices. */
289 bool mWaitABitNextTime;
290#ifndef VBOX_WITH_USBFILTER
291 /** Whether we've got a fake async event and should return without entering the runloop. */
292 bool volatile mFakeAsync;
293#endif
294 /** Whether we've successfully initialized the USBLib and should call USBLibTerm in the destructor. */
295 bool mUSBLibInitialized;
296};
297# endif /* RT_OS_DARWIN */
298
299
300# ifdef RT_OS_LINUX
301# include <stdio.h>
302
303/**
304 * The Linux hosted USB Proxy Service.
305 */
306class USBProxyServiceLinux : public USBProxyService
307{
308public:
309 USBProxyServiceLinux (Host *aHost, const char *aUsbfsRoot = "/proc/bus/usb");
310 ~USBProxyServiceLinux();
311
312 virtual int captureDevice (HostUSBDevice *aDevice);
313 virtual int releaseDevice (HostUSBDevice *aDevice);
314 virtual bool updateDeviceState (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
315 virtual void deviceAdded (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
316
317protected:
318 virtual int wait (unsigned aMillies);
319 virtual int interruptWait (void);
320 virtual PUSBDEVICE getDevices (void);
321 int addDeviceToChain (PUSBDEVICE pDev, PUSBDEVICE *ppFirst, PUSBDEVICE **pppNext, int rc);
322
323private:
324 /** File handle to the '/proc/bus/usb/devices' file. */
325 RTFILE mFile;
326 /** Stream for mFile. */
327 FILE *mStream;
328 /** Pipe used to interrupt wait(), the read end. */
329 RTFILE mWakeupPipeR;
330 /** Pipe used to interrupt wait(), the write end. */
331 RTFILE mWakeupPipeW;
332 /** The root of usbfs. */
333 Utf8Str mUsbfsRoot;
334 /** Number of 500ms polls left to do. See usbDeterminState for details. */
335 unsigned mUdevPolls;
336};
337# endif /* RT_OS_LINUX */
338
339
340# ifdef RT_OS_WINDOWS
341/**
342 * The Win32 hosted USB Proxy Service.
343 */
344class USBProxyServiceWin32 : public USBProxyService
345{
346public:
347 USBProxyServiceWin32 (Host *aHost);
348 ~USBProxyServiceWin32();
349
350 virtual void *insertFilter (IUSBDeviceFilter *aFilter);
351 virtual void removeFilter (void *aID);
352
353 virtual int captureDevice (HostUSBDevice *aDevice);
354 virtual int releaseDevice (HostUSBDevice *aDevice);
355 virtual bool updateDeviceState (HostUSBDevice *aDevice, PUSBDEVICE aUSBDevice);
356
357protected:
358 virtual int wait (unsigned aMillies);
359 virtual int interruptWait (void);
360 virtual PUSBDEVICE getDevices (void);
361
362private:
363
364 HANDLE hEventInterrupt;
365};
366# endif /* RT_OS_WINDOWS */
367
368#endif /* VBOX_WITH_USB */
369
370
371#endif /* !____H_USBPROXYSERVICE */
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