win: Start as crash service when ATOM_SHELL_INTERNAL_CRASH_SERVICE is set.
authorCheng Zhao <zcbenz@gmail.com>
Sun, 24 Nov 2013 09:35:58 +0000 (17:35 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Sun, 24 Nov 2013 09:35:58 +0000 (17:35 +0800)
app/atom_main.cc
atom.gyp
common/crash_reporter/win/crash_service_main.cc
common/crash_reporter/win/crash_service_main.h

index 2b0366d..c673fda 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "app/atom_main_delegate.h"
 #include "base/environment.h"
+#include "common/crash_reporter/win/crash_service_main.h"
 #include "content/public/app/startup_helper_win.h"
 #include "sandbox/win/src/sandbox_types.h"
 #else  // defined(OS_WIN)
@@ -47,7 +48,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
     freopen_s(&dontcare, "CON", "r", stdin);
   }
 
-  std::string node_indicator;
+  std::string node_indicator, crash_service_indicator;
   if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) &&
       node_indicator == "1") {
     // Convert argv to to UTF8
@@ -85,6 +86,10 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
     }
     // Now that conversion is done, we can finally start.
     return node::Start(argc, argv);
+  } else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE",
+                         &crash_service_indicator) &&
+      crash_service_indicator == "1") {
+    return crash_service::Main(cmd);
   }
 
   sandbox::SandboxInterfaceInfo sandbox_info = {0};
index 253f7b1..4bb0dfc 100644 (file)
--- a/atom.gyp
+++ b/atom.gyp
               '-limm32.lib',
               '-loleacc.lib',
               '-lComdlg32.lib',
+              '-lWininet.lib',
               '<(atom_source_root)/<(libchromiumcontent_library_dir)/chromiumviews.lib',
             ],
           },
index 172a8e0..fa2f450 100644 (file)
@@ -4,10 +4,37 @@
 
 #include "common/crash_reporter/win/crash_service_main.h"
 
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "base/logging.h"
+#include "common/crash_reporter/win/crash_service.h"
+
 namespace crash_service {
 
-int Main() {
-  return 0;
+int Main(const wchar_t* cmd_line) {
+  // Initialize all Chromium things.
+  base::AtExitManager exit_manager;
+  CommandLine::Init(0, NULL);
+
+  VLOG(1) << "Session start. cmdline is [" << cmd_line << "]";
+
+  wchar_t temp_dir[MAX_PATH] = { 0 };
+  ::GetTempPathW(MAX_PATH, temp_dir);
+  base::FilePath temp_path(temp_dir);
+
+  breakpad::CrashService crash_service;
+  if (!crash_service.Initialize(temp_path, temp_path))
+    return 1;
+
+  VLOG(1) << "Ready to process crash requests";
+
+  // Enter the message loop.
+  int retv = crash_service.ProcessingLoop();
+  // Time to exit.
+  VLOG(1) << "Session end. return code is " << retv;
+  return retv;
 }
 
 }  // namespace crash_service
index 27af5d7..3dd06f2 100644 (file)
@@ -8,7 +8,7 @@
 namespace crash_service {
 
 // Program entry, should be called by main();
-int Main();
+int Main(const wchar_t* cmd_line);
 
 }  // namespace crash_service