VirtualBox

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

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

BugReportTool(bugref:8169): Added Setup API logs, dropped factory, open files as binary

  • 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 59569 2016-02-03 11:45:40Z 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
38#ifdef RT_OS_WINDOWS
39#define VBOXMANAGE "VBoxManage.exe"
40#else /* !RT_OS_WINDOWS */
41#define VBOXMANAGE "VBoxManage"
42#endif /* !RT_OS_WINDOWS */
43
44/* Base */
45
46inline void handleRtError(int rc, const char *pszMsgFmt, ...)
47{
48 if (RT_FAILURE(rc))
49 {
50 va_list va;
51 va_start(va, pszMsgFmt);
52 RTCString msgArgs(pszMsgFmt, va);
53 va_end(va);
54 RTCStringFmt msg("%s (rc=%d)\n", msgArgs.c_str(), rc);
55 throw RTCError(msg.c_str());
56 }
57}
58
59inline void handleComError(HRESULT hr, const char *pszMsgFmt, ...)
60{
61 if (FAILED(hr))
62 {
63 va_list va;
64 va_start(va, pszMsgFmt);
65 RTCString msgArgs(pszMsgFmt, va);
66 va_end(va);
67 RTCStringFmt msg("%s (hr=0x%x)\n", msgArgs.c_str(), hr);
68 throw RTCError(msg.c_str());
69 }
70}
71
72/*
73 * An auxiliary class to facilitate in-place path joins.
74 */
75class PathJoin
76{
77public:
78 PathJoin(const char *folder, const char *file) { m_path = RTPathJoinA(folder, file); }
79 ~PathJoin() { RTStrFree(m_path); };
80 operator char*() const { return m_path; };
81private:
82 char *m_path;
83};
84
85
86/*
87 * An abstract class serving as the root of the bug report item tree.
88 */
89class BugReportItem
90{
91public:
92 BugReportItem(const char *pszTitle);
93 virtual ~BugReportItem();
94 virtual const char *getTitle(void);
95 virtual PRTSTREAM getStream(void) = 0;
96private:
97 char *m_pszTitle;
98};
99
100/*
101 * An abstract class to serve as a base class for all report types.
102 */
103class BugReport
104{
105public:
106 BugReport(const char *pszFileName);
107 virtual ~BugReport();
108 virtual int addItem(BugReportItem* item) = 0;
109 virtual void complete(void) = 0;
110protected:
111 char *m_pszFileName;
112};
113
114/*
115 * An auxiliary class providing formatted output into a temporary file for item
116 * classes that obtain data via host OS APIs.
117 */
118class BugReportStream : public BugReportItem
119{
120public:
121 BugReportStream(const char *pszTitle);
122 virtual ~BugReportStream();
123 virtual PRTSTREAM getStream(void);
124protected:
125 int printf(const char *pszFmt, ...);
126 int putStr(const char *pszString);
127private:
128 PRTSTREAM m_Strm;
129 char m_szFileName[RTPATH_MAX];
130};
131
132
133/* Generic */
134
135/*
136 * This class reports everything into a single text file.
137 */
138class BugReportText : public BugReport
139{
140public:
141 BugReportText(const char *pszFileName);
142 virtual ~BugReportText();
143 virtual int addItem(BugReportItem* item);
144 virtual void complete(void) {};
145private:
146 PRTSTREAM m_StrmTxt;
147};
148
149/*
150 * This class reports items as individual files archived into a single compressed TAR file.
151 */
152class BugReportTarGzip : public BugReport
153{
154public:
155 BugReportTarGzip(const char *pszFileName);
156 virtual ~BugReportTarGzip();
157 virtual int addItem(BugReportItem* item);
158 virtual void complete(void);
159private:
160 /*
161 * Helper class to release handles going out of scope.
162 */
163 class VfsIoStreamHandle
164 {
165 public:
166 VfsIoStreamHandle() : m_hVfsStream(NIL_RTVFSIOSTREAM) {};
167 ~VfsIoStreamHandle() { release(); }
168 PRTVFSIOSTREAM getPtr(void) { return &m_hVfsStream; };
169 RTVFSIOSTREAM get(void) { return m_hVfsStream; };
170 void release(void)
171 {
172 if (m_hVfsStream != NIL_RTVFSIOSTREAM)
173 RTVfsIoStrmRelease(m_hVfsStream);
174 m_hVfsStream = NIL_RTVFSIOSTREAM;
175 };
176 private:
177 RTVFSIOSTREAM m_hVfsStream;
178 };
179
180 VfsIoStreamHandle m_hVfsGzip;
181
182 RTTAR m_hTar;
183 RTTARFILE m_hTarFile;
184 char m_szTarName[RTPATH_MAX];
185};
186
187/*
188 * BugReportFile adds a file as an item to a report.
189 */
190class BugReportFile : public BugReportItem
191{
192public:
193 BugReportFile(const char *pszPath, const char *pcszName);
194 virtual ~BugReportFile();
195 virtual PRTSTREAM getStream(void);
196
197private:
198 char *m_pszPath;
199 PRTSTREAM m_Strm;
200};
201
202/*
203 * A base class for item classes that collect CLI output.
204 */
205class BugReportCommand : public BugReportItem
206{
207public:
208 BugReportCommand(const char *pszTitle, const char *pszExec, ...);
209 virtual ~BugReportCommand();
210 virtual PRTSTREAM getStream(void);
211private:
212 PRTSTREAM m_Strm;
213 char m_szFileName[RTPATH_MAX];
214 char *m_papszArgs[32];
215};
216
217
218/* Platform-specific */
219
220#ifdef RT_OS_WINDOWS
221void createBugReportOsSpecific(BugReport* report, const char *pszHome);
222#else /* !RT_OS_WINDOWS */
223/* @todo Replace with platform-specific implementations. */
224void createBugReportOsSpecific(BugReport* report, const char *pszHome) {}
225#endif /* !RT_OS_WINDOWS */
226
227#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