| 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 |