/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-launch-win.c  dbus-launch utility
 *
 * Copyright (C) 2007 Ralf Habacker <ralf.habacker@freenet.de>
 *
 * Licensed under the Academic Free License version 2.1
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#include <config.h>
#ifndef UNICODE
#define UNICODE 1
#endif
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

/* Save string functions.  Instead of figuring out the exact _MSC_VER
   that work, override for everybody.  */

#define errno_t int
#define wcscat_s my_wcscat_s
#define wcscpy_s my_wcscpy_s

static errno_t
wcscat_s (wchar_t *dest, size_t size, wchar_t *src) 
{
  assert (sizeof (wchar_t) * (wcslen (dest) + wcslen (src) + 1) <= size);
  wcscat (dest, src);
  return 0;
}


static errno_t
wcscpy_s (wchar_t *dest, size_t size, wchar_t *src)
{
  assert (sizeof (wchar_t) * (wcslen (src) + 1) <= size);
  wcscpy (dest, src);
  return 0;
}

/* TODO (tl): This Windows version of dbus-launch is curretly rather
 * pointless as it doesn't take the same command-line options as the
 * UNIX dbus-launch does. A main point of the dbus-launch command is
 * to pass it for instance a --config-file option to make the started
 * dbus-daemon use that config file.
 * 
 * This version also doesn't print out any information, which is a
 * main point of the UNIX one. It should at least support the
 * --sh-syntax option, and maybe also a --cmd-syntax to print out the
 * variable settings in cmd.exe syntax?
 * 
 * NOTE (rh): The main task of dbus-launch is (from the man page) to start 
 * a session bus and this is archieved by the current implemention. 
 * 
 * Additional on windows the session bus starting in not integrated 
 * into the logon process, so there is no need for any --syntax option. 
 * In fact (at least for kde on windows) the session bus is autostarted 
 * with the first application requesting a session bus. 
 *
 */

#define AUTO_ACTIVATE_CONSOLE_WHEN_VERBOSE_MODE 1

#define DIM(x) (sizeof(x) / sizeof(x[0]))
#define WCSTRINGIFY_(x) L ## x
#define WCSTRINGIFY(x) WCSTRINGIFY_(x)

int
main (int argc, char **argv)
{
  wchar_t dbusDaemonPath[MAX_PATH * 2 + 1];
  wchar_t command[MAX_PATH * 2 + 1];
  wchar_t *p;
  wchar_t *daemon_name;
  int result;
  int showConsole = 0;
#ifdef DBUS_WINCE
  char *s = NULL;
#else
  char *s = getenv("DBUS_VERBOSE");
#endif
  int verbose = s && *s != '\0' ? 1 : 0;

  PROCESS_INFORMATION pi;
  STARTUPINFOW si;
  BOOL inherit = TRUE;
  DWORD flags = 0;

#ifdef AUTO_ACTIVATE_CONSOLE_WHEN_VERBOSE_MODE
  if (verbose)
      showConsole = 1; 
#endif
  GetModuleFileNameW (NULL, dbusDaemonPath, DIM (dbusDaemonPath));
  
  daemon_name = WCSTRINGIFY(DBUS_DAEMON_NAME) L".exe";
  
  if ((p = wcsrchr (dbusDaemonPath, L'\\'))) 
    {
      p[1] = L'\0';
      wcscat_s (dbusDaemonPath, sizeof (dbusDaemonPath), daemon_name);
    }
  else 
    {
      if (verbose)
          fprintf (stderr, "error: could not extract path from current "
                   "applications module filename\n");
      return 1;
    } 

#ifdef DBUS_WINCE
   /* Windows CE has a different interpretation of cmdline: Start with argv[1].  */
   wcscpy_s (command, sizeof (command), L"--session");
   if (verbose)
     fprintf (stderr, "%ls %ls\n", dbusDaemonPath, command);
#else
   command[0] = L'\0';
   /* Windows cmdline starts with path, which can contain spaces.  */
   wcscpy_s (command, sizeof (command), L"\"");
   wcscat_s (command, sizeof (command), dbusDaemonPath);
   wcscat_s (command, sizeof (command), L"\" --session");
   if (verbose)
     fprintf (stderr, "%ls\n", command);
#endif
  
  memset (&si, 0, sizeof (si));
  memset (&pi, 0, sizeof (pi));
  si.cb = sizeof (si);
  
  if (verbose)
    flags |= CREATE_NEW_CONSOLE;

#ifdef DBUS_WINCE
  inherit = FALSE;
#else
  flags |= NORMAL_PRIORITY_CLASS;
  if (!verbose)
    flags |= DETACHED_PROCESS;
#endif

  result = CreateProcessW (dbusDaemonPath, command, 0, 0,
                           inherit, flags, 0, 0, &si, &pi);

  if (result == 0) 
    {
      if (verbose)
        fprintf (stderr, "Could not start " DBUS_DAEMON_NAME ". error=%d\n",
                 GetLastError ());
      return 4;
    }
   
  CloseHandle (pi.hProcess);
  CloseHandle (pi.hThread);

  return 0;
}
