diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index a295e6ac49..cc07f41d09 100644
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -407,6 +407,53 @@ LLSD LLCrashLogger::constructPostData()
const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
+// Restore crash report user settings
+S32 LLCrashLogger::loadCrashBehaviorSetting()
+{
+ // First check user_settings (in the user's home dir)
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
+ if (! mCrashSettings.loadFromFile(filename))
+ {
+ // Next check app_settings (in the SL program dir)
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, CRASH_SETTINGS_FILE);
+ mCrashSettings.loadFromFile(filename);
+ }
+
+ // If we didn't load any files above, this will return the default
+ S32 value = mCrashSettings.getS32("CrashSubmitBehavior");
+
+ // Whatever value we got, make sure it's valid
+ switch (value)
+ {
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ return CRASH_BEHAVIOR_NEVER_SEND;
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ return CRASH_BEHAVIOR_ALWAYS_SEND;
+ }
+
+ return CRASH_BEHAVIOR_ASK;
+}
+
+bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
+{
+ switch (crash_behavior)
+ {
+ case CRASH_BEHAVIOR_ASK:
+ case CRASH_BEHAVIOR_NEVER_SEND:
+ case CRASH_BEHAVIOR_ALWAYS_SEND:
+ break;
+ default:
+ return false;
+ }
+
+ mCrashSettings.setS32("CrashSubmitBehavior", crash_behavior);
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
+ mCrashSettings.saveToFile(filename, FALSE);
+
+ return true;
+}
+//
+
std::string LLCrashLogger::loadCrashURLSetting()
{
@@ -606,6 +653,18 @@ bool LLCrashLogger::init()
"1 = always send crash report, "
"2 = never send crash report)");
+ // Restore crash report user settings
+ LL_INFOS("CRASHREPORT") << "Loading crash behavior setting" << LL_ENDL;
+ mCrashBehavior = loadCrashBehaviorSetting();
+
+ // If user doesn't want to send, bail out
+ if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
+ {
+ LL_INFOS("CRASHREPORT") << "Crash behavior is never_send, quitting" << LL_ENDL;
+ return false;
+ }
+ //
+
init_curl();
LLCore::HttpRequest::createService();
LLCore::HttpRequest::startThread();
diff --git a/indra/llcrashlogger/llcrashlogger.h b/indra/llcrashlogger/llcrashlogger.h
index 57dedb7232..ba9d99011c 100644
--- a/indra/llcrashlogger/llcrashlogger.h
+++ b/indra/llcrashlogger/llcrashlogger.h
@@ -68,6 +68,11 @@ public:
bool runCrashLogPost(std::string host, LLSD data, std::string msg, int retries, int timeout);
bool readMinidump(std::string minidump_path);
+ // Restore crash report user settings
+ S32 loadCrashBehaviorSetting();
+ bool saveCrashBehaviorSetting(S32 crash_behavior);
+ //
+
protected:
static void init_curl();
static void term_curl();
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index 3149fad6e8..1f078e6330 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -72,6 +72,14 @@ bool LLCrashLoggerMac::mainLoop()
gSendReport = true;
}
+ // Restore crash report user settings
+ if(gRememberChoice)
+ {
+ if(gSendReport) saveCrashBehaviorSetting(CRASH_BEHAVIOR_ALWAYS_SEND);
+ else saveCrashBehaviorSetting(CRASH_BEHAVIOR_NEVER_SEND);
+ }
+ //
+
if(gSendReport)
{
setUserText(gUserNotes);
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index 306c2362d7..42ba1f56d0 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -174,6 +174,24 @@ bool handle_button_click(WORD button_id)
return false;
}
+ // Restore crash report user settings
+ // See if "do this next time" is checked and save state
+ S32 crash_behavior = CRASH_BEHAVIOR_ASK;
+ LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_GETCHECK, 0, 0);
+ if (result == BST_CHECKED)
+ {
+ if (button_id == IDOK)
+ {
+ crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND;
+ }
+ else if (button_id == IDCANCEL)
+ {
+ crash_behavior = CRASH_BEHAVIOR_NEVER_SEND;
+ }
+ ((LLCrashLoggerWindows*)LLCrashLogger::instance())->saveCrashBehaviorSetting(crash_behavior);
+ }
+ //
+
// We're done with this dialog.
gFirstDialog = FALSE;