OLD | NEW |
1 /** | 1 /** |
2 * \file handle.h The "install session" is the context for all custom installatio
n behavior. | 2 * \file handle.h The "install session" is the context for all custom installatio
n behavior. |
3 */ | 3 */ |
4 | 4 |
5 #ifndef INSTALLER_LIB_H | 5 #ifndef INSTALLER_LIB_H |
6 #define INSTALLER_LIB_H | 6 #define INSTALLER_LIB_H |
7 | 7 |
8 #include <stdexcept> | 8 #include <stdexcept> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 * \par | 27 * \par |
28 * Sometimes you don't have a symbolic error code. | 28 * Sometimes you don't have a symbolic error code. |
29 * This example uses a numeric error and a clarifying message. | 29 * This example uses a numeric error and a clarifying message. |
30 * \code | 30 * \code |
31 * throw WindowsApiError( "MsiOpenDatabaseW", x, "MSI database is on file sys
tem" ) | 31 * throw WindowsApiError( "MsiOpenDatabaseW", x, "MSI database is on file sys
tem" ) |
32 * \endcode | 32 * \endcode |
33 */ | 33 */ |
34 class WindowsApiError | 34 class WindowsApiError |
35 : public std::runtime_error | 35 : public std::runtime_error |
36 { | 36 { |
37 template< class T1, class T2, class T3 > | 37 template<class T1, class T2, class T3> |
38 static std::string MakeMessage( T1 apiFunction, T2 errorCode, T3 message ) | 38 static std::string MakeMessage(T1 apiFunction, T2 errorCode, T3 message) |
39 { | 39 { |
40 std::ostringstream r, t ; | 40 std::ostringstream r, t; |
41 std::string s ; | 41 std::string s; |
42 | 42 |
43 t << apiFunction ; | 43 t << apiFunction; |
44 s = t.str() ; | 44 s = t.str(); |
45 if ( s.empty() ) | 45 if (s.empty()) |
46 { | 46 { |
47 s = "<unspecified>" ; | 47 s = "<unspecified>"; |
48 } | 48 } |
49 r << s << " returned " ; | 49 r << s << " returned "; |
50 | 50 |
51 t = std::ostringstream() ; | 51 t = std::ostringstream(); |
52 t << errorCode ; | 52 t << errorCode; |
53 s = t.str() ; | 53 s = t.str(); |
54 if ( s.empty() ) | 54 if (s.empty()) |
55 { | 55 { |
56 s = "<unknown>" ; | 56 s = "<unknown>"; |
57 } | 57 } |
58 r << s << " with last error code " << ::GetLastError() ; | 58 r << s << " with last error code " << ::GetLastError(); |
59 | 59 |
60 t = std::ostringstream() ; | 60 t = std::ostringstream(); |
61 t << message ; | 61 t << message; |
62 s = t.str() ; | 62 s = t.str(); |
63 if ( ! s.empty() ) | 63 if (! s.empty()) |
64 { | 64 { |
65 r << ": " << s ; | 65 r << ": " << s; |
66 } | 66 } |
67 | 67 |
68 return r.str() ; | 68 return r.str(); |
69 } | 69 } |
70 | 70 |
71 public: | 71 public: |
72 /** | 72 /** |
73 * Constructor with additional message. | 73 * Constructor with additional message. |
74 * | 74 * |
75 * \param apiFunction | 75 * \param apiFunction |
76 *» The name of the API function that returned an error code or a null handl
e. | 76 * The name of the API function that returned an error code or a null handle
. |
77 * \param errorCode | 77 * \param errorCode |
78 * The error code that the function returned, either symbolic or numeric. | 78 * The error code that the function returned, either symbolic or numeric. |
79 * Will be zero when the function returned a null handle. | 79 * Will be zero when the function returned a null handle. |
80 * \param message | 80 * \param message |
81 * Extra message to clarify the error | 81 * Extra message to clarify the error |
82 */ | 82 */ |
83 template< class T1, class T2, class T3 > | 83 template<class T1, class T2, class T3> |
84 WindowsApiError( T1 apiFunction, T2 errorCode, T3 message ) | 84 WindowsApiError(T1 apiFunction, T2 errorCode, T3 message) |
85 : std::runtime_error( MakeMessage( apiFunction, errorCode, message ) ) | 85 : std::runtime_error(MakeMessage(apiFunction, errorCode, message)) |
86 {} | 86 {} |
87 | 87 |
88 /** | 88 /** |
89 * Constructor without anything extra. | 89 * Constructor without anything extra. |
90 * | 90 * |
91 * \param apiFunction | 91 * \param apiFunction |
92 *» The name of the API function that returned an error code or a null handl
e. | 92 * The name of the API function that returned an error code or a null handle
. |
93 * \param errorCode | 93 * \param errorCode |
94 * The error code that the function returned, either symbolic or numeric. | 94 * The error code that the function returned, either symbolic or numeric. |
95 * Will be zero when the function returned a null handle. | 95 * Will be zero when the function returned a null handle. |
96 */ | 96 */ |
97 template< class T1, class T2 > | 97 template<class T1, class T2> |
98 WindowsApiError( T1 apiFunction, T2 errorCode) | 98 WindowsApiError(T1 apiFunction, T2 errorCode) |
99 : std::runtime_error( MakeMessage( apiFunction, errorCode, "" ) ) | 99 : std::runtime_error(MakeMessage(apiFunction, errorCode, "")) |
100 {} | 100 {} |
101 } ; | 101 }; |
102 | 102 |
103 /** | 103 /** |
104 */ | 104 */ |
105 class NotYetSupported | 105 class NotYetSupported |
106 : public std::runtime_error | 106 : public std::runtime_error |
107 { | 107 { |
108 public: | 108 public: |
109 NotYetSupported( std::string message ) | 109 NotYetSupported(std::string message) |
110 : std::runtime_error( "Not yet supported: " + message ) | 110 : std::runtime_error("Not yet supported: " + message) |
111 {} | 111 {} |
112 } ; | 112 }; |
113 | 113 |
114 #endif | 114 #endif |
OLD | NEW |