]> git.sesse.net Git - vlc/blobdiff - src/misc/win32_specific.c
Win32: fix src/ compilation
[vlc] / src / misc / win32_specific.c
index 881f82118ea24426b28abf4891b149e7188cf7ec..ea294eda89771442fd201e6269a17e56c24f5473 100644 (file)
  * 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[] )
 {
+    VLC_UNUSED( p_this ); VLC_UNUSED( pi_argc ); VLC_UNUSED( ppsz_argv );
     WSADATA Data;
 
     /* Get our full path */
     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 ) )
     {
@@ -58,17 +62,6 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
     }
     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
@@ -84,12 +77,14 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
     }
 #endif
 
-    vlc_global()->psz_vlcpath = strdup( psz_path );
+    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 */
@@ -126,16 +121,20 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
 /*****************************************************************************
  * system_Configure: check for system specific configuration options.
  *****************************************************************************/
-static void IPCHelperThread( vlc_object_t * );
+static unsigned __stdcall IPCHelperThread( void * );
 LRESULT CALLBACK WMCOPYWNDPROC( HWND, UINT, WPARAM, LPARAM );
+static vlc_object_t *p_helper = NULL;
+static unsigned long hIPCHelper;
+static HANDLE hIPCHelperReady;
+
 typedef struct
 {
   int argc;
   int enqueue;
-  char data[0];
+  char data[];
 } 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 */
@@ -164,7 +163,7 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
         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. */
@@ -176,17 +175,26 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
         if( GetLastError() != ERROR_ALREADY_EXISTS )
         {
             /* We are the 1st instance. */
-            vlc_object_t *p_helper =
-             (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) );
+            static const char typename[] = "ipc helper";
+            p_helper =
+                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 ) )
+            hIPCHelperReady = CreateEvent( NULL, FALSE, FALSE, NULL );
+            hIPCHelper = _beginthreadex( NULL, 0, IPCHelperThread, p_helper,
+                                         0, NULL );
+            if( hIPCHelper )
+                WaitForSingleObject( hIPCHelperReady, INFINITE );
+            else
             {
                 msg_Err( p_this, "one instance mode DISABLED "
                          "(IPC helper thread couldn't be created)" );
-
+                vlc_object_release (p_helper);
+                p_helper = NULL;
             }
+            vlc_object_attach (p_helper, p_this);
+            CloseHandle( hIPCHelperReady );
 
             /* Initialization done.
              * Release the mutex to unblock other instances */
@@ -203,7 +211,7 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
 
             /* 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)" );
@@ -262,14 +270,15 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, char *ppsz_argv[] )
 #endif
 }
 
-static void IPCHelperThread( vlc_object_t *p_this )
+static unsigned __stdcall IPCHelperThread( void *data )
 {
+    vlc_object_t *p_this = data;
     HWND ipcwindow;
     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 */
@@ -280,17 +289,18 @@ static void IPCHelperThread( vlc_object_t *p_this )
                   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 );
+    SetEvent( hIPCHelperReady );
 
     while( GetMessage( &message, NULL, 0, 0 ) )
     {
         TranslateMessage( &message );
         DispatchMessage( &message );
     }
+    return 0;
 }
 
 LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
@@ -302,14 +312,13 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
         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_Hold( p_this );
         if( !p_playlist ) return 0;
 
         if( pwm_data->lpData )
@@ -340,8 +349,10 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
                   NULL, PLAYLIST_APPEND |
                         ( ( i_opt || p_data->enqueue ) ? 0 : PLAYLIST_GO ),
                   PLAYLIST_END, -1,
+                  i_options,
                   (char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
-                  i_options, VLC_TRUE, VLC_FALSE );
+                  VLC_INPUT_OPTION_TRUSTED,
+                  true, pl_Unlocked );
 
                 i_opt += i_options;
             }
@@ -360,11 +371,29 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
  *****************************************************************************/
 void system_End( libvlc_int_t *p_this )
 {
-    if( p_this && vlc_global() )
+    HWND ipcwindow;
+    if( p_this )
+    {
+        free( psz_vlcpath );
+        psz_vlcpath = NULL;
+    }
+
+    if( ( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) != 0 )
     {
-        free( vlc_global()->psz_vlcpath );
-        vlc_global()->psz_vlcpath = NULL;
+        SendMessage( ipcwindow, WM_QUIT, 0, 0 );
     }
 
+    if (p_helper && p_helper->p_parent == VLC_OBJECT(p_this) )
+    {
+        /* FIXME: thread-safety... */
+        vlc_object_detach (p_helper);
+        vlc_object_release (p_helper);
+        p_helper = NULL;
+    }
+
+#if !defined( UNDER_CE )
+    timeEndPeriod(5);
+#endif
+
     WSACleanup();
 }