VirtualBox

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

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

WIN32 -> WIN

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