/*****************************************************************************
* libvlc.c: main libvlc source
*****************************************************************************
- * Copyright (C) 1998-2004 VideoLAN
+ * Copyright (C) 1998-2004 the VideoLAN team
* $Id$
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
#include "video_output.h"
#include "stream_output.h"
+#include "charset.h"
#include "libvlc.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
+static void LocaleInit( void );
+static void LocaleDeinit( void );
static void SetLanguage ( char const * );
static int GetFilenames ( vlc_t *, int, char *[] );
static void Help ( vlc_t *, char const *psz_help_name );
libvlc.p_module_bank = NULL;
libvlc.b_ready = VLC_TRUE;
+
+ /* UTF-8 convertor are initialized after the locale */
+ libvlc.from_locale = libvlc.to_locale = (vlc_iconv_t)(-1);
}
vlc_mutex_unlock( lockval.p_address );
var_Destroy( p_libvlc, "libvlc" );
char * psz_modules;
char * psz_parser;
char * psz_control;
- char * psz_language;
vlc_bool_t b_exit = VLC_FALSE;
vlc_t * p_vlc = vlc_current_object( i_object );
module_t *p_help_module;
playlist_t *p_playlist;
+ vlc_value_t val;
+#if defined( ENABLE_NLS ) \
+ && ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) )
+ char * psz_language;
+#endif
if( !p_vlc )
{
*/
SetLanguage( "" );
+ /*
+ * Global iconv, must be done after setlocale()
+ * so that vlc_current_charset() works.
+ */
+ LocaleInit();
+
/* Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
msg_Dbg( p_vlc, "translation test: code is \"%s\"", _("C") );
/* Reset the default domain */
SetLanguage( psz_language );
+ LocaleDeinit();
+ LocaleInit();
/* Translate "C" to the language code: "fr", "en_GB", "nl", "ru"... */
msg_Dbg( p_vlc, "translation test: code is \"%s\"", _("C") );
var_Create( p_vlc, "verbose", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
if( config_GetInt( p_vlc, "quiet" ) )
{
- vlc_value_t val;
val.i_int = -1;
var_Set( p_vlc, "verbose", val );
}
*/
GetFilenames( p_vlc, i_argc, ppsz_argv );
+ /*
+ * Get --open argument
+ */
+ var_Create( p_vlc, "open", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
+ var_Get( p_vlc, "open", &val );
+ if ( val.psz_string != NULL && *val.psz_string )
+ {
+ VLC_AddTarget( p_vlc->i_object_id, val.psz_string, NULL, 0,
+ PLAYLIST_INSERT, 0 );
+ }
+ if ( val.psz_string != NULL ) free( val.psz_string );
+
if( i_object ) vlc_object_release( p_vlc );
return VLC_SUCCESS;
}
*/
system_End( p_vlc );
+ /*
+ * Free message queue.
+ * Nobody shall use msg_* afterward.
+ */
+ msg_Flush( p_vlc );
+ msg_Destroy( p_libvlc );
+
+ /* Destroy global iconv */
+ LocaleDeinit();
+
/* Destroy mutexes */
vlc_mutex_destroy( &p_vlc->config_lock );
{
playlist_t * p_playlist;
vlc_bool_t b_playing;
+ vlc_value_t val;
vlc_t *p_vlc = vlc_current_object( i_object );
if( i_object ) vlc_object_release( p_vlc );
return VLC_ENOOBJ;
}
-
- b_playing = playlist_IsPlaying( p_playlist );
+ if( !p_playlist->p_input )
+ {
+ if( i_object ) vlc_object_release( p_vlc );
+ return VLC_ENOOBJ;
+ }
+ var_Get( p_playlist->p_input, "state", &val );
+ b_playing = ( val.i_int == PLAYING_S );
vlc_object_release( p_playlist );
if( i_object ) vlc_object_release( p_vlc );
/* following functions are local */
+static void LocaleInit( void )
+{
+ char *psz_charset;
+
+ if( !vlc_current_charset( &psz_charset ) )
+ {
+ vlc_mutex_init( p_libvlc, &libvlc.from_locale_lock );
+ vlc_mutex_init( p_libvlc, &libvlc.to_locale_lock );
+ libvlc.from_locale = vlc_iconv_open( "UTF-8", psz_charset );
+ libvlc.to_locale = vlc_iconv_open( psz_charset, "UTF-8" );
+ if( !libvlc.to_locale )
+ {
+ // Not sure it is the right thing to do, but at least it
+ // doesn't make vlc crash with msvc !
+ libvlc.to_locale = (vlc_iconv_t)(-1);
+ }
+ }
+ else
+ libvlc.from_locale = libvlc.to_locale = (vlc_iconv_t)(-1);
+ free( psz_charset );
+}
+
+static void LocaleDeinit( void )
+{
+ if( libvlc.to_locale != (vlc_iconv_t)(-1) )
+ {
+ vlc_mutex_destroy( &libvlc.from_locale_lock );
+ vlc_mutex_destroy( &libvlc.to_locale_lock );
+ vlc_iconv_close( libvlc.from_locale );
+ vlc_iconv_close( libvlc.to_locale );
+ }
+}
+
/*****************************************************************************
* SetLanguage: set the interface language.
*****************************************************************************
#endif
setlocale( LC_ALL, psz_lang );
+ setlocale(LC_NUMERIC, "C" );
}
/* Specify where to find the locales for current domain */
/* Set the default domain */
textdomain( PACKAGE_NAME );
-#if defined( ENABLE_UTF8 )
bind_textdomain_codeset( PACKAGE_NAME, "UTF-8" );
#endif
-
-#endif
}
/*****************************************************************************
* and their input options */
for( i_opt = i_argc - 1; i_opt >= optind; i_opt-- )
{
+ const char *psz_target;
i_options = 0;
/* Count the input options */
/* TODO: write an internal function of this one, to avoid
* unnecessary lookups. */
- VLC_AddTarget( p_vlc->i_object_id, ppsz_argv[ i_opt ],
+ /* FIXME: should we convert options to UTF-8 as well ?? */
+ psz_target = FromLocale( ppsz_argv[ i_opt ] );
+ VLC_AddTarget( p_vlc->i_object_id, psz_target,
(char const **)( i_options ? &ppsz_argv[i_opt + 1] :
NULL ), i_options,
PLAYLIST_INSERT, 0 );
+ LocaleFree( psz_target );
}
return VLC_SUCCESS;
char *psz_text, *psz_spaces = psz_spaces_text;
char *psz_bra = NULL, *psz_type = NULL, *psz_ket = NULL;
char *psz_suf = "", *psz_prefix = NULL;
- int i;
+ signed int i;
/* Skip deprecated options */
if( p_item->psz_current )
while( *psz_text )
{
char *psz_parser, *psz_word;
- int i_end = strlen( psz_text );
+ size_t i_end = strlen( psz_text );
/* If the remaining text fits in a line, print it. */
- if( i_end <= i_width )
+ if( i_end <= (size_t)i_width )
{
fprintf( stdout, "%s\n", psz_text );
break;
}
#endif
}
+
+/*****************************************************************************
+ * FromLocale: converts a locale string to UTF-8
+ *****************************************************************************/
+char *FromLocale( const char *locale )
+{
+ if( locale == NULL )
+ return NULL;
+
+ if( libvlc.from_locale != (vlc_iconv_t)(-1) )
+ {
+ char *iptr = (char *)locale, *output, *optr;
+ size_t inb, outb;
+
+ /*
+ * We are not allowed to modify the locale pointer, even if we cast it
+ * to non-const.
+ */
+ inb = strlen( locale );
+ outb = inb * 6 + 1;
+
+ /* FIXME: I'm not sure about the value for the multiplication
+ * (for western people, multiplication by 3 (Latin9) is sufficient) */
+ optr = output = calloc( outb , 1);
+
+ vlc_mutex_lock( &libvlc.from_locale_lock );
+ vlc_iconv( libvlc.from_locale, NULL, NULL, NULL, NULL );
+
+ while( vlc_iconv( libvlc.from_locale, &iptr, &inb, &optr, &outb )
+ == (size_t)-1 )
+ {
+ *optr++ = '?';
+ *iptr++;
+ vlc_iconv( libvlc.from_locale, NULL, NULL, NULL, NULL );
+ }
+ vlc_mutex_unlock( &libvlc.from_locale_lock );
+
+ return realloc( output, strlen( output ) + 1 );
+ }
+ return (char *)locale;
+}
+
+/*****************************************************************************
+ * ToLocale: converts an UTF-8 string to locale
+ *****************************************************************************/
+char *ToLocale( const char *utf8 )
+{
+ if( utf8 == NULL )
+ return NULL;
+
+ if( libvlc.to_locale != (vlc_iconv_t)(-1) )
+ {
+ char *iptr = (char *)utf8, *output, *optr;
+ size_t inb, outb;
+
+ /*
+ * We are not allowed to modify the locale pointer, even if we cast it
+ * to non-const.
+ */
+ inb = strlen( utf8 );
+ /* FIXME: I'm not sure about the value for the multiplication
+ * (for western people, multiplication is not needed) */
+ outb = inb * 2 + 1;
+
+ optr = output = calloc( outb, 1 );
+ vlc_mutex_lock( &libvlc.to_locale_lock );
+ vlc_iconv( libvlc.to_locale, NULL, NULL, NULL, NULL );
+
+ while( vlc_iconv( libvlc.to_locale, &iptr, &inb, &optr, &outb )
+ == (size_t)-1 )
+ {
+ *optr++ = '?'; /* should not happen, and yes, it sucks */
+ *iptr++;
+ vlc_iconv( libvlc.to_locale, NULL, NULL, NULL, NULL );
+ }
+ vlc_mutex_unlock( &libvlc.to_locale_lock );
+
+ return realloc( output, strlen( output ) + 1 );
+ }
+ return (char *)utf8;
+}
+
+void LocaleFree( const char *str )
+{
+ if( ( str != NULL ) && ( libvlc.to_locale != (vlc_iconv_t)(-1) ) )
+ free( (char *)str );
+}