summaryrefslogtreecommitdiff
path: root/indra/newview/llappviewerwin32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llappviewerwin32.cpp')
-rw-r--r--indra/newview/llappviewerwin32.cpp87
1 files changed, 63 insertions, 24 deletions
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 5f3bf14bc2..f9df2b88ed 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -68,29 +68,30 @@
#include "stringize.h"
#include "lldir.h"
+#include <fstream>
#include <exception>
// Bugsplat (http://bugsplat.com) crash reporting tool
#ifdef LL_BUGSPLAT
#include "BugSplat.h"
+#include "reader.h" // JsonCpp
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*.
+ // plain wchar_t*. It would be nice if, when wchar_t is the same as
+ // __wchar_t, this whole function would optimize away. However, we use it
+ // only for the arguments to make exactly one call to initialize BugSplat.
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.
+ // classic-C function pointer instead of an arbitrary C++ callable. If it
+ // did accept a modern callable, we could pass a lambda that binds our
+ // MiniDmpSender pointer. As things stand, though, we must define an
+ // actual function and store the pointer statically.
static MiniDmpSender *sBugSplatSender = nullptr;
bool bugsplatSendLog(UINT nCode, LPVOID lpVal1, LPVOID lpVal2)
@@ -549,22 +550,60 @@ bool LLAppViewerWin32::init()
#else // LL_BUGSPLAT
- std::wstring version_string(WSTRINGIZE(LL_VIEWER_VERSION_MAJOR << '.' <<
- LL_VIEWER_VERSION_MINOR << '.' <<
- LL_VIEWER_VERSION_PATCH << '.' <<
- LL_VIEWER_VERSION_BUILD));
-
- // 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)
- << stringize(version_string) << ')' << LL_ENDL;
+ if (gDirUtilp)
+ {
+ LL_WARNS() << "Can't initialize BugSplat, gDirUtilp not yet set" << LL_ENDL;
+ }
+ else
+ {
+ std::string build_data_fname(
+ gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "build_data.json"));
+ std::ifstream inf(build_data_fname.c_str());
+ if (! inf.open())
+ {
+ LL_WARNS() << "Can't initialize BugSplat, can't read '" << build_data_fname
+ << "'" << LL_ENDL;
+ }
+ else
+ {
+ Json::Reader reader;
+ Json::Value build_data;
+ if (! reader.parse(inf, build_data, false)) // don't collect comments
+ {
+ LL_WARNS() << "Can't initialize BugSplat, can't parse '" << build_data_fname
+ << "': " << reader.getFormattedErrorMessages() << LL_ENDL;
+ }
+ else
+ {
+ Json::Value BugSplat_DB = build_data["BugSplat DB"];
+ if (! BugSplat_DB)
+ {
+ LL_WARNS() << "Can't initialize BugSplat, no 'BugSplat DB' entry in '"
+ << build_data_fname "'" << LL_ENDL;
+ }
+ else
+ {
+ // Got BugSplat_DB, onward!
+ std::wstring version_string(WSTRINGIZE(LL_VIEWER_VERSION_MAJOR << '.' <<
+ LL_VIEWER_VERSION_MINOR << '.' <<
+ LL_VIEWER_VERSION_PATCH << '.' <<
+ LL_VIEWER_VERSION_BUILD));
+
+ // have to convert normal wide strings to strings of __wchar_t
+ sBugSplatSender = new MiniDmpSender(
+ wunder(BugSplat_DB).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)
+ << stringize(version_string) << ')' << LL_ENDL;
+ } // got BugSplat_DB
+ } // parsed build_data.json
+ } // opened build_data.json
+ } // gDirUtilp set
#endif // LL_BUGSPLAT
#endif // LL_SEND_CRASH_REPORTS