RMS SDK for C++  0.2.1
A client library for using Microsoft RMS from Linux.
RMSCryptoExceptions.h
1 /*
2  * ======================================================================
3  * Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
4  * Licensed under the MIT License.
5  * See LICENSE.md in the project root for license information.
6  * ======================================================================
7  */
8 
9 #ifndef _CRYPTO_STREAMS_LIB_EXCEPTIONS_H
10 #define _CRYPTO_STREAMS_LIB_EXCEPTIONS_H
11 #include <cstring>
12 #include <string>
13 #include <exception>
14 #include <algorithm>
15 
16 #ifndef _NOEXCEPT
17 # if __GNUC__ >= 4
18 # define _NOEXCEPT _GLIBCXX_USE_NOEXCEPT
19 # endif // if __GNUC__ >= 4
20 #endif // ifndef _NOEXCEPT
21 
22 namespace rmscrypto {
23 namespace exceptions {
24 #define MAX_EXCEPTION_MESSAGE_LENGTH 255
25 class RMSCryptoException : public std::exception {
26 public:
27 
28  enum ExceptionTypes {
29  LogicError = 0,
30  IOError
31  };
32  enum ErrorTypes {
33  InvalidArgument = 0,
34  NullPointer,
35  OperationUnavailable,
36  Insufficientbuffer,
37  NotImplemented,
38  SecretKeyException,
39  UnknownError
40  };
41 
42  RMSCryptoException(const ExceptionTypes type,
43  const int error,
44  const std::string & message) _NOEXCEPT
45  : type_(type), error_(error)
46  {
47  CopyMessage(message.c_str(), message.length());
48  }
49 
50  RMSCryptoException(const ExceptionTypes type,
51  const int error,
52  const char *const & message) _NOEXCEPT
53  : type_(type), error_(error)
54  {
55  CopyMessage(message, strlen(message));
56  }
57 
58  virtual ~RMSCryptoException() _NOEXCEPT {}
59 
60  virtual const char* what() const _NOEXCEPT override {
61  return message_;
62  }
63 
64  virtual ExceptionTypes type() const _NOEXCEPT {
65  return type_;
66  }
67 
68  virtual int error() const _NOEXCEPT {
69  return error_;
70  }
71 
72 private:
73 
74  void CopyMessage(const char *msg, const size_t len) {
75  size_t mlen =
76  (std::min)(len, static_cast<const size_t>(MAX_EXCEPTION_MESSAGE_LENGTH - 1));
77 
78  memset(message_, 0, sizeof(message_));
79 
80  if (mlen > 0) {
81  #ifdef Q_OS_WIN32
82  memcpy_s(message_, mlen, msg, mlen);
83  #else // ifdef Q_OS_WIN32
84  memcpy(message_, msg, mlen);
85  #endif // ifdef Q_OS_WIN32
86  }
87  }
88 
89  ExceptionTypes type_;
90  int error_;
91  char message_[MAX_EXCEPTION_MESSAGE_LENGTH];
92 };
93 
95 public:
96 
97  RMSCryptoLogicException(const int error,
98  const std::string& message) _NOEXCEPT
99  : RMSCryptoException(LogicError, error, message) {}
100 
101  RMSCryptoLogicException(const int error,
102  const char *const& message) _NOEXCEPT
103  : RMSCryptoException(LogicError, error, message) {}
104 
105  virtual ~RMSCryptoLogicException() _NOEXCEPT {}
106 };
107 
109 public:
110 
111  RMSCryptoIOException(const int error,
112  const std::string& message) _NOEXCEPT
113  : RMSCryptoException(IOError, error, message) {}
114 
115  RMSCryptoIOException(const int error,
116  const char *const& message) _NOEXCEPT
117  : RMSCryptoException(IOError, error, message) {}
118 
119  virtual ~RMSCryptoIOException() _NOEXCEPT {}
120 };
121 
123 public:
124 
125  RMSCryptoIOKeyException(const std::string& message, int code) _NOEXCEPT
126  : RMSCryptoIOException(SecretKeyException, message), code_(code) {}
127 
128  RMSCryptoIOKeyException(const char *const& message, int code) _NOEXCEPT
129  : RMSCryptoIOException(SecretKeyException, message), code_(code) {}
130 
131  virtual ~RMSCryptoIOKeyException() _NOEXCEPT {}
132 
133  virtual int code() const _NOEXCEPT {
134  return code_;
135  }
136 
137 private:
138 
139  int code_; // additional reason for this error
140 };
141 
142 
144 public:
145 
146  RMSCryptoInvalidArgumentException(const std::string& message) _NOEXCEPT
147  : RMSCryptoLogicException(InvalidArgument, message) {}
148 
149  RMSCryptoInvalidArgumentException(const char *const& message) _NOEXCEPT
150  : RMSCryptoLogicException(InvalidArgument, message) {}
151 
152  virtual ~RMSCryptoInvalidArgumentException() _NOEXCEPT {}
153 };
154 
156 public:
157 
158  RMSCryptoNullPointerException(const std::string& message) _NOEXCEPT
159  : RMSCryptoLogicException(NullPointer, message) {}
160 
161  RMSCryptoNullPointerException(const char *const& message) _NOEXCEPT
162  : RMSCryptoLogicException(NullPointer, message) {}
163 
164  virtual ~RMSCryptoNullPointerException() _NOEXCEPT {}
165 };
166 
168 public:
169 
170  RMSCryptoInsufficientBufferException(const std::string& message) _NOEXCEPT
171  : RMSCryptoLogicException(NullPointer, message) {}
172 
173  RMSCryptoInsufficientBufferException(const char *const& message) _NOEXCEPT
174  : RMSCryptoLogicException(NullPointer, message) {}
175 
176  virtual ~RMSCryptoInsufficientBufferException() _NOEXCEPT {}
177 };
178 
180 public:
181 
182  RMSCryptoNotImplementedException(const std::string& message) _NOEXCEPT
183  : RMSCryptoLogicException(NotImplemented, message) {}
184 
185  RMSCryptoNotImplementedException(const char *const& message) _NOEXCEPT
186  : RMSCryptoLogicException(NotImplemented, message) {}
187 
188  virtual ~RMSCryptoNotImplementedException() _NOEXCEPT {}
189 };
190 } // namespace exceptions
191 } // namespace rmscrypto
192 #endif // _CRYPTO_STREAMS_LIB_EXCEPTIONS_H
Definition: RMSCryptoExceptions.h:108
Definition: BlockBasedProtectedStream.cpp:13
Definition: RMSCryptoExceptions.h:179
Definition: RMSCryptoExceptions.h:155
Definition: RMSCryptoExceptions.h:122
Definition: RMSCryptoExceptions.h:25
Definition: RMSCryptoExceptions.h:94