toolkit/xre/nsNativeAppSupportWin.cpp
author Dave Townsend <dtownsend@oxymoronical.com>
Wed, 06 Feb 2019 14:18:35 -0800
changeset 520645 fe3cd9f0d12bae82190bd17ea474d1a2f4bb80a2
parent 520644 61ed2a0798487c50c5faf70241aa637d01da6b10
child 525473 7cb86942ed34f38e03e7f2a0eefee0a3141980b5
permissions -rw-r--r--
Bug 1518639: Implement windows remoting server and client. r=jimm Implements the windows remove client and server based on the current remoting code in nsNativeAppSupportWin.cpp. Makes the hidden window classname encode both program name and profile name. nsNativeAppSupportWin is now just used for setting up the console. Differential Revision: https://phabricator.services.mozilla.com/D19076

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsNativeAppSupportBase.h"
#include "nsNativeAppSupportWin.h"

#include <windows.h>
#include <fcntl.h>

using namespace mozilla;

/*
 * This code attaches the process to the appropriate console.
 */

class nsNativeAppSupportWin : public nsNativeAppSupportBase {
 public:
  // Utility function to handle a Win32-specific command line
  // option: "--console", which dynamically creates a Windows
  // console.
  void CheckConsole();

 private:
  ~nsNativeAppSupportWin() {}
};  // nsNativeAppSupportWin

void UseParentConsole() {
  if (AttachConsole(ATTACH_PARENT_PROCESS)) {
    // Redirect the standard streams to the existing console, but
    // only if they haven't been redirected to a valid file.
    // Visual Studio's _fileno() returns -2 for the standard
    // streams if they aren't associated with an output stream.
    if (_fileno(stdout) == -2) {
      freopen("CONOUT$", "w", stdout);
    }
    // There is no CONERR$, so use CONOUT$ for stderr as well.
    if (_fileno(stderr) == -2) {
      freopen("CONOUT$", "w", stderr);
    }
    if (_fileno(stdin) == -2) {
      freopen("CONIN$", "r", stdin);
    }
  }
}

void nsNativeAppSupportWin::CheckConsole() {
  for (int i = 1; i < gArgc; ++i) {
    if (strcmp("-console", gArgv[i]) == 0 ||
        strcmp("--console", gArgv[i]) == 0 ||
        strcmp("/console", gArgv[i]) == 0) {
      if (AllocConsole()) {
        // Redirect the standard streams to the new console, but
        // only if they haven't been redirected to a valid file.
        // Visual Studio's _fileno() returns -2 for the standard
        // streams if they aren't associated with an output stream.
        if (_fileno(stdout) == -2) {
          freopen("CONOUT$", "w", stdout);
        }
        // There is no CONERR$, so use CONOUT$ for stderr as well.
        if (_fileno(stderr) == -2) {
          freopen("CONOUT$", "w", stderr);
        }
        if (_fileno(stdin) == -2) {
          freopen("CONIN$", "r", stdin);
        }
      }
    } else if (strcmp("-attach-console", gArgv[i]) == 0 ||
               strcmp("--attach-console", gArgv[i]) == 0 ||
               strcmp("/attach-console", gArgv[i]) == 0) {
      UseParentConsole();
    }
  }
}

// Create and return an instance of class nsNativeAppSupportWin.
nsresult NS_CreateNativeAppSupport(nsINativeAppSupport **aResult) {
  nsNativeAppSupportWin *pNative = new nsNativeAppSupportWin;
  if (!pNative) return NS_ERROR_OUT_OF_MEMORY;

  // Check for dynamic console creation request.
  pNative->CheckConsole();

  *aResult = pNative;
  NS_ADDREF(*aResult);

  return NS_OK;
}