VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxBFE/USBProxyService.h@ 29809

Last change on this file since 29809 was 28800, checked in by vboxsync, 15 years ago

Automated rebranding to Oracle copyright/license strings via filemuncher

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1/** @file
2 *
3 * VBox frontends: Basic Frontend (BFE):
4 * Declaration of USBProxyService and USBProxyServiceLinux classes
5 */
6
7/*
8 * Copyright (C) 2006-2007 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#ifndef ____H_USBPROXYSERVICE
20#define ____H_USBPROXYSERVICE
21
22#ifndef VBOXBFE_WITH_USB
23# error "misconfiguration VBOXBFE_WITH_USB isn't defined and USBProxyService.h was included."
24#endif
25
26#include "HostUSBImpl.h"
27#include "HostUSBDeviceImpl.h"
28
29/**
30 * Base class for the USB Proxy service.
31 */
32class USBProxyService
33{
34public:
35 USBProxyService (HostUSB *aHost);
36 virtual ~USBProxyService();
37
38 /**
39 * A VM is trying to capture a device, do necessary preperations.
40 *
41 * @returns VBox status code.
42 * @param pDevice The device in question.
43 */
44 virtual int captureDevice (HostUSBDevice *pDevice);
45
46 /**
47 * The device is to be held so that the host OS will not start using it.
48 *
49 * @returns VBox status code.
50 * @param pDevice The device in question.
51 */
52 virtual int holdDevice (HostUSBDevice *pDevice);
53
54 /**
55 * A VM is releasing a device back to the host.
56 *
57 * @returns VBox status code.
58 * @param pDevice The device in question.
59 */
60 virtual int releaseDevice (HostUSBDevice *pDevice);
61
62 /**
63 * A VM is releasing a device back to be held or assigned to another VM.
64 * A port reset should be performed.
65 *
66 * @returns VBox status code.
67 * @param pDevice The device in question.
68 */
69 virtual int resetDevice (HostUSBDevice *pDevice);
70
71 /**
72 * Query if the service is active and working.
73 *
74 * @returns true if the service is up running.
75 * @returns false if the service isn't running.
76 */
77 bool isActive (void);
78
79 /**
80 * Get last error.
81 * Can be used to check why the proxy !isActive() upon construction.
82 *
83 * @returns VBox status code.
84 */
85 int getLastError (void);
86
87 /**
88 * Calculate the hash of the serial string.
89 *
90 * 64bit FNV1a, chosen because it is designed to hash in to a power of two
91 * space, and is much quicker and simpler than, say, a half MD4.
92 *
93 * @returns the hash.
94 * @param aSerial The serial string.
95 */
96 static uint64_t calcSerialHash (const char *aSerial);
97
98protected:
99
100 /**
101 * Starts the service.
102 *
103 * @returns VBox status.
104 */
105 int start (void);
106
107 /**
108 * Stops the service.
109 *
110 * @returns VBox status.
111 */
112 int stop (void);
113
114 /**
115 * Wait for a change in the USB devices attached to the host.
116 *
117 * @returns VBox status (ignored).
118 * @param aMillies Number of milliseconds to wait.
119 */
120 virtual int wait (unsigned aMillies);
121
122 /**
123 * Interrupt any wait() call in progress.
124 *
125 * @returns VBox status.
126 */
127 virtual int interruptWait (void);
128
129 /**
130 * Get a list of USB device currently attached to the host.
131 *
132 * @returns Pointer to a list of USB devices.
133 * The list nodes are freed individually by calling freeDevice().
134 */
135 virtual PUSBDEVICE getDevices (void);
136
137public:
138 /**
139 * Free one USB device returned by getDevice().
140 *
141 * @param pDevice Pointer to the device.
142 */
143 static void freeDevice (PUSBDEVICE pDevice);
144
145private:
146 /**
147 * Process any relevant changes in the attached USB devices.
148 */
149 void processChanges (void);
150
151 /**
152 * The service thread created by start().
153 *
154 * @param Thread The thread handle.
155 * @param pvUser Pointer to the USBProxyService instance.
156 */
157 static DECLCALLBACK (int) serviceThread (RTTHREAD Thread, void *pvUser);
158
159protected:
160 /** Pointer to the HostUSB object. */
161 HostUSB *mHost;
162 /** Thread handle of the service thread. */
163 RTTHREAD mThread;
164 /** Flag which stop() sets to cause serviceThread to return. */
165 bool volatile mTerminate;
166 /** List of smart HostUSBDevice pointers. */
167 typedef std::list <HostUSBDevice *> HostUSBDeviceList;
168 /** List of the known USB devices. */
169 HostUSBDeviceList mDevices;
170 /** VBox status code of the last failure.
171 * (Only used by start(), stop() and the child constructors.) */
172 int mLastError;
173};
174
175
176#if defined(RT_OS_LINUX) || defined(RT_OS_L4)
177#include <stdio.h>
178
179/**
180 * The Linux hosted USB Proxy Service.
181 */
182class USBProxyServiceLinux : public USBProxyService
183{
184public:
185 USBProxyServiceLinux (HostUSB *aHost, const char *aUsbfsRoot = "/proc/bus/usb");
186 ~USBProxyServiceLinux();
187
188 virtual int captureDevice (HostUSBDevice *aDevice);
189 virtual int holdDevice (HostUSBDevice *aDevice);
190 virtual int releaseDevice (HostUSBDevice *aDevice);
191 virtual int resetDevice (HostUSBDevice *aDevice);
192
193protected:
194 virtual int wait (unsigned aMillies);
195 virtual int interruptWait (void);
196 virtual PUSBDEVICE getDevices (void);
197
198private:
199 /** File handle to the '/proc/bus/usb/devices' file. */
200 RTFILE mFile;
201 /** Stream for mFile. */
202 FILE *mStream;
203 /** Pipe used to interrupt wait(), the read end. */
204 RTFILE mWakeupPipeR;
205 /** Pipe used to interrupt wait(), the write end. */
206 RTFILE mWakeupPipeW;
207 /** The root of usbfs. */
208 std::string mUsbfsRoot;
209};
210#endif /* RT_OS_LINUX */
211
212
213#ifdef RT_OS_WINDOWS
214/**
215 * The Win32/Win64 hosted USB Proxy Service.
216 */
217class USBProxyServiceWin32 : public USBProxyService
218{
219public:
220 USBProxyServiceWin32 (HostUSB *aHost);
221 ~USBProxyServiceWin32();
222
223 virtual int captureDevice (HostUSBDevice *aDevice);
224 virtual int holdDevice (HostUSBDevice *aDevice);
225 virtual int releaseDevice (HostUSBDevice *aDevice);
226 virtual int resetDevice (HostUSBDevice *aDevice);
227
228protected:
229 virtual int wait (unsigned aMillies);
230 virtual int interruptWait (void);
231 virtual PUSBDEVICE getDevices (void);
232
233private:
234
235 HANDLE hEventInterrupt;
236};
237#endif
238
239
240#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