summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llappviewerwin32.cpp73
1 files changed, 48 insertions, 25 deletions
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 8a014c55d7..5f3bf14bc2 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -74,9 +74,45 @@
#ifdef LL_BUGSPLAT
#include "BugSplat.h"
-// FIXME: need a production BugSplat database name
-static const wchar_t *bugdb_name = L"second_life_callum_test";
-#endif
+namespace
+{
+ // FIXME: need a production BugSplat database name
+ static const wchar_t *bugdb_name = L"second_life_callum_test";
+
+ // MiniDmpSender's constructor is defined to accept __wchar_t* instead of
+ // plain wchar_t*.
+ inline std::basic_string<__wchar_t> wunder(const std::wstring& str)
+ {
+ return { str.begin(), str.end() };
+ }
+
+ // Irritatingly, MiniDmpSender::setCallback() is defined to accept a
+ // classic-C function pointer instead of an arbitrary C++ callable. In the
+ // latter case, we could pass a lambda that binds our MiniDmpSender
+ // pointer. As things stand, we must define an actual function and store
+ // the pointer statically.
+ static MiniDmpSender *sBugSplatSender = nullptr;
+
+ bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2)
+ {
+ // If we haven't yet initialized LLDir, don't bother trying to
+ // find our log file.
+ // Alternatively -- if we might encounter trouble trying to query
+ // LLDir during crash cleanup -- consider making gDirUtilp an
+ // LLPounceable, and attach a callback that stores the pathname to
+ // the log file here.
+ if (nCode == MDSCB_EXCEPTIONCODE && gDirUtilp)
+ {
+ // send the main viewer log file
+ // widen to wstring, convert to __wchar_t, then pass c_str()
+ sBugSplatSender->sendAdditionalFile(
+ wunder(wstringize(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log"))).c_str());
+ }
+
+ return false;
+ }
+}
+#endif // LL_BUGSPLAT
namespace
{
@@ -518,30 +554,17 @@ bool LLAppViewerWin32::init()
LL_VIEWER_VERSION_PATCH << '.' <<
LL_VIEWER_VERSION_BUILD));
- auto sender = new MiniDmpSender(
- bugdb_name, LL_TO_WSTRING(LL_VIEWER_CHANNEL), version_string.c_str(), nullptr);
- sender->setCallback(
- [sender](unsigned int nCode, void* lpVal1, void* lpVal2)
- {
- // If we haven't yet initialized LLDir, don't bother trying to
- // find our log file.
- // Alternatively -- if we might encounter trouble trying to query
- // LLDir during crash cleanup -- consider making gDirUtilp an
- // LLPounceable, and attach a callback that stores the pathname to
- // the log file here.
- if (nCode == MDSCB_EXCEPTIONCODE && gDirUtilp)
- {
- // send the main viewer log file
- // widen to wstring, then pass c_str()
- sender->sendAdditionalFile(
- wstringize(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")).c_str());
- }
-
- return false;
- });
+ // have to convert normal wide strings to strings of __wchar_t
+ sBugSplatSender = new MiniDmpSender(
+ wunder(bugdb_name).c_str(),
+ wunder(LL_TO_WSTRING(LL_VIEWER_CHANNEL)).c_str(),
+ wunder(version_string).c_str(),
+ nullptr);
+ sBugSplatSender->setCallback(bugsplatSendLog);
+ // engage stringize() overload that converts from wstring
LL_INFOS() << "Engaged BugSplat(" << LL_TO_STRING(LL_VIEWER_CHANNEL)
- << version_string << ')' << LL_ENDL;
+ << stringize(version_string) << ')' << LL_ENDL;
#endif // LL_BUGSPLAT
#endif // LL_SEND_CRASH_REPORTS