llcrashloggerlinux.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcrashloggerlinux.cpp
  3.  * @brief Linux crash logger implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llcrashloggerlinux.h"
  33. #include <iostream>
  34. #include "linden_common.h"
  35. #include "boost/tokenizer.hpp"
  36. #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
  37. #include "llerror.h"
  38. #include "llfile.h"
  39. #include "lltimer.h"
  40. #include "llstring.h"
  41. #include "lldir.h"
  42. #include "llsdserialize.h"
  43. #if LL_GTK
  44. # include "gtk/gtk.h"
  45. #endif // LL_GTK
  46. #define MAX_LOADSTRING 100
  47. // These need to be localized.
  48. static const char dialog_text[] =
  49. "Second Life appears to have crashed or frozen last time it ran.n"
  50. "This crash reporter collects information about your computer's hardware, operating system, and some Second Life logs, all of which are used for debugging purposes only.n"
  51. "n"
  52. "Send crash report?";
  53. static const char dialog_title[] =
  54. "Second Life Crash Logger";
  55. #if LL_GTK
  56. static void response_callback (GtkDialog *dialog,
  57.        gint       arg1,
  58.        gpointer   user_data)
  59. {
  60. gint *response = (gint*)user_data;
  61. *response = arg1;
  62. gtk_widget_destroy(GTK_WIDGET(dialog));
  63. gtk_main_quit();
  64. }
  65. #endif // LL_GTK
  66. static BOOL do_ask_dialog(void)
  67. {
  68. #if LL_GTK
  69. gtk_disable_setlocale();
  70. if (!gtk_init_check(NULL, NULL)) {
  71. llinfos << "Could not initialize GTK for 'ask to send crash report' dialog; not sending report." << llendl;
  72. return FALSE;
  73. }
  74. GtkWidget *win = NULL;
  75. GtkDialogFlags flags = GTK_DIALOG_MODAL;
  76. GtkMessageType messagetype = GTK_MESSAGE_QUESTION;
  77. GtkButtonsType buttons = GTK_BUTTONS_YES_NO;
  78. gint response = GTK_RESPONSE_NONE;
  79. win = gtk_message_dialog_new(NULL,
  80.      flags, messagetype, buttons,
  81.      "%s", dialog_text);
  82. gtk_window_set_type_hint(GTK_WINDOW(win),
  83.  GDK_WINDOW_TYPE_HINT_DIALOG);
  84. gtk_window_set_title(GTK_WINDOW(win), dialog_title);
  85. g_signal_connect (win,
  86.   "response", 
  87.   G_CALLBACK (response_callback),
  88.   &response);
  89. gtk_widget_show_all (win);
  90. gtk_main();
  91. return (GTK_RESPONSE_OK == response ||
  92. GTK_RESPONSE_YES == response ||
  93. GTK_RESPONSE_APPLY == response);
  94. #else
  95. return FALSE;
  96. #endif // LL_GTK
  97. }
  98. LLCrashLoggerLinux::LLCrashLoggerLinux(void)
  99. {
  100. }
  101. LLCrashLoggerLinux::~LLCrashLoggerLinux(void)
  102. {
  103. }
  104. void LLCrashLoggerLinux::gatherPlatformSpecificFiles()
  105. {
  106. mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str();
  107. }
  108. bool LLCrashLoggerLinux::mainLoop()
  109. {
  110. bool send_logs = true;
  111. if(CRASH_BEHAVIOR_ASK == getCrashBehavior())
  112. {
  113. send_logs = do_ask_dialog();
  114. }
  115. else if(CRASH_BEHAVIOR_NEVER_SEND == getCrashBehavior())
  116. {
  117. send_logs = false;
  118. }
  119. if(send_logs)
  120. {
  121. sendCrashLogs();
  122. }
  123. return true;
  124. }
  125. void LLCrashLoggerLinux::updateApplication(const std::string& message)
  126. {
  127. LLCrashLogger::updateApplication(message);
  128. }