When passing --atom-child_process-fork, run like upstream node.
authorCheng Zhao <zcbenz@gmail.com>
Thu, 8 Aug 2013 07:59:31 +0000 (15:59 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Thu, 8 Aug 2013 08:57:07 +0000 (16:57 +0800)
app/atom_main.cc
vendor/node

index 1811a40..6b817e0 100644 (file)
@@ -2,27 +2,76 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <string.h>
+
 #include "content/public/app/content_main.h"
 
+namespace node {
+int Start(int argc, char *argv[]);
+}
+
 #if defined(OS_WIN)
 
+#include <stringapiset.h>  // NOLINT
+
 #include "app/atom_main_delegate.h"
 #include "content/public/app/startup_helper_win.h"
 #include "sandbox/win/src/sandbox_types.h"
 
-int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t*, int) {
+int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* wargv, int argc) {
+  if (argc > 1 && wcscmp(wargv[1], L"--atom-child_process-fork") == 0) {
+    // Convert argv to to UTF8
+    char** argv = new char*[argc];
+    for (int i = 0; i < argc; i++) {
+      // Compute the size of the required buffer
+      DWORD size = WideCharToMultiByte(CP_UTF8,
+                                       0,
+                                       wargv[i],
+                                       -1,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       NULL);
+      if (size == 0) {
+        // This should never happen.
+        fprintf(stderr, "Could not convert arguments to utf8.");
+        exit(1);
+      }
+      // Do the actual conversion
+      argv[i] = new char[size];
+      DWORD result = WideCharToMultiByte(CP_UTF8,
+                                         0,
+                                         wargv[i],
+                                         -1,
+                                         argv[i],
+                                         size,
+                                         NULL,
+                                         NULL);
+      if (result == 0) {
+        // This should never happen.
+        fprintf(stderr, "Could not convert arguments to utf8.");
+        exit(1);
+      }
+    }
+    // Now that conversion is done, we can finally start.
+    return node::Start(argc - 1, argv + 1);
+  }
+
   sandbox::SandboxInterfaceInfo sandbox_info = {0};
   content::InitializeSandboxInfo(&sandbox_info);
   atom::AtomMainDelegate delegate;
   return content::ContentMain(instance, &sandbox_info, &delegate);
 }
 
-#else
+#else  // defined(OS_WIN)
 
 #include "app/atom_library_main.h"
 
 int main(int argc, const char* argv[]) {
+  if (argc > 1 && strcmp(argv[1], "--atom-child_process-fork") == 0)
+    return node::Start(argc - 1, const_cast<char**>(argv + 1));
+
   return AtomMain(argc, argv);
 }
 
-#endif  // OS_WIN
+#endif
index f8c96a6..1383b3f 160000 (submodule)
@@ -1 +1 @@
-Subproject commit f8c96a66ee6c7a31ff3fbf21547b28b65517eed8
+Subproject commit 1383b3f5eb7a8ad385d2b408348c1bd1894bd6bf