28 enum class CallbackErrorType : uint8_t
32 INVALID_ARGUMENT_BLANK_TEMPLATE,
33 INVALID_ARGUMENT_UNSUPPORTED_TEMPLATE,
34 INVALID_ARGUMENT_INCOMPATIBLE_TEMPLATE,
35 INVALID_ARGUMENT_IMAGE,
36 INVALID_ARGUMENT_NULL,
41 LICENSE_FEATURE_NOT_ALLOWED,
43 LICENSE_LIMIT_REACHED,
63 using ErrorCallback = void (*)(CallbackErrorType type,
64 const char* description,
77 extern "C" struct ErrorCallbacks
83 ErrorCallback setException;
101 [[nodiscard]] ErrorCallbacks GetCallbacks()
103 ErrorCallbacks cb = {};
105 cb.setException = &CallbackError::Set;
119 static void Set(CallbackErrorType t,
120 const char* description,
122 const char* function,
126 if (
object ==
nullptr)
130 static_cast<CallbackError*
>(object)->Set(t, description, SourceLocation{ file, function, line });
139 if (exception.has_value())
141 std::visit([](
auto e) {
throw e; }, exception.value());
148 void PropagateVia(ErrorCallbacks& cb)
const
150 if (exception.has_value() && cb.setException !=
nullptr)
155 cb.setException(type.value(),
157 e.Location().FileName().c_str(),
158 e.Location().FunctionName().c_str(),
166 CallbackError(CallbackErrorType t, std::string d,
const SourceLocation& loc = SourceLocation{})
168 Set(t, std::move(d), loc);
174 [[nodiscard]]
bool IsError()
const
176 return exception.has_value();
182 [[nodiscard]]
const char* What() const noexcept
186 if (exception.has_value())
188 return std::visit([](
const auto& e) {
return e.what(); }, exception.value());
193 return "Failed to get CallbackError description";
201 [[nodiscard]] std::optional<CallbackErrorType> Type()
const
206 CallbackError() =
default;
209 std::optional<std::variant<EnrollmentRuntimeException,
210 EnrollmentInvalidArgumentException,
212 LicenseNotFoundException,
213 InvalidLicenseException,
214 ExpiredLicenseException,
215 LicenseFeatureNotAllowedException,
216 InvalidHWIDException,
217 LicenseLimitReachedException,
218 NotSupportedException,
219 InvalidTemplateException,
220 UnsupportedTemplateException,
223 IncompatibleTemplateException,
224 InvalidImageArgumentException,
225 NullArgumentException>>
227 std::optional<CallbackErrorType> type;
229 void Set(CallbackErrorType t, std::string d,
const SourceLocation& loc)
235 case CallbackErrorType::RUNTIME:
236 exception.emplace(EnrollmentRuntimeException(std::move(d), loc));
238 case CallbackErrorType::INVALID_ARGUMENT:
239 exception.emplace(EnrollmentInvalidArgumentException(std::move(d), loc));
241 case CallbackErrorType::LICENSE:
242 exception.emplace(LicenseException(std::move(d), loc));
244 case CallbackErrorType::LICENSE_NOT_FOUND:
245 exception.emplace(LicenseNotFoundException(std::move(d), loc));
247 case CallbackErrorType::LICENSE_INVALID:
248 exception.emplace(InvalidLicenseException(std::move(d), loc));
250 case CallbackErrorType::LICENSE_EXPIRED:
251 exception.emplace(ExpiredLicenseException(std::move(d), loc));
253 case CallbackErrorType::LICENSE_FEATURE_NOT_ALLOWED:
254 exception.emplace(LicenseFeatureNotAllowedException(std::move(d), loc));
256 case CallbackErrorType::LICENSE_INVALID_HWID:
257 exception.emplace(InvalidHWIDException(std::move(d), loc));
259 case CallbackErrorType::LICENSE_LIMIT_REACHED:
260 exception.emplace(LicenseLimitReachedException(std::move(d), loc));
262 case CallbackErrorType::NOT_SUPPORTED:
263 exception.emplace(NotSupportedException(std::move(d), loc));
265 case CallbackErrorType::INVALID_ARGUMENT_BLANK_TEMPLATE:
266 exception.emplace(InvalidTemplateException(std::move(d), loc));
268 case CallbackErrorType::INVALID_ARGUMENT_UNSUPPORTED_TEMPLATE:
269 exception.emplace(UnsupportedTemplateException(std::move(d), loc));
271 case CallbackErrorType::FILE:
272 exception.emplace(FileException(std::move(d), loc));
274 case CallbackErrorType::IMAGE_DECODE:
277 case CallbackErrorType::IMAGE_ENCODE:
280 case CallbackErrorType::IMAGE_PROCESS:
283 case CallbackErrorType::IMAGE_UNKNOWN:
286 case CallbackErrorType::INVALID_ARGUMENT_INCOMPATIBLE_TEMPLATE:
287 exception.emplace(IncompatibleTemplateException(std::move(d), loc));
289 case CallbackErrorType::INVALID_ARGUMENT_IMAGE:
290 exception.emplace(InvalidImageArgumentException(std::move(d), loc));
292 case CallbackErrorType::INVALID_ARGUMENT_NULL:
293 exception.emplace(NullArgumentException(std::move(d), loc));
298 std::string unknownMessage =
299 "Unknown error type '" + std::to_string(
static_cast<unsigned int>(t)) +
"', " + d;
300 exception = EnrollmentRuntimeException(std::move(unknownMessage), loc);
314 operator ErrorCallbacks()
316 return error.GetCallbacks();
318 ThrowOnError() =
default;
319 ~ThrowOnError() noexcept(false)
321 error.ThrowOnError();
323 ThrowOnError(
const ThrowOnError&) =
delete;
324 ThrowOnError(ThrowOnError&&) =
delete;
325 ThrowOnError& operator=(
const ThrowOnError&) =
delete;
326 ThrowOnError& operator=(ThrowOnError&&) =
delete;
340 template<
typename Func>
341 auto ForwardExceptionToCallbacks(ErrorCallbacks errorCallbacks,
343 const SourceLocation& loc = SourceLocation{}) ->
decltype(func())
345 using ReturnType =
decltype(func());
348 if constexpr (std::is_void_v<ReturnType>)
350 std::forward<Func>(func)();
354 return std::forward<Func>(func)();
357 catch (
const EnrollmentException& e)
359 CallbackError{ CallbackErrorType::RUNTIME, e.
what(), e.
Location() }.PropagateVia(errorCallbacks);
361 catch (std::exception& e)
363 CallbackError{ CallbackErrorType::RUNTIME, e.what(), loc }.PropagateVia(errorCallbacks);
367 CallbackError{ CallbackErrorType::RUNTIME,
"Unknown error", loc }.PropagateVia(errorCallbacks);
370 if constexpr (!std::is_void_v<ReturnType>)
Base exception for all enrollment-sdk exceptions.
Definition EnrollmentException.h:26
const char * what() const noexcept override
Provides error message.
Definition EnrollmentException.h:49
SourceLocation Location() const noexcept
Provides location of error.
Definition EnrollmentException.h:58
@ ENCODE_IMAGE
Problem encode image to given format.
Definition ImageException.h:43
@ PROCESS_IMAGE
Problem to process an image.
Definition ImageException.h:47
@ DECODE_IMAGE
Image type is supported but image format is corrupted.
Definition ImageException.h:39
@ UNKNOWN_IMAGE
Image type is not supported.
Definition ImageException.h:35
Class to capture the source location of an error or exception.
Definition SourceLocation.h:25