+
+/**
+ * If the condition is @c false, it prints a message, evaluates a cleanup expression,
+ * and goes to <tt>CATCH</tt>.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to CATCH label
+ * @param[in] ... The message to display
+ *
+ * The following example demonstrates how to use the SecureTry macro.
+ *
+ * @code
+ * result
+ * MyClass::DoSomething(const String* passwd)
+ * {
+ * result r = E_SUCCESS;
+ *
+ * // Do something...
+ *
+ * // If password is wrong, print "[E_INVALID_ARG] The password '1234' is wrong." to the console
+ * // execute the expression "r = E_INVALID_ARG", and move to CATCH
+ * SecureTryCatch(*passwd != refPasswd, r = E_INVALID_ARG, "[E_INVALID_ARG] The password '%ls' is wrong.", passwd->GetPointer());
+ *
+ * SetLastResult(E_SUCCESS);
+ *
+ * return E_SUCCESS;// execute the expression "r = E_INVALID_ARG", and move to CATCH
+ *
+ * CATCH:
+ * SetLastResult(r);
+ * // Do something
+ *
+ * return r;
+ * }
+ * @endcode
+ * @hideinitializer
+ */
+#define SecureTryCatch(condition, expr, ...) \
+ if (!(condition)) { \
+ AppSecureLogException(__VA_ARGS__); \
+ expr; \
+ goto CATCH; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, it prints a message, sets the last result, evaluates a cleanup expression
+ * and goes to <tt>CATCH</tt>.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to CATCH label
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryCatchResult(condition, expr, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogException(__VA_ARGS__); \
+ expr; \
+ goto CATCH; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, it prints a message, sets the last result, evaluates a cleanup expression
+ * and goes to label.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to catchLabel
+ * @param[in] catchLabel The label for goto operation
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryCatchLabelResult(condition, expr, catchLabel, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogException(__VA_ARGS__); \
+ expr; \
+ goto catchLabel; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturn(condition, returnValue, ...) \
+ if (!(condition)) { \
+ AppSecureLogException(__VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed, sets the last result and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnResult(condition, returnValue, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogException(__VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed, sets the last result and no value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnVoidResult(condition, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogException(__VA_ARGS__); \
+ return; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed and no value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnVoid(condition, ...) \
+ if (!(condition)) { \
+ AppSecureLogException(__VA_ARGS__); \
+ return; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryLog(condition, ...) \
+ if (!(condition)) { \
+ AppSecureLog(__VA_ARGS__); \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the informative log message is printed and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryLogReturn(condition, returnValue, ...) \
+ if (!(condition)) { \
+ AppSecureLog(__VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+
+// SecureTryTag Macros
+
+/**
+ * If the condition is @c false, it prints a message with a tag, evaluates a cleanup expression
+ * and goes to <tt>CATCH</tt>.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to CATCH label
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryCatchTag(tag, condition, expr, ...) \
+ if (!(condition)) { \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ expr; \
+ goto CATCH; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, it prints a message with a tag, sets the last result, evaluates a cleanup expression,
+ * and goes to <tt>CATCH</tt>.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to CATCH label
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryCatchResultTag(tag, condition, expr, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ expr; \
+ goto CATCH; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, it prints a message with a tag, sets the last result, evaluates a cleanup expression
+ * and goes to label.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] expr Expressions that are evaluated before going to catchLabel
+ * @param[in] catchLabel The label for goto operation
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryCatchLabelResultTag(tag, condition, expr, catchLabel, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ expr; \
+ goto catchLabel; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed with a tag and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnTag(tag, condition, returnValue, ...) \
+ if (!(condition)) { \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed with a tag, sets the last result and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnResultTag(tag, condition, returnValue, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed with a tag, sets the last result and no value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] r The last result to set
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnVoidResultTag(tag, condition, r, ...) \
+ if (!(condition)) { \
+ SetLastResult(r); \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ return; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed with a tag and no value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryReturnVoidTag(tag, condition, ...) \
+ if (!(condition)) { \
+ AppSecureLogExceptionTag(tag, __VA_ARGS__); \
+ return; \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the message is printed with a tag.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryLogTag(tag, condition, ...) \
+ if (!(condition)) { \
+ AppSecureLogTag(tag, __VA_ARGS__); \
+ } \
+ else {;}
+
+/**
+ * If the condition is @c false, the informative log message is printed with a tag and a value is returned.
+ * It allows display of exception log messages if compiled with "_SECURE_LOG" definition.
+ * Otherwise, log printing functionality will be removed in the compile time.
+ *
+ * @since 2.1
+ *
+ * @param[in] tag Used to identify the source of a log message
+ * @param[in] condition The condition that is expected to be true
+ * @param[in] returnValue The value to return when the condition is @c false
+ * @param[in] ... The message to display
+ * @hideinitializer
+ */
+#define SecureTryLogReturnTag(tag, condition, returnValue, ...) \
+ if (!(condition)) { \
+ AppSecureLogTag(tag, __VA_ARGS__); \
+ return returnValue; \
+ } \
+ else {;}
+