VirtualBox

source: vbox/trunk/src/VBox/Main/include/HostHardwareLinux.h

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.3 KB
Line 
1/* $Id: HostHardwareLinux.h 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * VirtualBox Main - Classes for handling hardware detection under Linux.
4 *
5 * Please feel free to expand these to work for other systems (Solaris!) or to
6 * add new ones for other systems.
7 */
8
9/*
10 * Copyright (C) 2008-2023 Oracle and/or its affiliates.
11 *
12 * This file is part of VirtualBox base platform packages, as
13 * available from https://www.virtualbox.org.
14 *
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation, in version 3 of the
18 * License.
19 *
20 * This program is distributed in the hope that it will be useful, but
21 * WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, see <https://www.gnu.org/licenses>.
27 *
28 * SPDX-License-Identifier: GPL-3.0-only
29 */
30
31#ifndef MAIN_INCLUDED_HostHardwareLinux_h
32#define MAIN_INCLUDED_HostHardwareLinux_h
33#ifndef RT_WITHOUT_PRAGMA_ONCE
34# pragma once
35#endif
36
37#include <iprt/err.h>
38#include <iprt/cpp/ministring.h>
39#include <vector>
40#include <vector.h>
41
42/**
43 * Class for probing and returning information about host DVD and floppy
44 * drives. To use this class, create an instance, call one of the update
45 * methods to do the actual probing and use the iterator methods to get the
46 * result of the probe.
47 */
48class VBoxMainDriveInfo
49{
50public:
51 /** Structure describing a host drive */
52 struct DriveInfo
53 {
54 /** The device node of the drive. */
55 RTCString mDevice;
56 /** A unique identifier for the device, if available. This should be
57 * kept consistent across different probing methods of a given
58 * platform if at all possible. */
59 RTCString mUdi;
60 /** A textual description of the drive. */
61 RTCString mDescription;
62
63 /** Constructors */
64 DriveInfo(const RTCString &aDevice,
65 const RTCString &aUdi = "",
66 const RTCString &aDescription = "")
67 : mDevice(aDevice),
68 mUdi(aUdi),
69 mDescription(aDescription)
70 { }
71 };
72
73 /** List (resp vector) holding drive information */
74 typedef std::vector<DriveInfo> DriveInfoList;
75
76 /**
77 * Search for host floppy drives and rebuild the list, which remains empty
78 * until the first time this method is called.
79 * @returns iprt status code
80 */
81 int updateFloppies() RT_NOEXCEPT;
82
83 /**
84 * Search for host DVD drives and rebuild the list, which remains empty
85 * until the first time this method is called.
86 * @returns iprt status code
87 */
88 int updateDVDs() RT_NOEXCEPT;
89
90 /**
91 * Search for fixed disks (HDDs) and rebuild the list, which remains empty until
92 * the first time this method is called.
93 * @returns iprt status code
94 */
95 int updateFixedDrives() RT_NOEXCEPT;
96
97 /** Get the first element in the list of floppy drives. */
98 DriveInfoList::const_iterator FloppyBegin()
99 {
100 return mFloppyList.begin();
101 }
102
103 /** Get the last element in the list of floppy drives. */
104 DriveInfoList::const_iterator FloppyEnd()
105 {
106 return mFloppyList.end();
107 }
108
109 /** Get the first element in the list of DVD drives. */
110 DriveInfoList::const_iterator DVDBegin()
111 {
112 return mDVDList.begin();
113 }
114
115 /** Get the last element in the list of DVD drives. */
116 DriveInfoList::const_iterator DVDEnd()
117 {
118 return mDVDList.end();
119 }
120
121 /** Get the first element in the list of fixed drives. */
122 DriveInfoList::const_iterator FixedDriveBegin()
123 {
124 return mFixedDriveList.begin();
125 }
126
127 /** Get the last element in the list of fixed drives. */
128 DriveInfoList::const_iterator FixedDriveEnd()
129 {
130 return mFixedDriveList.end();
131 }
132private:
133 /** The list of currently available floppy drives */
134 DriveInfoList mFloppyList;
135 /** The list of currently available DVD drives */
136 DriveInfoList mDVDList;
137 /** The list of currently available fixed drives */
138 DriveInfoList mFixedDriveList;
139};
140
141/** Convenience typedef. */
142typedef VBoxMainDriveInfo::DriveInfoList DriveInfoList;
143/** Convenience typedef. */
144typedef VBoxMainDriveInfo::DriveInfo DriveInfo;
145
146/** Implementation of the hotplug waiter class below */
147class VBoxMainHotplugWaiterImpl
148{
149public:
150 VBoxMainHotplugWaiterImpl(void) {}
151 virtual ~VBoxMainHotplugWaiterImpl(void) {}
152 /** @copydoc VBoxMainHotplugWaiter::Wait */
153 virtual int Wait(RTMSINTERVAL cMillies) = 0;
154 /** @copydoc VBoxMainHotplugWaiter::Interrupt */
155 virtual void Interrupt(void) = 0;
156 /** @copydoc VBoxMainHotplugWaiter::getStatus */
157 virtual int getStatus(void) = 0;
158};
159
160/**
161 * Class for waiting for a hotplug event. To use this class, create an
162 * instance and call the @a Wait() method, which blocks until an event or a
163 * user-triggered interruption occurs. Call @a Interrupt() to interrupt the
164 * wait before an event occurs.
165 */
166class VBoxMainHotplugWaiter
167{
168 /** Class implementation. */
169 VBoxMainHotplugWaiterImpl *mImpl;
170public:
171 /** Constructor. Responsible for selecting the implementation. */
172 VBoxMainHotplugWaiter(const char *pcszDevicesRoot);
173 /** Destructor. */
174 ~VBoxMainHotplugWaiter (void)
175 {
176 delete mImpl;
177 }
178 /**
179 * Wait for a hotplug event.
180 *
181 * @returns VINF_SUCCESS if an event occurred or if Interrupt() was called.
182 * @returns VERR_TRY_AGAIN if the wait failed but this might (!) be a
183 * temporary failure.
184 * @returns VERR_NOT_SUPPORTED if the wait failed and will definitely not
185 * succeed if retried.
186 * @returns Possibly other iprt status codes otherwise.
187 * @param cMillies How long to wait for at most.
188 */
189 int Wait (RTMSINTERVAL cMillies)
190 {
191 return mImpl->Wait(cMillies);
192 }
193 /**
194 * Interrupts an active wait. In the current implementation, the wait
195 * may not return until up to two seconds after calling this method.
196 */
197 void Interrupt (void)
198 {
199 mImpl->Interrupt();
200 }
201
202 int getStatus(void)
203 {
204 return mImpl ? mImpl->getStatus() : VERR_NO_MEMORY;
205 }
206};
207
208#endif /* !MAIN_INCLUDED_HostHardwareLinux_h */
209/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use