diff --git a/indra/llcommon/aialert.cpp b/indra/llcommon/aialert.cpp index 44d2c3230..f3d4f5af3 100644 --- a/indra/llcommon/aialert.cpp +++ b/indra/llcommon/aialert.cpp @@ -25,43 +25,51 @@ * * 02/11/2013 * - Initial version, written by Aleric Inglewood @ SL + * + * 05/11/2013 + * Moved everything in namespace AIAlert, except AIArgs. */ #include "aialert.h" -AIAlert::AIAlert(AIAlertPrefix const& prefix, modal_nt type, - std::string const& xml_desc, AIArgs const& args) : mModal(type) +namespace AIAlert { - if (prefix) mLines.push_back(AIAlertLine(prefix)); - mLines.push_back(AIAlertLine(xml_desc, args)); + +Error::Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, AIArgs const& args) : mModal(type) +{ + if (prefix) mLines.push_back(Line(prefix)); + mLines.push_back(Line(xml_desc, args)); } -AIAlert::AIAlert(AIAlertPrefix const& prefix, modal_nt type, - AIAlert const& alert, - std::string const& xml_desc, AIArgs const& args) : mLines(alert.mLines), mModal(type) +Error::Error(Prefix const& prefix, modal_nt type, + Error const& alert, + std::string const& xml_desc, AIArgs const& args) : mLines(alert.mLines), mModal(type) { if (alert.mModal == modal) mModal = modal; - if (prefix) mLines.push_back(AIAlertLine(prefix, !mLines.empty())); - mLines.push_back(AIAlertLine(xml_desc, args)); + if (prefix) mLines.push_back(Line(prefix, !mLines.empty())); + mLines.push_back(Line(xml_desc, args)); } -AIAlert::AIAlert(AIAlertPrefix const& prefix, modal_nt type, - std::string const& xml_desc, - AIAlert const& alert) : mLines(alert.mLines), mModal(type) +Error::Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, + Error const& alert) : mLines(alert.mLines), mModal(type) { if (alert.mModal == modal) mModal = modal; if (!mLines.empty()) { mLines.front().set_newline(); } - mLines.push_front(AIAlertLine(xml_desc)); - if (prefix) mLines.push_front(AIAlertLine(prefix)); + mLines.push_front(Line(xml_desc)); + if (prefix) mLines.push_front(Line(prefix)); } -AIAlert::AIAlert(AIAlertPrefix const& prefix, modal_nt type, - std::string const& xml_desc, AIArgs const& args, - AIAlert const& alert) : mLines(alert.mLines), mModal(type) +Error::Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, AIArgs const& args, + Error const& alert) : mLines(alert.mLines), mModal(type) { if (alert.mModal == modal) mModal = modal; if (!mLines.empty()) { mLines.front().set_newline(); } - mLines.push_front(AIAlertLine(xml_desc, args)); - if (prefix) mLines.push_front(AIAlertLine(prefix)); + mLines.push_front(Line(xml_desc, args)); + if (prefix) mLines.push_front(Line(prefix)); } +} // namespace AIAlert + diff --git a/indra/llcommon/aialert.h b/indra/llcommon/aialert.h index 655a4890d..83a0da300 100644 --- a/indra/llcommon/aialert.h +++ b/indra/llcommon/aialert.h @@ -1,6 +1,6 @@ /** * @file aialert.h - * @brief Declaration of AIArgs, AIAlertPrefix, AIAlertLine, AIAlert and AIAlertCode + * @brief Declaration of AIArgs and AIAlert classes. * * Copyright (c) 2013, Aleric Inglewood. * @@ -26,6 +26,9 @@ * * 02/11/2013 * Initial version, written by Aleric Inglewood @ SL + * + * 05/11/2013 + * Moved everything in namespace AIAlert, except AIArgs. */ #ifndef AI_ALERT @@ -40,28 +43,28 @@ // Facility to throw errors that can easily be converted to an informative pop-up floater for the user. // Throw arbitrary class. -#define THROW_ALERT_CLASS(Alert, ...) throw Alert(AIAlertPrefix(), AIAlert::not_modal, __VA_ARGS__) -#define THROW_MALERT_CLASS(Alert, ...) throw Alert(AIAlertPrefix(), AIAlert::modal, __VA_ARGS__) -#define THROW_FALERT_CLASS(Alert, ...) throw Alert(AIAlertPrefix(__PRETTY_FUNCTION__, alert_line_pretty_function_prefix), AIAlert::not_modal, __VA_ARGS__) -#define THROW_FMALERT_CLASS(Alert, ...) throw Alert(AIAlertPrefix(__PRETTY_FUNCTION__, alert_line_pretty_function_prefix), AIAlert::modal, __VA_ARGS__) +#define THROW_ALERT_CLASS(Alert, ...) throw Alert(AIAlert::Prefix(), AIAlert::not_modal, __VA_ARGS__) +#define THROW_MALERT_CLASS(Alert, ...) throw Alert(AIAlert::Prefix(), AIAlert::modal, __VA_ARGS__) +#define THROW_FALERT_CLASS(Alert, ...) throw Alert(AIAlert::Prefix(__PRETTY_FUNCTION__, AIAlert::pretty_function_prefix), AIAlert::not_modal, __VA_ARGS__) +#define THROW_FMALERT_CLASS(Alert, ...) throw Alert(AIAlert::Prefix(__PRETTY_FUNCTION__, AIAlert::pretty_function_prefix), AIAlert::modal, __VA_ARGS__) -// Shortcut to throw AIAlert. -#define THROW_ALERT(...) THROW_ALERT_CLASS(AIAlert, __VA_ARGS__) -#define THROW_MALERT(...) THROW_MALERT_CLASS(AIAlert, __VA_ARGS__) -#define THROW_FALERT(...) THROW_FALERT_CLASS(AIAlert, __VA_ARGS__) -#define THROW_FMALERT(...) THROW_FMALERT_CLASS(AIAlert, __VA_ARGS__) +// Shortcut to throw AIAlert::Error. +#define THROW_ALERT(...) THROW_ALERT_CLASS(AIAlert::Error, __VA_ARGS__) +#define THROW_MALERT(...) THROW_MALERT_CLASS(AIAlert::Error, __VA_ARGS__) +#define THROW_FALERT(...) THROW_FALERT_CLASS(AIAlert::Error, __VA_ARGS__) +#define THROW_FMALERT(...) THROW_FMALERT_CLASS(AIAlert::Error, __VA_ARGS__) -// Shortcut to throw AIAlertCode. -#define THROW_ALERTC(...) THROW_ALERT_CLASS(AIAlertCode, __VA_ARGS__) -#define THROW_MALERTC(...) THROW_MALERT_CLASS(AIAlertCode, __VA_ARGS__) -#define THROW_FALERTC(...) THROW_FALERT_CLASS(AIAlertCode, __VA_ARGS__) -#define THROW_FMALERTC(...) THROW_FMALERT_CLASS(AIAlertCode, __VA_ARGS__) +// Shortcut to throw AIAlert::ErrorCode. +#define THROW_ALERTC(...) THROW_ALERT_CLASS(AIAlert::ErrorCode, __VA_ARGS__) +#define THROW_MALERTC(...) THROW_MALERT_CLASS(AIAlert::ErrorCode, __VA_ARGS__) +#define THROW_FALERTC(...) THROW_FALERT_CLASS(AIAlert::ErrorCode, __VA_ARGS__) +#define THROW_FMALERTC(...) THROW_FMALERT_CLASS(AIAlert::ErrorCode, __VA_ARGS__) -// Shortcut to throw AIAlertCode with errno as code. -#define THROW_ALERTE(...) do { int errn = errno; THROW_ALERT_CLASS(AIAlertCode, errn, __VA_ARGS__); } while(0) -#define THROW_MALERTE(...) do { int errn = errno; THROW_MALERT_CLASS(AIAlertCode, errn, __VA_ARGS__); } while(0) -#define THROW_FALERTE(...) do { int errn = errno; THROW_FALERT_CLASS(AIAlertCode, errn, __VA_ARGS__); } while(0) -#define THROW_FMALERTE(...) do { int errn = errno; THROW_FMALERT_CLASS(AIAlertCode, errn, __VA_ARGS__); } while(0) +// Shortcut to throw AIAlert::ErrorCode with errno as code. +#define THROW_ALERTE(...) do { int errn = errno; THROW_ALERT_CLASS(AIAlert::ErrorCode, errn, __VA_ARGS__); } while(0) +#define THROW_MALERTE(...) do { int errn = errno; THROW_MALERT_CLASS(AIAlert::ErrorCode, errn, __VA_ARGS__); } while(0) +#define THROW_FALERTE(...) do { int errn = errno; THROW_FALERT_CLASS(AIAlert::ErrorCode, errn, __VA_ARGS__); } while(0) +#define THROW_FMALERTE(...) do { int errn = errno; THROW_FMALERT_CLASS(AIAlert::ErrorCode, errn, __VA_ARGS__); } while(0) // Examples @@ -70,18 +73,18 @@ //---------------------------------------------------------- // To show the alert box: - catch (AIAlert const& alert) + catch (AIAlert::Error const& error) { - LLNotificationsUtil::add(alert); // Optionally pass alert_line_pretty_function_prefix as second parameter to *suppress* that output. + AIAlert::add(error); // Optionally pass pretty_function_prefix as second parameter to *suppress* that output. } // or, for example - catch (AIAlertCode const& alert) + catch (AIAlert::ErrorCode const& error) { - if (alert.getCode() != EEXIST) + if (error.getCode() != EEXIST) { - LLNotificationsUtil::add(alert, alert_line_pretty_function_prefix); + AIAlert::add(alert, AIAlert::pretty_function_prefix); } } //---------------------------------------------------------- @@ -89,15 +92,15 @@ THROW_ALERT("ExampleKey"); // A) Lookup "ExampleKey" in strings.xml and show translation. THROW_ALERT("ExampleKey", AIArgs("[FIRST]", first)("[SECOND]", second)(...etc...)); // B) Same as A, but replace [FIRST] with first, [SECOND] with second, etc. - THROW_ALERT("ExampleKey", alert); // C) As A, but followed by a colon and a newline, and then the text of 'alert'. - THROW_ALERT(alert, "ExampleKey"); // D) The text of 'alert', followed by a colon and a newline and then as A. - THROW_ALERT("ExampleKey", AIArgs("[FIRST]", first)("[SECOND]", second), alert); // E) As B, but followed by a colon and a newline, and then the text of 'alert'. - THROW_ALERT(alert, "ExampleKey", AIArgs("[FIRST]", first)("[SECOND]", second)); // F) The text of 'alert', followed by a colon and a newline and then as B. - // where 'alert' is a caught AIAlert object (as above) in a rethrow. + THROW_ALERT("ExampleKey", error); // C) As A, but followed by a colon and a newline, and then the text of 'error'. + THROW_ALERT(error, "ExampleKey"); // D) The text of 'error', followed by a colon and a newline and then as A. + THROW_ALERT("ExampleKey", AIArgs("[FIRST]", first)("[SECOND]", second), error); // E) As B, but followed by a colon and a newline, and then the text of 'error'. + THROW_ALERT(error, "ExampleKey", AIArgs("[FIRST]", first)("[SECOND]", second)); // F) The text of 'error', followed by a colon and a newline and then as B. + // where 'error' is a caught Error object (as above) in a rethrow. // Prepend ALERT with M and/or F to make the alert box Modal and/or prepend the text with the current function name. // For example, THROW_MFALERT("ExampleKey", AIArgs("[FIRST]", first)); // Throw a Modal alert box that is prefixed with the current Function name. - // Append E after ALERT to throw an AIAlertCode class that contains the current errno. + // Append E after ALERT to throw an ErrorCode class that contains the current errno. // For example, THROW_FALERTE("ExampleKey", AIArgs("[FIRST]", first)); // Throw an alert box that is prefixed with the current Function name and pass errno to the catcher. @@ -106,34 +109,6 @@ // //=================================================================================================================================== -enum alert_line_type_nt -{ - alert_line_normal = 0, - alert_line_empty_prefix = 1, - alert_line_pretty_function_prefix = 2 - // These must exist of single bits (a mask). -}; - -// An AIAlertPrefix currently comes only in two flavors: -// -// alert_line_empty_prefix : An empty prefix. -// alert_line_pretty_function_prefix : A function name prefix, this is the function from which the alert was thrown. - -class LL_COMMON_API AIAlertPrefix -{ - public: - AIAlertPrefix(void) : mType(alert_line_empty_prefix) { } - AIAlertPrefix(char const* str, alert_line_type_nt type) : mStr(str), mType(type) { } - - operator bool(void) const { return mType != alert_line_empty_prefix; } - alert_line_type_nt type(void) const { return mType; } - std::string const& str(void) const { return mStr; } - - private: - std::string mStr; // Literal text. For example a C++ function name. - alert_line_type_nt mType; // The type of this prefix. -}; - // A wrapper around LLStringUtil::format_map_t to allow constructing a dictionary // on one line by doing: // @@ -158,25 +133,62 @@ class LL_COMMON_API AIArgs LLStringUtil::format_map_t const& operator*() const { return mArgs; } }; +namespace AIAlert +{ + +enum modal_nt +{ + not_modal, + modal +}; + +enum alert_line_type_nt +{ + normal = 0, + empty_prefix = 1, + pretty_function_prefix = 2 + // These must exist of single bits (a mask). +}; + +// An Prefix currently comes only in two flavors: +// +// empty_prefix : An empty prefix. +// pretty_function_prefix : A function name prefix, this is the function from which the alert was thrown. + +class LL_COMMON_API Prefix +{ + public: + Prefix(void) : mType(empty_prefix) { } + Prefix(char const* str, alert_line_type_nt type) : mStr(str), mType(type) { } + + operator bool(void) const { return mType != empty_prefix; } + alert_line_type_nt type(void) const { return mType; } + std::string const& str(void) const { return mStr; } + + private: + std::string mStr; // Literal text. For example a C++ function name. + alert_line_type_nt mType; // The type of this prefix. +}; + // A class that represents one line with its replacements. // The string mXmlDesc shall be looked up in strings.xml. // This is not done as part of this class because LLTrans::getString // is not part of llcommon. -class LL_COMMON_API AIAlertLine +class LL_COMMON_API Line { private: bool mNewline; // Prepend this line with a newline if set. std::string mXmlDesc; // The keyword to look up in string.xml. AIArgs mArgs; // Replacement map. - alert_line_type_nt mType; // The type of this line: alert_line_normal for normal lines, other for prefixes. + alert_line_type_nt mType; // The type of this line: normal for normal lines, other for prefixes. public: - AIAlertLine(std::string const& xml_desc, bool newline = false) : mNewline(newline), mXmlDesc(xml_desc), mType(alert_line_normal) { } - AIAlertLine(std::string const& xml_desc, AIArgs const& args, bool newline = false) : mNewline(newline), mXmlDesc(xml_desc), mArgs(args), mType(alert_line_normal) { } - AIAlertLine(AIAlertPrefix const& prefix, bool newline = false) : mNewline(newline), mXmlDesc("AIPrefix"), mArgs("[PREFIX]", prefix.str()), mType(prefix.type()) { } + Line(std::string const& xml_desc, bool newline = false) : mNewline(newline), mXmlDesc(xml_desc), mType(normal) { } + Line(std::string const& xml_desc, AIArgs const& args, bool newline = false) : mNewline(newline), mXmlDesc(xml_desc), mArgs(args), mType(normal) { } + Line(Prefix const& prefix, bool newline = false) : mNewline(newline), mXmlDesc("AIPrefix"), mArgs("[PREFIX]", prefix.str()), mType(prefix.type()) { } // The destructor may not throw. - ~AIAlertLine() throw() { } + ~Line() throw() { } // Prepend a newline before this line. void set_newline(void) { mNewline = true; } @@ -188,7 +200,7 @@ class LL_COMMON_API AIAlertLine // Accessors. bool suppressed(unsigned int suppress_mask) const { return (suppress_mask & mType) != 0; } - bool is_prefix(void) const { return mType != alert_line_normal; } + bool is_prefix(void) const { return mType != normal; } }; // This class is used to throw an error that will cause @@ -200,82 +212,82 @@ class LL_COMMON_API AIAlertLine // The class represents multiple lines, each line is to be translated and catenated, // separated by newlines, and then written to an alert box. This is not done as part // of this class because LLTrans::getString and LLNotification is not part of llcommon. -// Instead call LLNotificationUtil::add(AIAlert const&). +// Instead call LLNotificationUtil::add(Error const&). -class LL_COMMON_API AIAlert : public std::exception +class LL_COMMON_API Error : public std::exception { public: - typedef std::deque lines_type; - enum modal_nt { not_modal, modal }; + typedef std::deque lines_type; // The destructor may not throw. - ~AIAlert() throw() { } + ~Error() throw() { } // Accessors. lines_type const& lines(void) const { return mLines; } bool is_modal(void) const { return mModal == modal; } // A string with zero or more replacements. - AIAlert(AIAlertPrefix const& prefix, modal_nt modal, - std::string const& xml_desc, AIArgs const& args = AIArgs()); + Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, AIArgs const& args = AIArgs()); // Same as above bit prepending the message with the text of another alert. - AIAlert(AIAlertPrefix const& prefix, modal_nt modal, - AIAlert const& alert, - std::string const& xml_desc, AIArgs const& args = AIArgs()); + Error(Prefix const& prefix, modal_nt type, + Error const& alert, + std::string const& xml_desc, AIArgs const& args = AIArgs()); // Same as above but appending the message with the text of another alert. // (no args) - AIAlert(AIAlertPrefix const& prefix, modal_nt modal, - std::string const& xml_desc, - AIAlert const& alert); + Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, + Error const& alert); // (with args) - AIAlert(AIAlertPrefix const& prefix, modal_nt modal, - std::string const& xml_desc, AIArgs const& args, - AIAlert const& alert); + Error(Prefix const& prefix, modal_nt type, + std::string const& xml_desc, AIArgs const& args, + Error const& alert); private: lines_type mLines; // The lines (or prefixes) of text to be displayed, each consisting on a keyword (to be looked up in strings.xml) and a replacement map. modal_nt mModal; // If true, make the alert box a modal floater. }; -// Same as AIAlert but allows to pass an additional error code. +// Same as Error but allows to pass an additional error code. -class LL_COMMON_API AIAlertCode : public AIAlert +class LL_COMMON_API ErrorCode : public Error { private: int mCode; public: // The destructor may not throw. - ~AIAlertCode() throw() { } + ~ErrorCode() throw() { } // Accessor. int getCode(void) const { return mCode; } // A string with zero or more replacements. - AIAlertCode(AIAlertPrefix const& prefix, modal_nt modal, int code, - std::string const& xml_desc, AIArgs const& args = AIArgs()) : - AIAlert(prefix, modal, xml_desc, args) { } + ErrorCode(Prefix const& prefix, modal_nt type, int code, + std::string const& xml_desc, AIArgs const& args = AIArgs()) : + Error(prefix, modal, xml_desc, args) { } // Same as above bit prepending the message with the text of another alert. - AIAlertCode(AIAlertPrefix const& prefix, modal_nt modal, int code, - AIAlert const& alert, - std::string const& xml_desc, AIArgs const& args = AIArgs()) : - AIAlert(prefix, modal, alert, xml_desc, args) { } + ErrorCode(Prefix const& prefix, modal_nt type, int code, + Error const& alert, + std::string const& xml_desc, AIArgs const& args = AIArgs()) : + Error(prefix, modal, alert, xml_desc, args) { } // Same as above but appending the message with the text of another alert. // (no args) - AIAlertCode(AIAlertPrefix const& prefix, modal_nt modal, int code, - std::string const& xml_desc, - AIAlert const& alert) : - AIAlert(prefix, modal, xml_desc, alert) { } + ErrorCode(Prefix const& prefix, modal_nt type, int code, + std::string const& xml_desc, + Error const& alert) : + Error(prefix, modal, xml_desc, alert) { } // (with args) - AIAlertCode(AIAlertPrefix const& prefix, modal_nt modal, int code, - std::string const& xml_desc, AIArgs const& args, - AIAlert const& alert) : - AIAlert(prefix, modal, xml_desc, args, alert) { } - + ErrorCode(Prefix const& prefix, modal_nt type, int code, + std::string const& xml_desc, AIArgs const& args, + Error const& alert) : + Error(prefix, modal, xml_desc, args, alert) { } }; +} // namespace AIAlert + #endif // AI_ALERT diff --git a/indra/llcommon/aifile.cpp b/indra/llcommon/aifile.cpp index 4013f3cf7..c963f5109 100644 --- a/indra/llcommon/aifile.cpp +++ b/indra/llcommon/aifile.cpp @@ -55,7 +55,7 @@ AIFile::~AIFile() int errn = errno; \ std::ostringstream error; \ error << LLFile::strerr(errn) << " (" << errn << ')'; \ - THROW_MALERT_CLASS(AIAlertCode, errn, __VA_ARGS__ ("[ERROR]", error.str())); \ + THROW_MALERT_CLASS(AIAlert::ErrorCode, errn, __VA_ARGS__ ("[ERROR]", error.str())); \ } while(0) //static diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 2f60b99fa..73dd99109 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1480,12 +1480,12 @@ LLNotificationPtr LLNotifications::add(const LLNotification::Params& p) return pNotif; } -LLNotificationPtr LLNotifications::add(AIAlert const& alert, unsigned int suppress_mask) +LLNotificationPtr LLNotifications::add(AIAlert::Error const& error, int type, unsigned int suppress_mask) { std::string alert_text; bool suppress_newlines = false; bool last_was_prefix = false; - for (AIAlert::lines_type::const_iterator line = alert.lines().begin(); line != alert.lines().end(); ++line) + for (AIAlert::Error::lines_type::const_iterator line = error.lines().begin(); line != error.lines().end(); ++line) { // Even if a line is suppressed, we print its leading newline if requested, but never more than one. if (!suppress_newlines && line->prepend_newline()) @@ -1503,7 +1503,7 @@ LLNotificationPtr LLNotifications::add(AIAlert const& alert, unsigned int suppre } LLSD substitutions = LLSD::emptyMap(); substitutions["[PAYLOAD]"] = alert_text; - return add(LLNotification::Params(alert.is_modal() ? "AIAlertModal" : "AIAlert").substitutions(substitutions)); + return add(LLNotification::Params((type == AIAlert::modal || error.is_modal()) ? "AIAlertModal" : "AIAlert").substitutions(substitutions)); } diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 4adfabbcb..bb769cae7 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -108,7 +108,7 @@ #include "llnotificationptr.h" #include "llnotificationcontext.h" -class AIAlert; +namespace AIAlert { class Error; } typedef enum e_notification_priority { @@ -739,7 +739,7 @@ public: const LLSD& substitutions, const LLSD& payload, LLNotificationFunctorRegistry::ResponseFunctor functor); - LLNotificationPtr add(AIAlert const& alert, unsigned int suppress_mask); + LLNotificationPtr add(AIAlert::Error const& error, int type, unsigned int suppress_mask); LLNotificationPtr add(const LLNotification::Params& p); void forceResponse(const LLNotification::Params& params, S32 option); diff --git a/indra/llui/llnotificationsutil.cpp b/indra/llui/llnotificationsutil.cpp index 13e2b897d..134a5c267 100644 --- a/indra/llui/llnotificationsutil.cpp +++ b/indra/llui/llnotificationsutil.cpp @@ -30,11 +30,46 @@ #include "llsd.h" #include "llxmlnode.h" // apparently needed to call LLNotifications::instance() -LLNotificationPtr LLNotificationsUtil::add(AIAlert const& alert, unsigned int suppress_mask) +namespace AIAlert { - return LLNotifications::instance().add(alert, suppress_mask); + +LLNotificationPtr add(Error const& error, modal_nt type, unsigned int suppress_mask) +{ + return LLNotifications::instance().add(error, type, suppress_mask); } +LLNotificationPtr add(std::string const& xml_desc, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, xml_desc, AIArgs()), type, 0); +} + +LLNotificationPtr add(std::string const& xml_desc, AIArgs const& args, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, xml_desc, args), type, 0); +} + +LLNotificationPtr add(Error const& error, std::string const& xml_desc, unsigned int suppress_mask, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, error, xml_desc, AIArgs()), type, suppress_mask); +} + +LLNotificationPtr add(Error const& error, std::string const& xml_desc, AIArgs const& args, unsigned int suppress_mask, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, error, xml_desc, args), type, suppress_mask); +} + +LLNotificationPtr add(std::string const& xml_desc, Error const& error, unsigned int suppress_mask, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, xml_desc, AIArgs(), error), type, suppress_mask); +} + +LLNotificationPtr add(std::string const& xml_desc, AIArgs const& args, Error const& error, unsigned int suppress_mask, modal_nt type) +{ + return LLNotifications::instance().add(Error(Prefix(), type, xml_desc, args, error), type, suppress_mask); +} + +} // namespace AIAlert + LLNotificationPtr LLNotificationsUtil::add(const std::string& name) { return LLNotifications::instance().add( diff --git a/indra/llui/llnotificationsutil.h b/indra/llui/llnotificationsutil.h index 586b0d0bc..fb0fb1ba4 100644 --- a/indra/llui/llnotificationsutil.h +++ b/indra/llui/llnotificationsutil.h @@ -30,16 +30,53 @@ // to avoid including the heavyweight llnotifications.h #include "llnotificationptr.h" +#include "aialert.h" #include class LLSD; -class AIAlert; + +namespace AIAlert +{ + // Add an alert directly to LLNotifications. + + // Look up xml_desc in strings.xml. + LLNotificationPtr add(std::string const& xml_desc, + modal_nt type = not_modal); + // ... with replacement args. + LLNotificationPtr add(std::string const& xml_desc, AIArgs const& args, + modal_nt type = not_modal); + + // Append it to an existing alert error. + LLNotificationPtr add(Error const& error, + std::string const& xml_desc, + unsigned int suppress_mask = 0, modal_nt type = not_modal); + LLNotificationPtr add(Error const& error, + std::string const& xml_desc, AIArgs const& args, + unsigned int suppress_mask = 0, modal_nt type = not_modal); + // Prepend it to an existing alert error. + LLNotificationPtr add(std::string const& xml_desc, + Error const& error, + unsigned int suppress_mask = 0, modal_nt type = not_modal); + LLNotificationPtr add(std::string const& xml_desc, AIArgs const& args, + Error const& error, + unsigned int suppress_mask = 0, modal_nt type = not_modal); + + // Just show the caught alert error. + LLNotificationPtr add(Error const& error, + modal_nt type = not_modal, unsigned int suppress_mask = 0); + + // Short cuts for enforcing modal alerts. + inline LLNotificationPtr add_modal(std::string const& xml_desc) { return add(xml_desc, modal); } + inline LLNotificationPtr add_modal(std::string const& xml_desc, AIArgs const& args) { return add(xml_desc, args, modal); } + inline LLNotificationPtr add_modal(Error const& error, std::string const& xml_desc, unsigned int suppress_mask = 0) { return add(error, xml_desc, suppress_mask, modal); } + inline LLNotificationPtr add_modal(Error const& error, std::string const& xml_desc, AIArgs const& args, unsigned int suppress_mask = 0) { return add(error, xml_desc, args, suppress_mask, modal); } + inline LLNotificationPtr add_modal(std::string const& xml_desc, Error const& error, unsigned int suppress_mask = 0) { return add(xml_desc, error, suppress_mask, modal); } + inline LLNotificationPtr add_modal(std::string const& xml_desc, AIArgs const& args, Error const& error, unsigned int suppress_mask = 0) { return add(xml_desc, args, error, suppress_mask, modal); } +} namespace LLNotificationsUtil { - LLNotificationPtr add(AIAlert const& alert, unsigned int suppress_mask = 0); // Singu extension. - LLNotificationPtr add(const std::string& name); LLNotificationPtr add(const std::string& name, diff --git a/indra/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp index 00890eb78..0df0663b9 100644 --- a/indra/newview/llfloatercustomize.cpp +++ b/indra/newview/llfloatercustomize.cpp @@ -336,8 +336,7 @@ void LLFloaterCustomize::onBtnImport_continued(AIFilePicker* filepicker) std::string const filename = filepicker->getFilename(); - LLSD args(LLSD::emptyMap()); - args["FILE"] = gDirUtilp->getBaseFileName(filename); + AIArgs args("[FILE]", gDirUtilp->getBaseFileName(filename)); bool found_param = false; bool found_texture = false; @@ -362,11 +361,7 @@ void LLFloaterCustomize::onBtnImport_continued(AIFilePicker* filepicker) if (!LLStringUtil::convertToU32(metaversion, metaversion_major) || metaversion_major > 1) { - llwarns << "Invalid or incompatible linden_genepool metaversion: " << metaversion << " in file: " << filename << llendl; - args["TAG"] = "metaversion"; - args["VERSIONMAJOR"] = "1"; - LLNotificationsUtil::add("AIXMLImportRootVersionError", args); - return; + THROW_MALERT("AIXMLImportRootVersionError", args("[TAG]", "metaversion")("[VERSIONMAJOR]", "1")); } //------------------------------------------------------------------------- @@ -436,9 +431,9 @@ void LLFloaterCustomize::onBtnImport_continued(AIFilePicker* filepicker) } } } - catch (AIAlert const& alert) + catch (AIAlert::Error const& error) { - LLNotificationsUtil::add(AIAlert(AIAlertPrefix(), AIAlert::modal, "AIXMLImportError", AIArgs("[TYPE]", label), alert)); + AIAlert::add_modal("AIXMLImportError", AIArgs("[TYPE]", label), error); return; } @@ -449,28 +444,25 @@ void LLFloaterCustomize::onBtnImport_continued(AIFilePicker* filepicker) panel_edit_wearable->updateScrollingPanelUI(); if (found_texture && different_grid) { - args["EXPORTGRID"] = gridnick; - args["CURRENTGRID"] = gHippoGridManager->getConnectedGrid()->getGridNick(); + args("[EXPORTGRID]", gridnick); + args("[CURRENTGRID]", gHippoGridManager->getConnectedGrid()->getGridNick()); if (mixed_grids) { - LLNotificationsUtil::add("AIXMLImportMixedGrid", args); + AIAlert::add_modal("AIXMLImportMixedGrid", args); } else { - LLNotificationsUtil::add("AIXMLImportDifferentGrid", args); + AIAlert::add_modal("AIXMLImportDifferentGrid", args); } } } else if (found_type) { - args["TYPE"] = label; - LLNotificationsUtil::add("AIXMLImportEmptyArchetype", args); + AIAlert::add("AIXMLImportEmptyArchetype", args("[TYPE]", label)); } else if (!wearable_types.empty()) { - args["TYPE"] = label; - args["ARCHETYPENAME"] = wearable_types; - LLNotificationsUtil::add("AIXMLImportWearableTypeMismatch", args); + AIAlert::add("AIXMLImportWearableTypeMismatch", args("[TYPE]", label)("[ARCHETYPENAME]", wearable_types)); } } @@ -527,24 +519,21 @@ void LLFloaterCustomize::onBtnExport_continued(LLViewerWearable* edit_wearable, bool success = false; try { - LLFILE* outfile = AIFile::fopen(filename, "wb"); + AIFile outfile(filename, "wb"); AIXMLLindenGenepool linden_genepool(outfile); linden_genepool.child(edit_wearable->getArchetype()); - AIFile::close(outfile); success = true; } - catch (AIAlert const& alert) + catch (AIAlert::Error const& error) { - LLNotificationsUtil::add(AIAlert(AIAlertPrefix(), AIAlert::modal, "AIXMLExportWriteError", AIArgs("[FILE]", filename), alert)); + AIAlert::add_modal("AIXMLExportWriteError", AIArgs("[FILE]", filename), error); } if (success) { - LLSD args(LLSD::emptyMap()); - args["FILE"] = filename; - LLNotificationsUtil::add("AIXMLExportSuccess", args); + AIAlert::add_modal("AIXMLExportSuccess", AIArgs("[FILE]", filename)); } } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f45787f25..c23def96e 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -8412,9 +8412,9 @@ void LLVOAvatar::dumpArchetypeXML_cont(std::string const& fullpath, bool group_b } #endif } - catch(AIAlert const& alert) + catch (AIAlert::Error const& error) { - LLNotificationsUtil::add(AIAlert(AIAlertPrefix(), AIAlert::modal, "AIXMLdumpArchetypeXMLError", AIArgs("[FILENAME]", fullpath), alert)); + AIAlert::add_modal("AIXMLdumpArchetypeXMLError", AIArgs("[FILE]", fullpath), error); } } diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 45fbc535a..6d6f2bba0 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -69,15 +69,6 @@ - Import Failure: the file "[FILE]" contains linden_genepool XML data with the wrong [TAG]. Version "[VERSIONMAJOR].0" or less is required. - - Import was successful but note that the wearable was exported on grid [EXPORTGRID] (and the current grid is [CURRENTGRID]). Texture UUIDs have NOT been applied! - - Import was successful but note that the wearable was exported on grid [EXPORTGRID] (and the current grid is [CURRENTGRID]). Texture UUIDs have been applied but might not exist here! - - Import Warning: the file "[FILE]" does not contain a wearable of type [TYPE]. -It contains an archetype of type [ARCHETYPENAME]. Please select the correct type before importing. - Der Besitzer der Parzelle möchte Ihren Viewer anweisen die folgende [TYPE] URL zu laden:[URL]Sie können die korrespondierende Domäne oder In-Welt Objekt-Skript-Server erlauben oder ablehnen."Erlauben" und "Verweigern" gelten nur für die aktuelle Sitzung, während "Immer sperren" bzw. "Immer erlauben" dann immer gelten.