VirtualBox

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

Last change on this file since 87093 was 85929, checked in by vboxsync, 4 years ago

Main: bugref:9224: Main+VBoxManageDisk+doc part

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