]> git.sesse.net Git - vlc/blobdiff - modules/control/ntservice.c
* Lets at the very least remove icons we don't use anymore. Should save some space.
[vlc] / modules / control / ntservice.c
old mode 100755 (executable)
new mode 100644 (file)
index 6cb8d1d..0a097dc
@@ -1,10 +1,10 @@
 /*****************************************************************************
  * ntservice.c: Windows NT/2K/XP service interface
  *****************************************************************************
- * Copyright (C) 2004 VideoLAN
- * $Id: ntservice.c,v 1.5 2004/01/25 16:17:03 anil Exp $
+ * Copyright (C) 2004 the VideoLAN team
+ * $Id$
  *
- * Authors: Gildas Bazin <gbazin@netcourrier.com>
+ * Authors: Gildas Bazin <gbazin@videolan.org>
  *
  * 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
 static int  Activate( vlc_object_t * );
 static void Close   ( vlc_object_t * );
 
-#define INSTALL_TEXT N_( "Install NT/2K/XP service" )
+#define INSTALL_TEXT N_( "Install Windows Service" )
 #define INSTALL_LONGTEXT N_( \
-    "If enabled the interface will install the service and exit." )
-#define UNINSTALL_TEXT N_( "Uninstall NT/2K/XP service" )
+    "If enabled the interface will install the Service and exit." )
+#define UNINSTALL_TEXT N_( "Uninstall Windows Service" )
 #define UNINSTALL_LONGTEXT N_( \
-    "If enabled the interface will uninstall the service and exit." )
-#define NAME_TEXT N_( "Display name of the service" )
+    "If enabled the interface will uninstall the Service and exit." )
+#define NAME_TEXT N_( "Display name of the Service" )
 #define NAME_LONGTEXT N_( \
-    "This allows you to change the display name of the service." )
+    "This allows you to change the display name of the Service." )
+#define OPTIONS_TEXT N_("Configuration options")
+#define OPTIONS_LONGTEXT N_( \
+    "This option allows you to specify configuration options that will be " \
+    "used by the Service (eg. --foo=bar --no-foobar). It should be specified "\
+    "at install time so the Service is properly configured.")
 #define EXTRAINTF_TEXT N_("Extra interface modules")
 #define EXTRAINTF_LONGTEXT N_( \
     "This option allows you to select additional interfaces spawned by the " \
-    "service. It should be specified at install time so the service is " \
+    "Service. It should be specified at install time so the Service is " \
     "properly configured. Use a comma separated list of interface modules. " \
     "(common values are: logger, sap, rc, http)")
 
 vlc_module_begin();
-    set_description( _("Windows NT/2K/XP service interface") );
+    set_shortname( _("NT Service"));
+    set_description( _("Windows Service interface") );
+    set_category( CAT_INTERFACE );
+    set_subcategory( SUBCAT_INTERFACE_CONTROL );
     add_bool( "ntservice-install", 0, NULL,
               INSTALL_TEXT, INSTALL_LONGTEXT, VLC_TRUE );
     add_bool( "ntservice-uninstall", 0, NULL,
               UNINSTALL_TEXT, UNINSTALL_LONGTEXT, VLC_TRUE );
     add_string ( "ntservice-name", VLCSERVICENAME, NULL,
                  NAME_TEXT, NAME_LONGTEXT, VLC_TRUE );
+    add_string ( "ntservice-options", NULL, NULL,
+                 OPTIONS_TEXT, OPTIONS_LONGTEXT, VLC_TRUE );
     add_string ( "ntservice-extraintf", NULL, NULL,
                  EXTRAINTF_TEXT, EXTRAINTF_LONGTEXT, VLC_TRUE );
 
@@ -112,6 +122,7 @@ void Close( vlc_object_t *p_this )
  *****************************************************************************/
 static void Run( intf_thread_t *p_intf )
 {
+    intf_thread_t *p_extraintf;
     SERVICE_TABLE_ENTRY dispatchTable[] =
     {
         { VLCSERVICENAME, &ServiceDispatch },
@@ -143,6 +154,15 @@ static void Run( intf_thread_t *p_intf )
 
     free( p_intf->p_sys->psz_service );
 
+    /* Stop and destroy the interfaces we spawned */
+    while( (p_extraintf = vlc_object_find(p_intf, VLC_OBJECT_INTF, FIND_CHILD)))
+    {
+        intf_StopThread( p_extraintf );
+        vlc_object_detach( p_extraintf );
+        vlc_object_release( p_extraintf );
+        intf_Destroy( p_extraintf );
+    }
+
     /* Make sure we exit (In case other interfaces have been spawned) */
     p_intf->p_vlc->b_die = VLC_TRUE;
 }
@@ -153,7 +173,7 @@ static void Run( intf_thread_t *p_intf )
 static int NTServiceInstall( intf_thread_t *p_intf )
 {
     intf_sys_t *p_sys  = p_intf->p_sys;
-    char psz_path[MAX_PATH], psz_pathtmp[MAX_PATH], *psz_extraintf;
+    char psz_path[10*MAX_PATH], psz_pathtmp[MAX_PATH], *psz_extra;
     SC_HANDLE handle = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
     if( handle == NULL )
     {
@@ -166,13 +186,21 @@ static int NTServiceInstall( intf_thread_t *p_intf )
     GetModuleFileName( NULL, psz_pathtmp, MAX_PATH );
     sprintf( psz_path, "\"%s\" -I "MODULE_STRING, psz_pathtmp );
 
-    psz_extraintf = config_GetPsz( p_intf, "ntservice-extraintf" );
-    if( psz_extraintf && *psz_extraintf )
+    psz_extra = config_GetPsz( p_intf, "ntservice-extraintf" );
+    if( psz_extra && *psz_extra )
     {
         strcat( psz_path, " --ntservice-extraintf " );
-        strcat( psz_path, psz_extraintf );
+        strcat( psz_path, psz_extra );
+    }
+    if( psz_extra ) free( psz_extra );
+
+    psz_extra = config_GetPsz( p_intf, "ntservice-options" );
+    if( psz_extra && *psz_extra )
+    {
+        strcat( psz_path, " " );
+        strcat( psz_path, psz_extra );
     }
-    if( psz_extraintf ) free( psz_extraintf );
+    if( psz_extra ) free( psz_extra );
 
     SC_HANDLE service =
         CreateService( handle, p_sys->psz_service, p_sys->psz_service,