VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxBugReport/VBoxBugReport.h@ 64247

Last change on this file since 64247 was 59797, checked in by vboxsync, 9 years ago

BugReportTool(bugref:8169): USB device tree, device list, filter list, progress reporting, VBoxNetLwf events

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.6 KB
Line 
1/* $Id: VBoxBugReport.h 59797 2016-02-24 13:55:10Z vboxsync $ */
2/** @file
3 * VBoxBugReport - VirtualBox command-line diagnostics tool, internal header file.
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___H_VBOXBUGREPORT
19#define ___H_VBOXBUGREPORT
20
21/*
22 * Introduction.
23 *
24 * In the most general sense a bug report is a collection of data obtained from
25 * the user's host system. It may include files common for all VMs, like the
26 * VBoxSVC.log file, as well as files related to particular machines. It may
27 * also contain the output of commands executed on the host, as well as data
28 * collected via OS APIs.
29 */
30
31/* @todo not sure if using a separate namespace would be beneficial */
32
33#include <iprt/path.h>
34#include <iprt/stream.h>
35#include <iprt/tar.h>
36#include <iprt/vfs.h>
37#include <iprt/cpp/list.h>
38
39#ifdef RT_OS_WINDOWS
40#define VBOXMANAGE "VBoxManage.exe"
41#else /* !RT_OS_WINDOWS */
42#define VBOXMANAGE "VBoxManage"
43#endif /* !RT_OS_WINDOWS */
44
45/* Base */
46
47inline void handleRtError(int rc, const char *pszMsgFmt, ...)
48{
49 if (RT_FAILURE(rc))
50 {
51 va_list va;
52 va_start(va, pszMsgFmt);
53 RTCString msgArgs(pszMsgFmt, va);
54 va_end(va);
55 RTCStringFmt msg("%s. %s (%d)\n", msgArgs.c_str(), RTErrGetFull(rc), rc);
56 throw RTCError(msg.c_str());
57 }
58}
59
60inline void handleComError(HRESULT hr, const char *pszMsgFmt, ...)
61{
62 if (FAILED(hr))
63 {
64 va_list va;
65 va_start(va, pszMsgFmt);
66 RTCString msgArgs(pszMsgFmt, va);
67 va_end(va);
68 RTCStringFmt msg("%s (hr=0x%x)\n", msgArgs.c_str(), hr);
69 throw RTCError(msg.c_str());
70 }
71}
72
73/*
74 * An auxiliary class to facilitate in-place path joins.
75 */
76class PathJoin
77{
78public:
79 PathJoin(const char *folder, const char *file) { m_path = RTPathJoinA(folder, file); }
80 ~PathJoin() { RTStrFree(m_path); };
81 operator char*() const { return m_path; };
82private:
83 char *m_path;
84};
85
86
87/*
88 * An abstract class serving as the root of the bug report item tree.
89 */
90class BugReportItem
91{
92public:
93 BugReportItem(const char *pszTitle);
94 virtual ~BugReportItem();
95 virtual const char *getTitle(void);
96 virtual PRTSTREAM getStream(void) = 0;
97private:
98 char *m_pszTitle;
99};
100
101/*
102 * An abstract class to serve as a base class for all report types.
103 */
104class BugReport
105{
106public:
107 BugReport(const char *pszFileName);
108 virtual ~BugReport();
109
110 void addItem(BugReportItem* item);
111 int getItemCount(void);
112 void process();
113
114 virtual void processItem(BugReportItem* item) = 0;
115 virtual void complete(void) = 0;
116
117protected:
118 char *m_pszFileName;
119 RTCList<BugReportItem*> m_Items;
120};
121
122/*
123 * An auxiliary class providing formatted output into a temporary file for item
124 * classes that obtain data via host OS APIs.
125 */
126class BugReportStream : public BugReportItem
127{
128public:
129 BugReportStream(const char *pszTitle);
130 virtual ~BugReportStream();
131 virtual PRTSTREAM getStream(void);
132protected:
133 int printf(const char *pszFmt, ...);
134 int putStr(const char *pszString);
135private:
136 PRTSTREAM m_Strm;
137 char m_szFileName[RTPATH_MAX];
138};
139
140
141/* Generic */
142
143/*
144 * This class reports everything into a single text file.
145 */
146class BugReportText : public BugReport
147{
148public:
149 BugReportText(const char *pszFileName);
150 virtual ~BugReportText();
151 virtual void processItem(BugReportItem* item);
152 virtual void complete(void) {};
153private:
154 PRTSTREAM m_StrmTxt;
155};
156
157/*
158 * This class reports items as individual files archived into a single compressed TAR file.
159 */
160class BugReportTarGzip : public BugReport
161{
162public:
163 BugReportTarGzip(const char *pszFileName);
164 virtual ~BugReportTarGzip();
165 virtual void processItem(BugReportItem* item);
166 virtual void complete(void);
167private:
168 /*
169 * Helper class to release handles going out of scope.
170 */
171 class VfsIoStreamHandle
172 {
173 public:
174 VfsIoStreamHandle() : m_hVfsStream(NIL_RTVFSIOSTREAM) {};
175 ~VfsIoStreamHandle() { release(); }
176 PRTVFSIOSTREAM getPtr(void) { return &m_hVfsStream; };
177 RTVFSIOSTREAM get(void) { return m_hVfsStream; };
178 void release(void)
179 {
180 if (m_hVfsStream != NIL_RTVFSIOSTREAM)
181 RTVfsIoStrmRelease(m_hVfsStream);
182 m_hVfsStream = NIL_RTVFSIOSTREAM;
183 };
184 private:
185 RTVFSIOSTREAM m_hVfsStream;
186 };
187
188 VfsIoStreamHandle m_hVfsGzip;
189
190 RTTAR m_hTar;
191 RTTARFILE m_hTarFile;
192 char m_szTarName[RTPATH_MAX];
193};
194
195
196/*
197 * BugReportFile adds a file as an item to a report.
198 */
199class BugReportFile : public BugReportItem
200{
201public:
202 BugReportFile(const char *pszPath, const char *pcszName);
203 virtual ~BugReportFile();
204 virtual PRTSTREAM getStream(void);
205
206private:
207 char *m_pszPath;
208 PRTSTREAM m_Strm;
209};
210
211/*
212 * A base class for item classes that collect CLI output.
213 */
214class BugReportCommand : public BugReportItem
215{
216public:
217 BugReportCommand(const char *pszTitle, const char *pszExec, ...);
218 virtual ~BugReportCommand();
219 virtual PRTSTREAM getStream(void);
220private:
221 PRTSTREAM m_Strm;
222 char m_szFileName[RTPATH_MAX];
223 char *m_papszArgs[32];
224};
225
226
227/* Platform-specific */
228
229void createBugReportOsSpecific(BugReport* report, const char *pszHome);
230
231#endif /* !___H_VBOXBUGREPORT */
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