Commit ecc5706b authored by Gildas Bazin's avatar Gildas Bazin

* ALL: bumped version number to 0.6.3-cvs
* modules/control/ntservice.c: new Windows NT/2K/XP service interface.
parent 2433ab08
dnl Autoconf settings for vlc
dnl $Id: configure.ac,v 1.57 2003/08/13 14:17:25 zorglub Exp $
dnl $Id: configure.ac,v 1.58 2003/08/13 23:26:55 gbazin Exp $
AC_INIT(vlc,0.6.2)
AC_INIT(vlc,0.6.3-cvs)
CONFIGURE_LINE="$0 $*"
CODENAME="Trevelyan"
......@@ -13,7 +13,7 @@ AC_CANONICAL_SYSTEM
dnl XXX: we don't put any flags here, because automake 1.5 doesn't support
dnl them. And we need the comma otherwize automake will choke on it.
AM_INIT_AUTOMAKE(vlc,0.6.2)
AM_INIT_AUTOMAKE(vlc,0.6.3-cvs)
AM_CONFIG_HEADER(config.h)
dnl
......@@ -802,6 +802,8 @@ dnl Some plugins aren't useful on some platforms
dnl
if test "${SYS}" != "mingw32"; then
AX_ADD_PLUGINS([screensaver])
else
AX_ADD_PLUGINS([ntservice])
fi
dnl
......
/* Localized versions of Info.plist keys */
CFBundleName = "VLC";
CFBundleShortVersionString = "0.6.2";
CFBundleGetInfoString = "VLC media player 0.6.2, Copyright (c) 1996-2003 VideoLAN.";
CFBundleShortVersionString = "0.6.3-cvs";
CFBundleGetInfoString = "VLC media player 0.6.3-cvs, Copyright (c) 1996-2003 VideoLAN.";
NSHumanReadableCopyright = "Copyright (c) 1996-2003 VideoLAN.";
......@@ -415,7 +415,7 @@
<key>CFBundleExecutable</key>
<string>VLC</string>
<key>CFBundleGetInfoString</key>
<string>VLC media player 0.6.2, Copyright (c) 1996-2003 VideoLAN.</string>
<string>VLC media player 0.6.3-cvs, Copyright (c) 1996-2003 VideoLAN.</string>
<key>CFBundleIconFile</key>
<string>vlc.icns</string>
<key>CFBundleIdentifier</key>
......@@ -427,7 +427,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6.2</string>
<string>0.6.3-cvs</string>
<key>CFBundleSignature</key>
<string>VLC#</string>
<key>CFBundleURLTypes</key>
......@@ -474,7 +474,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>0.6.2</string>
<string>0.6.3-cvs</string>
<key>NSAppleScriptEnabled</key>
<string>YES</string>
<key>NSMainNibFile</key>
......
SOURCES_gestures = gestures.c
SOURCES_http = http.c
SOURCES_ntservice = ntservice.c
SOURCES_joystick = joystick.c
/*****************************************************************************
* ntservice.c: Windows NT/2K/XP service interface
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: ntservice.c,v 1.1 2003/08/13 23:26:55 gbazin Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
#include <vlc/vlc.h>
#include <vlc/intf.h>
#define VLCSERVICENAME "VLC media player"
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static int Activate( vlc_object_t * );
static void Close ( vlc_object_t * );
#define INSTALL_TEXT N_( "Install NT/2K/XP service" )
#define INSTALL_LONGTEXT N_( \
"If enabled the interface will install the service and exit." )
#define UNINSTALL_TEXT N_( "Uninstall NT/2K/XP service" )
#define UNINSTALL_LONGTEXT N_( \
"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." )
vlc_module_begin();
set_description( _("Windows NT/2K/XP service interface") );
add_category_hint( N_("NT service"), NULL, VLC_TRUE );
add_bool( "ntservice-install", 0, NULL, INSTALL_TEXT, INSTALL_LONGTEXT, VLC_TRUE );
add_bool( "ntservice-uninstall", 0, NULL, INSTALL_TEXT, INSTALL_LONGTEXT, VLC_TRUE );
add_string ( "ntservice-name", VLCSERVICENAME, NULL, NAME_TEXT, NAME_LONGTEXT, VLC_TRUE );
set_capability( "interface", 0 );
set_callbacks( Activate, Close );
vlc_module_end();
struct intf_sys_t
{
SERVICE_STATUS_HANDLE hStatus;
SERVICE_STATUS status;
char *psz_service;
};
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static void Run( intf_thread_t *p_intf );
static int NTServiceInstall( intf_thread_t *p_intf );
static int NTServiceUninstall( intf_thread_t *p_intf );
static void WINAPI ServiceDispatch( DWORD numArgs, char **args );
static void WINAPI ServiceCtrlHandler( DWORD control );
/* We need this global */
static intf_thread_t *p_global_intf;
/*****************************************************************************
* Activate: initialize and create stuff
*****************************************************************************/
static int Activate( vlc_object_t *p_this )
{
intf_thread_t *p_intf = (intf_thread_t*)p_this;
/* Only works on NT/2K/XP */
if( !IS_WINNT ) return VLC_EGENERIC;
p_intf->pf_run = Run;
return VLC_SUCCESS;
}
/*****************************************************************************
* Close: destroy interface
*****************************************************************************/
void Close( vlc_object_t *p_this )
{
}
/*****************************************************************************
* Run: interface thread
*****************************************************************************/
static void Run( intf_thread_t *p_intf )
{
SERVICE_TABLE_ENTRY dispatchTable[] =
{
{ VLCSERVICENAME, &ServiceDispatch },
{ NULL, NULL }
};
p_global_intf = p_intf;
p_intf->p_sys = alloca( sizeof( intf_sys_t ) );
p_intf->p_sys->psz_service = config_GetPsz( p_intf, "ntservice-name" );
p_intf->p_sys->psz_service = p_intf->p_sys->psz_service ?
p_intf->p_sys->psz_service : strdup(VLCSERVICENAME);
if( config_GetInt( p_intf, "ntservice-install" ) )
{
NTServiceInstall( p_intf );
return;
}
if( config_GetInt( p_intf, "ntservice-uninstall" ) )
{
NTServiceUninstall( p_intf );
return;
}
if( StartServiceCtrlDispatcher( dispatchTable ) == 0 )
{
msg_Err( p_intf, "StartServiceCtrlDispatcher failed" );
}
free( p_intf->p_sys->psz_service );
/* Make sure we exit (In case other interfaces have been spawned) */
p_intf->p_vlc->b_die = VLC_TRUE;
}
/*****************************************************************************
* NT Service utility functions
*****************************************************************************/
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];
SC_HANDLE handle = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( handle == NULL )
{
msg_Err( p_intf, "Could not connect to SCM database" );
return VLC_EGENERIC;
}
/* Find out the filename of ourselves so we can install it to the
* service control manager */
GetModuleFileName( NULL, psz_pathtmp, MAX_PATH );
sprintf( psz_path, "\"%s\" -I "MODULE_STRING, psz_pathtmp );
SC_HANDLE service =
CreateService( handle, p_sys->psz_service, p_sys->psz_service,
GENERIC_READ | GENERIC_EXECUTE,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
psz_path, NULL, NULL, NULL, NULL, NULL );
if( service == NULL )
{
if( GetLastError() != ERROR_SERVICE_EXISTS )
{
msg_Err( p_intf, "Could not create new service" );
CloseServiceHandle( handle );
return VLC_EGENERIC;
}
else
{
msg_Warn( p_intf, "Service already exists" );
}
}
else
{
msg_Warn( p_intf, "Service successfuly created" );
}
if( service ) CloseServiceHandle( service );
CloseServiceHandle( handle );
return VLC_SUCCESS;
}
static int NTServiceUninstall( intf_thread_t *p_intf )
{
intf_sys_t *p_sys = p_intf->p_sys;
SC_HANDLE handle = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( handle == NULL )
{
msg_Err( p_intf, "Could not connect to SCM database" );
return VLC_EGENERIC;
}
/* First, open a handle to the service */
SC_HANDLE service = OpenService( handle, p_sys->psz_service, DELETE );
if( service == NULL )
{
msg_Err( p_intf, "Could not open service" );
CloseServiceHandle( handle );
return VLC_EGENERIC;
}
/* Remove the service */
if( !DeleteService( service ) )
{
msg_Err( p_intf, "Could not delete service" );
}
else
{
msg_Dbg( p_intf, "Service deleted successfuly" );
}
CloseServiceHandle( service );
CloseServiceHandle( handle );
return VLC_SUCCESS;
}
static void WINAPI ServiceDispatch( DWORD numArgs, char **args )
{
intf_thread_t *p_intf = (intf_thread_t *)p_global_intf;
intf_sys_t *p_sys = p_intf->p_sys;
/* We have to initialize the service-specific stuff */
memset( &p_sys->status, 0, sizeof(SERVICE_STATUS) );
p_sys->status.dwServiceType = SERVICE_WIN32;
p_sys->status.dwCurrentState = SERVICE_START_PENDING;
p_sys->status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
p_sys->hStatus =
RegisterServiceCtrlHandler( p_sys->psz_service, &ServiceCtrlHandler );
if( p_sys->hStatus == (SERVICE_STATUS_HANDLE)0 )
{
msg_Err( p_intf, "Failed to register service control handler" );
return;
}
/* Initialization complete - report running status */
p_sys->status.dwCurrentState = SERVICE_RUNNING;
p_sys->status.dwCheckPoint = 0;
p_sys->status.dwWaitHint = 0;
SetServiceStatus( p_sys->hStatus, &p_sys->status );
}
static void WINAPI ServiceCtrlHandler( DWORD control )
{
intf_thread_t *p_intf = (intf_thread_t *)p_global_intf;
intf_sys_t *p_sys = p_intf->p_sys;
switch( control )
{
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
p_sys->status.dwCurrentState = SERVICE_STOPPED;
p_sys->status.dwWin32ExitCode = 0;
p_sys->status.dwCheckPoint = 0;
p_sys->status.dwWaitHint = 0;
break;
case SERVICE_CONTROL_INTERROGATE:
/* just set the current state to whatever it is... */
break;
}
SetServiceStatus( p_sys->hStatus, &p_sys->status );
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment