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;