* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-#include <string.h> /* strdup() */
-#include <stdlib.h> /* free() */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <vlc/vlc.h>
-#include <vlc/input.h>
-#include "vlc_playlist.h"
+#include "../libvlc.h"
+#include <vlc_playlist.h>
+#include <vlc_charset.h>
#ifdef WIN32 /* optind, getopt(), included in unistd.h */
# include "../extras/getopt.h"
#if !defined( UNDER_CE )
# include <io.h>
# include <fcntl.h>
+# include <mmsystem.h>
#endif
#include <winsock.h>
-extern void __wgetmainargs(int *argc, wchar_t ***wargv, wchar_t ***wenviron,
- int expand_wildcards, int *startupinfo);
-
/*****************************************************************************
* 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;
if( (psz_vlc = strrchr( psz_path, '\\' )) ) *psz_vlc = '\0';
- p_this->p_libvlc_global->psz_vlcpath = strdup( psz_path );
+#ifndef HAVE_RELEASE
+ {
+ /* remove trailing \.libs from executable dir path if seen,
+ we assume we are running vlc through libtool wrapper in build dir */
+ int offset = strlen(psz_path)-sizeof("\\.libs")+1;
+ if( offset > 0 )
+ {
+ psz_vlc = psz_path+offset;
+ if( ! strcmp(psz_vlc, "\\.libs") ) *psz_vlc = '\0';
+ }
+ }
+#endif
+
+ vlc_global()->psz_vlcpath = strdup( psz_path );
/* Set the default file-translation mode */
#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 */
*****************************************************************************/
static void IPCHelperThread( vlc_object_t * );
LRESULT CALLBACK WMCOPYWNDPROC( HWND, UINT, WPARAM, LPARAM );
+typedef struct
+{
+ int argc;
+ int enqueue;
+ 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 )
- p_this->p_libvlc_global->b_fast_mutex = config_GetInt( p_this, "fast-mutex" );
- p_this->p_libvlc_global->i_win9x_cv = config_GetInt( p_this, "win9x-cv-method" );
-
/* Raise default priority of the current process */
#ifndef ABOVE_NORMAL_PRIORITY_CLASS
# define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000
if( *pi_argc - 1 >= optind )
{
COPYDATASTRUCT wm_data;
- int i_opt, i_data;
- char *p_data;
- wchar_t **wargv, **wenvp;
- int si = { 0 };
+ int i_opt;
+ vlc_ipc_data_t *p_data;
+ size_t i_data = sizeof (*p_data);
- i_data = sizeof(int);
- if( GetVersion() < 0x80000000 )
+ for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
{
- /* use unicode argv[] for Windows NT and above */
- __wgetmainargs(&i_opt, &wargv, &wenvp, 0, &si);
- for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
- {
- i_data += sizeof(int);
- i_data += WideCharToMultiByte( CP_UTF8, 0,
- wargv[ i_opt ], -1, NULL, 0, NULL, NULL ) + 1;
- }
- p_data = (char *)malloc( i_data );
- *((int *)&p_data[0]) = *pi_argc - optind;
- i_data = sizeof(int);
- for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
- {
- int i_len = WideCharToMultiByte( CP_UTF8, 0,
- wargv[ i_opt ], -1, NULL, 0, NULL, NULL ) + 1;
- *((int *)&p_data[i_data]) = i_len;
- i_data += sizeof(int);
- WideCharToMultiByte( CP_UTF8, 0, wargv[ i_opt ], -1,
- &p_data[i_data], i_len, NULL, NULL );
- i_data += i_len;
- }
-
+ i_data += sizeof (size_t);
+ i_data += strlen( ppsz_argv[ i_opt ] ) + 1;
}
- else
+
+ p_data = malloc( i_data );
+ p_data->argc = *pi_argc - optind;
+ p_data->enqueue = config_GetInt( p_this, "playlist-enqueue" );
+ i_data = 0;
+ for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
{
- for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
- {
- i_data += sizeof(int);
- i_data += strlen( ppsz_argv[ i_opt ] ) + 1;
- }
-
- p_data = (char *)malloc( i_data );
- *((int *)&p_data[0]) = *pi_argc - optind;
- i_data = sizeof(int);
- for( i_opt = optind; i_opt < *pi_argc; i_opt++ )
- {
- int i_len = strlen( ppsz_argv[ i_opt ] ) + 1;
- *((int *)&p_data[i_data]) = i_len;
- i_data += sizeof(int);
- memcpy( &p_data[i_data], ppsz_argv[ i_opt ], i_len );
- i_data += i_len;
- }
+ size_t i_len = strlen( ppsz_argv[ i_opt ] ) + 1;
+ /* Windows will never switch to an architecture
+ * with stronger alignment requirements, right. */
+ *((size_t *)(p_data->data + i_data)) = i_len;
+ i_data += sizeof (size_t);
+ 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;
NULL ); /* sent to WM_CREATE */
SetWindowLong( ipcwindow, GWL_WNDPROC, (LONG)WMCOPYWNDPROC );
- SetWindowLong( ipcwindow, GWL_USERDATA, (LONG)p_this );
+ SetWindowLongPtr( ipcwindow, GWL_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 *)GetWindowLongPtr( hwnd, GWL_USERDATA );
if( !p_this ) return 0;
if( pwm_data->lpData )
{
- int i_argc, i_data, i_opt, i_options;
char **ppsz_argv;
- char *p_data = (char *)pwm_data->lpData;
+ vlc_ipc_data_t *p_data = (vlc_ipc_data_t *)pwm_data->lpData;
+ size_t i_data = 0;
+ int i_argc = p_data->argc, i_opt, i_options;
- i_argc = *((int *)&p_data[0]);
ppsz_argv = (char **)malloc( i_argc * sizeof(char *) );
- i_data = sizeof(int);
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_options++;
}
- if( i_opt || config_GetInt( p_this, "playlist-enqueue" ) )
- {
- playlist_PlaylistAddExt( p_playlist, ppsz_argv[i_opt],
- NULL, PLAYLIST_APPEND ,
- PLAYLIST_END, -1,
- (char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
- i_options );
- } else {
- playlist_PlaylistAddExt( p_playlist, ppsz_argv[i_opt],
- NULL, PLAYLIST_APPEND | PLAYLIST_GO,
- PLAYLIST_END, -1,
- (char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
- i_options );
- }
+ playlist_AddExt( p_playlist, ppsz_argv[i_opt],
+ NULL, PLAYLIST_APPEND |
+ ( ( 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_opt += i_options;
}
*****************************************************************************/
void system_End( libvlc_int_t *p_this )
{
- if( p_this && p_this->p_libvlc_global && p_this->p_libvlc_global->psz_vlcpath )
+ if( p_this && vlc_global() )
{
- free( p_this->p_libvlc_global->psz_vlcpath );
- p_this->p_libvlc_global->psz_vlcpath = NULL;
+ free( vlc_global()->psz_vlcpath );
+ vlc_global()->psz_vlcpath = NULL;
}
+#if !defined( UNDER_CE )
+ timeEndPeriod(5);
+#endif
+
WSACleanup();
}