| 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 |
| 11 /** | 11 /** |
| 12 * Standard runtime error for failure of Windows API calls. | 12 * Standard runtime error for failure of Windows API calls. |
| 13 * | 13 * |
| 14 * The design purpose of this class is to consistently report the details of a fa
iled API call, with an eye toward logging. | 14 * The design purpose of this class is to consistently report the details of a fa
iled API call, with an eye toward logging. |
| 15 * All the arguments passed to the constructor appear in what(). | 15 * All the arguments passed to the constructor appear in what(). |
| 16 * In addition the return value of GetLastError() appears. | 16 * In addition the return value of GetLastError() appears. |
| 17 * | 17 * |
| 18 * All the types for the constructors are generic. | 18 * All the types for the constructors are generic. |
| 19 * Any type that works with the output operator '<<' of a stream will work. | 19 * Any type that works with the output operator '<<' of a stream will work. |
| 20 * | 20 * |
| 21 * \par Example | 21 * \par Example |
| 22 * For a simple error, where there's not much to add over the API call and the
error code itself, just omit the second argument. | 22 * For a simple error, where there's not much to add over the API call and the
error code itself, just omit the second argument. |
| 23 * \code | 23 * \code |
| 24 * throw windows_api_error( "MsiDatabaseOpenView", "ERROR_BAD_QUERY_SYNTAX" ) | 24 * throw WindowsApiError( "MsiDatabaseOpenView", "ERROR_BAD_QUERY_SYNTAX" ) |
| 25 * \endcode | 25 * \endcode |
| 26 * | 26 * |
| 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 windows_api_error( "MsiOpenDatabaseW", x, "MSI database is on file s
ystem" ) | 31 * throw WindowsApiError( "MsiOpenDatabaseW", x, "MSI database is on file sys
tem" ) |
| 32 * \endcode | 32 * \endcode |
| 33 */ | 33 */ |
| 34 class windows_api_error | 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 make_message( T1 api_function, T2 error_code, 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 << api_function ; | 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 << error_code ; | 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 api_function | 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 handl
e. |
| 77 * \param error_code | 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 windows_api_error( T1 api_function, T2 error_code, T3 message ) | 84 WindowsApiError( T1 apiFunction, T2 errorCode, T3 message ) |
| 85 : std::runtime_error( make_message( api_function, error_code, 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 api_function | 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 handl
e. |
| 93 * \param error_code | 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 windows_api_error( T1 api_function, T2 error_code ) | 98 WindowsApiError( T1 apiFunction, T2 errorCode) |
| 99 : std::runtime_error( make_message( api_function, error_code, "" ) ) | 99 : std::runtime_error( MakeMessage( apiFunction, errorCode, "" ) ) |
| 100 {} | 100 {} |
| 101 } ; | 101 } ; |
| 102 | 102 |
| 103 /** | 103 /** |
| 104 */ | 104 */ |
| 105 class not_yet_supported | 105 class NotYetSupported |
| 106 : public std::runtime_error | 106 : public std::runtime_error |
| 107 { | 107 { |
| 108 public: | 108 public: |
| 109 not_yet_supported( 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 |