aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llappviewerwin32.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--linden/indra/newview/llappviewerwin32.cpp104
1 files changed, 80 insertions, 24 deletions
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp
index 9f37534..bf02087 100644
--- a/linden/indra/newview/llappviewerwin32.cpp
+++ b/linden/indra/newview/llappviewerwin32.cpp
@@ -64,7 +64,7 @@
64 64
65#include "llcommandlineparser.h" 65#include "llcommandlineparser.h"
66 66
67//*FIX:Mani - This hack is to fix a linker issue with libndofdev.lib 67// *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib
68// The lib was compiled under VS2005 - in VS2003 we need to remap assert 68// The lib was compiled under VS2005 - in VS2003 we need to remap assert
69#ifdef LL_DEBUG 69#ifdef LL_DEBUG
70#ifdef LL_MSVC7 70#ifdef LL_MSVC7
@@ -77,6 +77,8 @@ extern "C" {
77#endif 77#endif
78#endif 78#endif
79 79
80const std::string LLAppViewerWin32::sWindowClass = "Second Life";
81
80LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) 82LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
81{ 83{
82 // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. 84 // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
@@ -91,6 +93,7 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
91 if (LLApp::isError()) 93 if (LLApp::isError())
92 { 94 {
93 llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; 95 llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
96
94 retval = EXCEPTION_EXECUTE_HANDLER; 97 retval = EXCEPTION_EXECUTE_HANDLER;
95 return retval; 98 return retval;
96 } 99 }
@@ -119,7 +122,6 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
119 return retval; 122 return retval;
120} 123}
121 124
122
123#if DEBUGGING_SEH_FILTER 125#if DEBUGGING_SEH_FILTER
124# define WINMAIN DebuggingWinMain 126# define WINMAIN DebuggingWinMain
125#else 127#else
@@ -195,6 +197,19 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
195 } 197 }
196 delete viewer_app_ptr; 198 delete viewer_app_ptr;
197 viewer_app_ptr = NULL; 199 viewer_app_ptr = NULL;
200
201 //start updater
202 if(LLAppViewer::sUpdaterInfo)
203 {
204#if LL_WINDOWS
205 _spawnl(_P_NOWAIT, LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str(), LLAppViewer::sUpdaterInfo->mParams.str().c_str(), NULL);
206#elif LL_DARWIN
207 system(LLAppViewer::sUpdaterInfo->mUpdateExePath.c_str()); /* Flawfinder: ignore */
208#endif
209 delete LLAppViewer::sUpdaterInfo ;
210 LLAppViewer::sUpdaterInfo = NULL ;
211 }
212
198 return 0; 213 return 0;
199} 214}
200 215
@@ -324,6 +339,17 @@ bool LLAppViewerWin32::cleanup()
324 return result; 339 return result;
325} 340}
326 341
342bool LLAppViewerWin32::initLogging()
343{
344 // Remove the crash stack log from previous executions.
345 // Since we've started logging a new instance of the app, we can assume
346 // *NOTE: This should happen before the we send a 'previous instance froze'
347 // crash report, but it must happen after we initialize the DirUtil.
348 LLWinDebug::clearCrashStacks();
349
350 return LLAppViewer::initLogging();
351}
352
327void LLAppViewerWin32::initConsole() 353void LLAppViewerWin32::initConsole()
328{ 354{
329 // pop up debug console 355 // pop up debug console
@@ -405,7 +431,7 @@ bool LLAppViewerWin32::initHardwareTest()
405 LLSplashScreen::update(splash_msg.str()); 431 LLSplashScreen::update(splash_msg.str());
406 } 432 }
407 433
408 if (!LLWinDebug::checkExceptionHandler()) 434 if (!restoreErrorTrap())
409 { 435 {
410 LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL; 436 LL_WARNS("AppInit") << " Someone took over my exception handler (post hardware probe)!" << LL_ENDL;
411 } 437 }
@@ -445,39 +471,69 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
445 return true; 471 return true;
446} 472}
447 473
474bool LLAppViewerWin32::restoreErrorTrap()
475{
476 return LLWinDebug::checkExceptionHandler();
477}
478
448void LLAppViewerWin32::handleSyncCrashTrace() 479void LLAppViewerWin32::handleSyncCrashTrace()
449{ 480{
450 // do nothing 481 // do nothing
451} 482}
452 483
453void LLAppViewerWin32::handleCrashReporting() 484void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
454{ 485{
455 // Windows only behaivor. Spawn win crash reporter. 486 const char* logger_name = "win_crash_logger.exe";
456 std::string exe_path = gDirUtilp->getAppRODataDir(); 487 std::string exe_path = gDirUtilp->getExecutableDir();
457 exe_path += gDirUtilp->getDirDelimiter(); 488 exe_path += gDirUtilp->getDirDelimiter();
458 exe_path += "win_crash_logger.exe"; 489 exe_path += logger_name;
459 490
460 std::string arg_string = "-user "; 491 const char* arg_str = logger_name;
461 arg_string += LLViewerLogin::getInstance()->getGridLabel(); 492
462 493 // *NOTE:Mani - win_crash_logger.exe no longer parses command line options.
463 S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); 494 if(reportFreeze)
464 switch(cb) 495 {
496 // Spawn crash logger.
497 // NEEDS to wait until completion, otherwise log files will get smashed.
498 _spawnl(_P_WAIT, exe_path.c_str(), arg_str, NULL);
499 }
500 else
501 {
502 S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
503 if(cb != CRASH_BEHAVIOR_NEVER_SEND)
504 {
505 _spawnl(_P_NOWAIT, exe_path.c_str(), arg_str, NULL);
506 }
507 }
508}
509
510//virtual
511bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url)
512{
513 wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars.
514 mbstowcs(window_class, sWindowClass.c_str(), 255);
515 window_class[255] = 0;
516 // Use the class instead of the window name.
517 HWND other_window = FindWindow(window_class, NULL);
518
519 if (other_window != NULL)
465 { 520 {
466 case CRASH_BEHAVIOR_ASK: 521 lldebugs << "Found other window with the name '" << getWindowTitle() << "'" << llendl;
467 default: 522 COPYDATASTRUCT cds;
468 arg_string += " -dialog "; 523 const S32 SLURL_MESSAGE_TYPE = 0;
469 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); 524 cds.dwData = SLURL_MESSAGE_TYPE;
470 break; 525 cds.cbData = url.length() + 1;
471 526 cds.lpData = (void*)url.c_str();
472 case CRASH_BEHAVIOR_ALWAYS_SEND: 527
473 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); 528 LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
474 break; 529 lldebugs << "SendMessage(WM_COPYDATA) to other window '"
475 530 << getWindowTitle() << "' returned " << msg_result << llendl;
476 case CRASH_BEHAVIOR_NEVER_SEND: 531 return true;
477 break;
478 } 532 }
533 return false;
479} 534}
480 535
536
481std::string LLAppViewerWin32::generateSerialNumber() 537std::string LLAppViewerWin32::generateSerialNumber()
482{ 538{
483 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore 539 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore