X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fwin32%2Fspecific.c;h=fdcb9f416bc4940d2d95ae1a2960443470571bdb;hb=90fc091360a6cdfcd7f2d6a244f505bdc2280b4c;hp=df6ab9b46650723d6470fcc3b989d2aad23fd02b;hpb=1c8b5fc1a42fe3e165ef581aff132b10d9fd5b4d;p=vlc diff --git a/src/win32/specific.c b/src/win32/specific.c index df6ab9b466..fdcb9f416b 100644 --- a/src/win32/specific.c +++ b/src/win32/specific.c @@ -1,24 +1,24 @@ /***************************************************************************** * specific.c: Win32 specific initilization ***************************************************************************** - * Copyright (C) 2001-2004, 2010 the VideoLAN team + * Copyright (C) 2001-2004, 2010 VLC authors and VideoLAN * * Authors: Samuel Hocevar * Gildas Bazin * - * 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 + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifdef HAVE_CONFIG_H @@ -27,99 +27,46 @@ #define UNICODE #include -#include "../libvlc.h" -#include -#include - -#include "../config/vlc_getopt.h" - -#if !defined( UNDER_CE ) -# include -#endif +#include "libvlc.h" +#include "../lib/libvlc_internal.h" +#include "config/vlc_getopt.h" +#include #include -/***************************************************************************** - * system_Init: initialize winsock and misc other things. - *****************************************************************************/ -void system_Init( void ) -{ - WSADATA Data; - MEMORY_BASIC_INFORMATION mbi; - - /* Get our full path */ - char psz_path[MAX_PATH]; - char *psz_vlc; - wchar_t psz_wpath[MAX_PATH]; - if( VirtualQuery(system_Init, &mbi, sizeof(mbi) ) ) - { - HMODULE hMod = (HMODULE) mbi.AllocationBase; - if( GetModuleFileName( hMod, psz_wpath, MAX_PATH ) ) - { - WideCharToMultiByte( CP_UTF8, 0, psz_wpath, -1, - psz_path, MAX_PATH, NULL, NULL ); - } - else psz_path[0] = '\0'; - } - else psz_path[0] = '\0'; - - psz_vlc = strrchr( psz_path, '\\' ); - if( psz_vlc ) - *psz_vlc = '\0'; +static int system_InitWSA(int hi, int lo) +{ + WSADATA data; + if (WSAStartup(MAKEWORD(hi, lo), &data) == 0) { - /* remove trailing \.libs from executable dir path if seen, - we assume we are running vlc through libtool wrapper in build dir */ - size_t len = strlen(psz_path); - if( len >= 5 && !stricmp(psz_path + len - 5, "\\.libs" ) ) - psz_path[len - 5] = '\0'; + if (LOBYTE(data.wVersion) == 2 && HIBYTE(data.wVersion) == 2) + return 0; + /* Winsock DLL is not usable */ + WSACleanup( ); } + return -1; +} - psz_vlcpath = strdup( psz_path ); - - /* Set the default file-translation mode */ -#if !defined( UNDER_CE ) +/** + * Initializes MME timer, Winsock. + */ +void system_Init(void) +{ +#if !VLC_WINSTORE_APP timeBeginPeriod(5); #endif - /* WinSock Library Init. */ - if( !WSAStartup( MAKEWORD( 2, 2 ), &Data ) ) - { - /* Aah, pretty useless check, we should always have Winsock 2.2 - * since it appeared in Win98. */ - if( LOBYTE( Data.wVersion ) != 2 || HIBYTE( Data.wVersion ) != 2 ) - /* We could not find a suitable WinSock DLL. */ - WSACleanup( ); - else - /* Everything went ok. */ - return; - } - - /* Let's try with WinSock 1.1 */ - if( !WSAStartup( MAKEWORD( 1, 1 ), &Data ) ) - { - /* Confirm that the WinSock DLL supports 1.1.*/ - if( LOBYTE( Data.wVersion ) != 1 || HIBYTE( Data.wVersion ) != 1 ) - /* We could not find a suitable WinSock DLL. */ - WSACleanup( ); - else - /* Everything went ok. */ - return; - } - - fprintf( stderr, "error: can't initialize WinSocks\n" ); + if (system_InitWSA(2, 2) && system_InitWSA(1, 1)) + fputs("Error: cannot initialize Winsocks\n", stderr); } /***************************************************************************** * system_Configure: check for system specific configuration options. *****************************************************************************/ -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; +/* Must be same as in modules/control/win_msg.c */ typedef struct { int argc; @@ -129,7 +76,7 @@ typedef struct void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_argv[] ) { -#if !defined( UNDER_CE ) +#if !VLC_WINSTORE_APP /* Raise default priority of the current process */ #ifndef ABOVE_NORMAL_PRIORITY_CLASS # define ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 @@ -156,7 +103,7 @@ void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_ 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, L"VLC ipc "VERSION ) ) ) + if( !( hmutex = CreateMutex( 0, TRUE, L"VLC ipc " TEXT(VERSION) ) ) ) { /* Failed for some reason. Just ignore the option and go on as * normal. */ @@ -167,25 +114,7 @@ void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_ if( GetLastError() != ERROR_ALREADY_EXISTS ) { - /* We are the 1st instance. */ - p_helper = - vlc_custom_create( p_this, sizeof(*p_helper), "ipc helper" ); - - /* Run the helper thread */ - 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; - } - CloseHandle( hIPCHelperReady ); - + libvlc_InternalAddIntf( p_this, "win_msg,none" ); /* Initialization done. * Release the mutex to unblock other instances */ ReleaseMutex( hmutex ); @@ -201,7 +130,7 @@ void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_ /* Locate the window created by the IPC helper thread of the * 1st instance */ - if( !( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) ) + if( !( ipcwindow = FindWindow( 0, L"VLC ipc " TEXT(VERSION) ) ) ) { msg_Err( p_this, "one instance mode DISABLED " "(couldn't find 1st instance of program)" ); @@ -256,134 +185,18 @@ void system_Configure( libvlc_int_t *p_this, int i_argc, const char *const ppsz_ exit( 0 ); } } - #endif } -static unsigned __stdcall IPCHelperThread( void *data ) -{ - vlc_object_t *p_this = data; - HWND ipcwindow; - MSG message; - - ipcwindow = - 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 */ - 0, /* window width */ - 0, /* window height */ - NULL, /* no parent window */ - NULL, /* no menu in this window */ - GetModuleHandle(NULL), /* handle of this program instance */ - NULL ); /* sent to WM_CREATE */ - - SetWindowLongPtr( ipcwindow, GWLP_WNDPROC, (LRESULT)WMCOPYWNDPROC ); - SetWindowLongPtr( ipcwindow, GWLP_USERDATA, (LONG_PTR)p_this ); - - /* Signal the creation of the thread and events queue */ - SetEvent( hIPCHelperReady ); - - while( GetMessage( &message, NULL, 0, 0 ) ) - { - TranslateMessage( &message ); - DispatchMessage( &message ); - } - return 0; -} - -LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam, - LPARAM lParam ) -{ - if( uMsg == WM_QUIT ) - { - PostQuitMessage( 0 ); - } - else if( uMsg == WM_COPYDATA ) - { - COPYDATASTRUCT *pwm_data = (COPYDATASTRUCT*)lParam; - vlc_object_t *p_this; - playlist_t *p_playlist; - - p_this = (vlc_object_t *) - (uintptr_t)GetWindowLongPtr( hwnd, GWLP_USERDATA ); - - if( !p_this ) return 0; - - /* Add files to the playlist */ - p_playlist = pl_Get( p_this ); - - if( pwm_data->lpData ) - { - char **ppsz_argv; - 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; - - ppsz_argv = (char **)malloc( i_argc * sizeof(char *) ); - for( i_opt = 0; i_opt < i_argc; i_opt++ ) - { - 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 = 0; - - /* Count the input options */ - while( i_opt + i_options + 1 < i_argc && - *ppsz_argv[ i_opt + i_options + 1 ] == ':' ) - { - i_options++; - } - - char *psz_URI = make_URI( ppsz_argv[i_opt], NULL ); - playlist_AddExt( p_playlist, psz_URI, - 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 ), - VLC_INPUT_OPTION_TRUSTED, - true, pl_Unlocked ); - - i_opt += i_options; - free( psz_URI ); - } - - free( ppsz_argv ); - } - } - - return DefWindowProc( hwnd, uMsg, wParam, lParam ); -} - -/***************************************************************************** - * system_End: terminate winsock. - *****************************************************************************/ -void system_End( void ) +/** + * Cleans up after system_Init() and system_Configure(). + */ +void system_End(void) { - HWND ipcwindow; - - free( psz_vlcpath ); - psz_vlcpath = NULL; - - /* FIXME: thread-safety... */ - if (p_helper) - { - if( ( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) != 0 ) - { - SendMessage( ipcwindow, WM_QUIT, 0, 0 ); - } - vlc_object_release (p_helper); - p_helper = NULL; - } - -#if !defined( UNDER_CE ) +#if !VLC_WINSTORE_APP timeEndPeriod(5); #endif + /* XXX: In theory, we should not call this if WSAStartup() failed. */ WSACleanup(); }