* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define UNICODE
+#include <vlc_common.h>
#include "../libvlc.h"
#include <vlc_playlist.h>
#include <vlc_charset.h>
-#ifdef WIN32 /* optind, getopt(), included in unistd.h */
-# include "../extras/getopt.h"
-#endif
+#include "../extras/getopt.h"
#if !defined( UNDER_CE )
# include <io.h>
# include <fcntl.h>
+# include <mmsystem.h>
#endif
#include <winsock.h>
/*****************************************************************************
* system_Init: initialize winsock and misc other things.
*****************************************************************************/
-void system_Init( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
+void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
{
WSADATA Data;
char psz_path[MAX_PATH];
char *psz_vlc;
-#if defined( UNDER_CE )
wchar_t psz_wpath[MAX_PATH];
if( GetModuleFileName( NULL, psz_wpath, MAX_PATH ) )
{
}
else psz_path[0] = '\0';
-#else
- if( ppsz_argv[0] )
- {
- GetFullPathName( ppsz_argv[0], MAX_PATH, psz_path, &psz_vlc );
- }
- else if( !GetModuleFileName( NULL, psz_path, MAX_PATH ) )
- {
- psz_path[0] = '\0';
- }
-#endif
-
if( (psz_vlc = strrchr( psz_path, '\\' )) ) *psz_vlc = '\0';
#ifndef HAVE_RELEASE
#if !defined( UNDER_CE )
_fmode = _O_BINARY;
_setmode( _fileno( stdin ), _O_BINARY ); /* Needed for pipes */
+
+ timeBeginPeriod(5);
#endif
/* Call mdate() once to make sure it is initialized properly */
char data[0];
} vlc_ipc_data_t;
-void system_Configure( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
+void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
{
#if !defined( UNDER_CE )
/* Raise default priority of the current process */
}
}
+ libvlc_priv (p_this)->ipc_helper = NULL;
+
if( config_GetInt( p_this, "one-instance" )
|| ( config_GetInt( p_this, "one-instance-when-started-from-file" )
&& config_GetInt( p_this, "started-from-file" ) ) )
msg_Info( p_this, "one instance mode ENABLED");
/* Use a named mutex to check if another instance is already running */
- if( !( hmutex = CreateMutex( 0, TRUE, _T("VLC ipc ") _T(VERSION) ) ) )
+ if( !( hmutex = CreateMutex( 0, TRUE, L"VLC ipc "VERSION ) ) )
{
/* Failed for some reason. Just ignore the option and go on as
* normal. */
if( GetLastError() != ERROR_ALREADY_EXISTS )
{
/* We are the 1st instance. */
+ static const char typename[] = "ipc helper";
vlc_object_t *p_helper =
- (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) );
+ vlc_custom_create( p_this, sizeof(vlc_object_t),
+ VLC_OBJECT_GENERIC, typename );
/* Run the helper thread */
if( vlc_thread_create( p_helper, "IPC helper", IPCHelperThread,
- VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) )
+ VLC_THREAD_PRIORITY_LOW, true ) )
{
msg_Err( p_this, "one instance mode DISABLED "
"(IPC helper thread couldn't be created)" );
-
+ vlc_object_release (p_helper);
}
+ else
+ libvlc_priv (p_this)->ipc_helper = p_helper;
/* Initialization done.
* Release the mutex to unblock other instances */
/* Locate the window created by the IPC helper thread of the
* 1st instance */
- if( !( ipcwindow = FindWindow( 0, _T("VLC ipc ") _T(VERSION) ) ) )
+ if( !( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) )
{
msg_Err( p_this, "one instance mode DISABLED "
"(couldn't find 1st instance of program)" );
COPYDATASTRUCT wm_data;
int i_opt;
vlc_ipc_data_t *p_data;
- size_t i_data = sizeof (p_data);
+ size_t i_data = sizeof (*p_data);
for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
{
* with stronger alignment requirements, right. */
*((size_t *)(p_data->data + i_data)) = i_len;
i_data += sizeof (size_t);
- memcpy( &p_data[i_data], ppsz_argv[ i_opt ], i_len );
+ memcpy( &p_data->data[i_data], ppsz_argv[ i_opt ], i_len );
i_data += i_len;
}
+ i_data += sizeof (*p_data);
/* Send our playlist items to the 1st instance */
wm_data.dwData = 0;
MSG message;
ipcwindow =
- CreateWindow( _T("STATIC"), /* name of window class */
- _T("VLC ipc ") _T(VERSION), /* window title bar text */
+ CreateWindow( L"STATIC", /* name of window class */
+ L"VLC ipc "VERSION, /* window title bar text */
0, /* window style */
0, /* default X coordinate */
0, /* default Y coordinate */
GetModuleHandle(NULL), /* handle of this program instance */
NULL ); /* sent to WM_CREATE */
- SetWindowLong( ipcwindow, GWL_WNDPROC, (LONG)WMCOPYWNDPROC );
- SetWindowLong( ipcwindow, GWL_USERDATA, (LONG)p_this );
+ SetWindowLongPtr( ipcwindow, GWLP_WNDPROC, (LRESULT)WMCOPYWNDPROC );
+ SetWindowLongPtr( ipcwindow, GWLP_USERDATA, (LONG_PTR)p_this );
/* Signal the creation of the thread and events queue */
vlc_thread_ready( p_this );
vlc_object_t *p_this;
playlist_t *p_playlist;
- p_this = (vlc_object_t *)GetWindowLong( hwnd, GWL_USERDATA );
+ p_this = (vlc_object_t *)
+ (uintptr_t)GetWindowLongPtr( hwnd, GWLP_USERDATA );
if( !p_this ) return 0;
/* Add files to the playlist */
- p_playlist = (playlist_t *)vlc_object_find( p_this,
- VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ p_playlist = pl_Yield( p_this );
if( !p_playlist ) return 0;
if( pwm_data->lpData )
ppsz_argv = (char **)malloc( i_argc * sizeof(char *) );
for( i_opt = 0; i_opt < i_argc; i_opt++ )
{
- ppsz_argv[i_opt] = &p_data[i_data + sizeof(int)];
- i_data += *((int *)&p_data[i_data]);
- i_data += sizeof(int);
+ ppsz_argv[i_opt] = p_data->data + i_data + sizeof(int);
+ i_data += sizeof(int) + *((int *)(p_data->data + i_data));
}
for( i_opt = 0; i_opt < i_argc; i_opt++ )
( ( i_opt || p_data->enqueue ) ? 0 : PLAYLIST_GO ),
PLAYLIST_END, -1,
(char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
- i_options, VLC_TRUE, VLC_FALSE );
+ i_options, true, pl_Unlocked );
i_opt += i_options;
}
free( vlc_global()->psz_vlcpath );
vlc_global()->psz_vlcpath = NULL;
}
+ vlc_object_t *obj = libvlc_priv (p_this)->ipc_helper;
+ if (obj)
+ {
+ vlc_thread_join (obj);
+ vlc_object_release (obj);
+ }
+
+#if !defined( UNDER_CE )
+ timeEndPeriod(5);
+#endif
WSACleanup();
}