]> git.sesse.net Git - vlc/blobdiff - include/vlc_common.h
A bit of headers cleanup
[vlc] / include / vlc_common.h
index 60204149f9ef06ad807cd363fc975ecfe397538d..075d16bb43f44b6ceaeab4d0e6329b0ea523452a 100644 (file)
@@ -57,7 +57,6 @@
 #endif
 
 #include "vlc_config.h"
-#include "modules_inner.h"
 
 /*****************************************************************************
  * Required system headers
@@ -198,11 +197,13 @@ typedef uint32_t vlc_fourcc_t;
  *****************************************************************************/
 
 /* Internal types */
-typedef struct libvlc_t libvlc_t;
-typedef struct vlc_t vlc_t;
+typedef struct libvlc_global_data_t libvlc_global_data_t;
+typedef struct libvlc_int_t libvlc_int_t;
 typedef struct variable_t variable_t;
 typedef struct date_t date_t;
-typedef struct hashtable_entry_t hashtable_entry_t;
+typedef struct dict_entry_t dict_entry_t;
+typedef struct dict_t dict_t;
+typedef struct gc_object_t gc_object_t ;
 
 /* Messages */
 typedef struct msg_bank_t msg_bank_t;
@@ -218,14 +219,11 @@ typedef struct msg_subscription_t msg_subscription_t;
 typedef enum {
     PLAYLIST_PLAY,      /**< No arg.                            res=can fail*/
     PLAYLIST_AUTOPLAY,  /**< No arg.                            res=cant fail*/
-    PLAYLIST_VIEWPLAY,  /**< arg1= int, arg2= playlist_item_t*,*/
-                        /**  arg3 = playlist_item_t*          , res=can fail */
-    PLAYLIST_ITEMPLAY,  /** <arg1 = playlist_item_t *         , res=can fail */
+    PLAYLIST_VIEWPLAY,  /**< arg1= playlist_item_t*,*/
+                        /**  arg2 = playlist_item_t*          , res=can fail */
     PLAYLIST_PAUSE,     /**< No arg                             res=can fail*/
     PLAYLIST_STOP,      /**< No arg                             res=can fail*/
     PLAYLIST_SKIP,      /**< arg1=int,                          res=can fail*/
-    PLAYLIST_GOTO,      /**< arg1=int                           res=can fail */
-    PLAYLIST_VIEWGOTO   /**< arg1=int                           res=can fail */
 } playlist_command_t;
 
 
@@ -237,6 +235,7 @@ typedef struct services_discovery_t services_discovery_t;
 typedef struct services_discovery_sys_t services_discovery_sys_t;
 typedef struct playlist_add_t playlist_add_t;
 typedef struct playlist_preparse_t playlist_preparse_t;
+typedef struct playlist_fetcher_t playlist_fetcher_t;
 
 /* Modules */
 typedef struct module_bank_t module_bank_t;
@@ -327,7 +326,7 @@ typedef struct sout_mux_sys_t sout_mux_sys_t;
 typedef struct sout_stream_t    sout_stream_t;
 typedef struct sout_stream_sys_t sout_stream_sys_t;
 
-typedef struct sout_cfg_t       sout_cfg_t;
+typedef struct config_chain_t       config_chain_t;
 typedef struct sap_session_t    sap_session_t;
 typedef struct sap_address_t sap_address_t;
 typedef struct session_descriptor_t session_descriptor_t;
@@ -335,6 +334,18 @@ typedef struct announce_method_t announce_method_t;
 typedef struct announce_handler_t announce_handler_t;
 typedef struct sap_handler_t sap_handler_t;
 
+typedef struct sout_param_t sout_param_t;
+typedef struct sout_pcat_t sout_pcat_t;
+typedef struct sout_std_t sout_std_t;
+typedef struct sout_display_t sout_display_t;
+typedef struct sout_duplicate_t sout_duplicate_t;
+typedef struct sout_transcode_t sout_transcode_t;
+typedef struct sout_chain_t sout_chain_t;
+typedef struct streaming_profile_t streaming_profile_t;
+typedef struct sout_module_t sout_module_t;
+typedef struct sout_gui_descr_t sout_gui_descr_t;
+typedef struct profile_parser_t profile_parser_t;
+
 /* Decoders */
 typedef struct decoder_t      decoder_t;
 typedef struct decoder_sys_t  decoder_sys_t;
@@ -356,6 +367,9 @@ typedef struct vlc_acl_t vlc_acl_t;
 
 /* Misc */
 typedef struct iso639_lang_t iso639_lang_t;
+typedef struct device_t device_t;
+typedef struct device_probe_t device_probe_t;
+typedef struct probe_sys_t probe_sys_t;
 
 /* block */
 typedef struct block_t      block_t;
@@ -416,6 +430,7 @@ typedef struct vlm_schedule_t vlm_schedule_t;
 
 /* divers */
 typedef struct vlc_meta_t    vlc_meta_t;
+typedef struct meta_export_t meta_export_t;
 
 /* Stats */
 typedef struct counter_t     counter_t;
@@ -428,6 +443,20 @@ typedef struct global_stats_t global_stats_t;
 typedef struct update_t update_t;
 typedef struct update_iterator_t update_iterator_t;
 
+/* Meta engine */
+typedef struct meta_engine_t meta_engine_t;
+
+/* stat/lstat/fstat */
+#ifdef WIN32
+#include <sys/stat.h>
+struct _stati64;
+#define stat _stati64
+#define fstat _fstati64
+/* You should otherwise use utf8_stat and utf8_lstat. */
+#else
+struct stat;
+#endif
+
 /*****************************************************************************
  * Variable callbacks
  *****************************************************************************/
@@ -440,6 +469,9 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
 /*****************************************************************************
  * Plug-in stuff
  *****************************************************************************/
+
+#include "vlc_modules_macros.h"
+
 #if !defined (__PLUGIN__) || defined (HAVE_SHARED_LIBVLC)
 #   ifdef __cplusplus
 #      define VLC_EXPORT( type, name, args ) extern "C" type name args
@@ -450,6 +482,7 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
 #   define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
     extern module_symbols_t* p_symbols;
 #endif
+#define VLC_INTERNAL( type, name, args ) VLC_EXPORT (type, name, args)
 
 /*****************************************************************************
  * OS-specific headers and thread types
@@ -479,7 +512,7 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
     int   i_object_id;                                                      \
     int   i_object_type;                                                    \
     const char *psz_object_type;                                            \
-    char *psz_object_name;                                                  \
+    const char *psz_object_name;                                            \
                                                                             \
     /* Messages header */                                                   \
     char *psz_header;                                                       \
@@ -506,8 +539,8 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
     variable_t *    p_vars;                                                 \
                                                                             \
     /* Stuff related to the libvlc structure */                             \
-    libvlc_t *      p_libvlc;                      /**< root of all evil */ \
-    vlc_t *         p_vlc;                   /**< (root of all evil) - 1 */ \
+    libvlc_global_data_t *p_libvlc_global;         /**< root of all evil */ \
+    libvlc_int_t *p_libvlc;                  /**< (root of all evil) - 1 */ \
                                                                             \
     volatile int    i_refcount;                         /**< usage count */ \
     vlc_object_t *  p_parent;                            /**< our parent */ \
@@ -525,6 +558,44 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
 #define VLC_OBJECT( x ) \
     ((vlc_object_t *)(x))+0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
 
+#define VLC_GC_MEMBERS                                                       \
+/** \name VLC_GC_MEMBERS                                                     \
+ * these members are common to all objects that wish to be garbage-collected \
+ */                                                                          \
+/**@{*/                                                                      \
+    int i_gc_refcount;                                                       \
+    void (*pf_destructor) ( gc_object_t * );                                 \
+    void *p_destructor_arg;                                                  \
+/**@}*/
+
+struct gc_object_t
+{
+            VLC_GC_MEMBERS
+};
+
+static inline void __vlc_gc_incref( gc_object_t * p_gc )
+{
+    p_gc->i_gc_refcount ++;
+};
+
+static inline void __vlc_gc_decref( gc_object_t *p_gc )
+{
+    p_gc->i_gc_refcount -- ;
+
+    if( p_gc->i_gc_refcount == 0 )
+    {
+        p_gc->pf_destructor( p_gc );
+        /* Do not use the p_gc pointer from now on ! */
+     }
+}
+
+#define vlc_gc_incref( a ) __vlc_gc_incref( (gc_object_t *)a )
+#define vlc_gc_decref( a ) __vlc_gc_decref( (gc_object_t *)a )
+#define vlc_gc_init( a,b,c ) {  ((gc_object_t *)a)->i_gc_refcount = 0; \
+                              ((gc_object_t *)a)->pf_destructor = b; \
+                              ((gc_object_t *)a)->p_destructor_arg = c; }
+
+
 /*****************************************************************************
  * Macros and inline functions
  *****************************************************************************/
@@ -556,149 +627,69 @@ static int64_t GCD( int64_t a, int64_t b )
     else return a;
 }
 
-/* Dynamic array handling: realloc array, move data, increment position */
-#if defined( _MSC_VER ) && _MSC_VER < 1300 && !defined( UNDER_CE )
-#   define VLCCVP (void**) /* Work-around for broken compiler */
-#else
-#   define VLCCVP
-#endif
-#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )                           \
-    do                                                                        \
-    {                                                                         \
-        if( !i_oldsize ) (p_ar) = NULL;                                       \
-        (p_ar) = VLCCVP realloc( p_ar, ((i_oldsize) + 1) * sizeof(*(p_ar)) ); \
-        if( (i_oldsize) - (i_pos) )                                           \
-        {                                                                     \
-            memmove( (p_ar) + (i_pos) + 1, (p_ar) + (i_pos),                  \
-                     ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );           \
-        }                                                                     \
-        (p_ar)[i_pos] = elem;                                                 \
-        (i_oldsize)++;                                                        \
-    }                                                                         \
-    while( 0 )
-
-#define REMOVE_ELEM( p_ar, i_oldsize, i_pos )                                 \
-    do                                                                        \
-    {                                                                         \
-        if( (i_oldsize) - (i_pos) - 1 )                                       \
-        {                                                                     \
-            memmove( (p_ar) + (i_pos),                                        \
-                     (p_ar) + (i_pos) + 1,                                    \
-                     ((i_oldsize) - (i_pos) - 1) * sizeof( *(p_ar) ) );       \
-        }                                                                     \
-        if( i_oldsize > 1 )                                                   \
-        {                                                                     \
-            (p_ar) = realloc( p_ar, ((i_oldsize) - 1) * sizeof( *(p_ar) ) );  \
-        }                                                                     \
-        else                                                                  \
-        {                                                                     \
-            free( p_ar );                                                     \
-            (p_ar) = NULL;                                                    \
-        }                                                                     \
-        (i_oldsize)--;                                                        \
-    }                                                                         \
-    while( 0 )
-
-
-#define TAB_APPEND( count, tab, p )             \
-    if( (count) > 0 )                           \
-    {                                           \
-        (tab) = realloc( tab, sizeof( void ** ) * ( (count) + 1 ) ); \
-    }                                           \
-    else                                        \
-    {                                           \
-        (tab) = malloc( sizeof( void ** ) );    \
-    }                                           \
-    (tab)[count] = (p);        \
-    (count)++
-
-#define TAB_FIND( count, tab, p, index )        \
-    {                                           \
-        int _i_;                                \
-        (index) = -1;                           \
-        for( _i_ = 0; _i_ < (count); _i_++ )    \
-        {                                       \
-            if( (tab)[_i_] == (p) )  \
-            {                                   \
-                (index) = _i_;                  \
-                break;                          \
-            }                                   \
-        }                                       \
-    }
-
-#define TAB_REMOVE( count, tab, p )             \
-    {                                           \
-        int _i_index_;                          \
-        TAB_FIND( count, tab, p, _i_index_ );   \
-        if( _i_index_ >= 0 )                    \
-        {                                       \
-            if( (count) > 1 )                     \
-            {                                   \
-                memmove( ((void**)(tab) + _i_index_),    \
-                         ((void**)(tab) + _i_index_+1),  \
-                         ( (count) - _i_index_ - 1 ) * sizeof( void* ) );\
-            }                                   \
-            (count)--;                          \
-            if( (count) == 0 )                  \
-            {                                   \
-                free( tab );                    \
-                (tab) = NULL;                   \
-            }                                   \
-        }                                       \
-    }
-
-/* Hash tables handling */
-struct hashtable_entry_t
-{
-    int       i_id;
-    char     *psz_name;
-    uint64_t  i_hash;
-    void     *p_data;
-};
+/* Malloc with automatic error */
+#define MALLOC_VOID( var, type ) { var = (type*)malloc( sizeof( type) ); \
+                                   if( !var ) return; }
+#define MALLOC_NULL( var, type ) { var = (type*)malloc( sizeof( type) ); \
+                                   if( !var ) return NULL; }
+#define MALLOC_ERR( var, type ) { var = (type*)malloc( sizeof( type) ); \
+                                   if( !var ) return VLC_ENOMEM; }
+#define MALLOC_GOTOERR( var, type ) { var = (type*)malloc( sizeof( type) ); \
+                                      if( !var ) goto error; }
+#define DECMALLOC_VOID( var, type ) type* var = (type*)malloc( sizeof(type) );\
+                                    if( !var ) return;
+#define DECMALLOC_ERR( var, type ) type* var = (type*)malloc( sizeof(type) );\
+                                    if( !var ) return VLC_ENOMEM;
+#define DECMALLOC_NULL( var, type ) type* var = (type*)malloc( sizeof(type) );\
+                                    if( !var ) return NULL;
+
+#define FREENULL(a) if( a ) { free( a ); a = NULL; }
+#define FREE(a) if( a ) { free( a ); }
 
-VLC_EXPORT( void, vlc_HashInsert, (hashtable_entry_t **, int *, int, const char *, void *));
-VLC_EXPORT( void*, vlc_HashRetrieve, (hashtable_entry_t*, int, int, const char *) );
-VLC_EXPORT( int, vlc_HashLookup, (hashtable_entry_t *, int, int, const char *) );
+#define EMPTY_STR(str) (!str || !*str)
 
+VLC_EXPORT( char const *, vlc_error, ( int ) );
+
+#include <vlc_arrays.h>
 
 /* MSB (big endian)/LSB (little endian) conversions - network order is always
  * MSB, and should be used for both network communications and files. Note that
  * byte orders other than little and big endians are not supported, but only
  * the VAX seems to have such exotic properties. */
-static inline uint16_t U16_AT( void const * _p )
+static inline uint16_t U16_AT( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint16_t)p[0] << 8) | p[1] );
 }
-static inline uint32_t U32_AT( void const * _p )
+static inline uint32_t U32_AT( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16)
               | ((uint32_t)p[2] << 8) | p[3] );
 }
-static inline uint64_t U64_AT( void const * _p )
+static inline uint64_t U64_AT( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48)
               | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32)
               | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16)
               | ((uint64_t)p[6] << 8) | p[7] );
 }
 
-static inline uint16_t GetWLE( void const * _p )
+static inline uint16_t GetWLE( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint16_t)p[1] << 8) | p[0] );
 }
-static inline uint32_t GetDWLE( void const * _p )
+static inline uint32_t GetDWLE( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16)
               | ((uint32_t)p[1] << 8) | p[0] );
 }
-static inline uint64_t GetQWLE( void const * _p )
+static inline uint64_t GetQWLE( const void * _p )
 {
-    uint8_t * p = (uint8_t *)_p;
+    const uint8_t * p = (const uint8_t *)_p;
     return ( ((uint64_t)p[7] << 56) | ((uint64_t)p[6] << 48)
               | ((uint64_t)p[5] << 40) | ((uint64_t)p[4] << 32)
               | ((uint64_t)p[3] << 24) | ((uint64_t)p[2] << 16)
@@ -753,7 +744,7 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
     SetDWBE( p, ( i_qw >> 32)&0xffffffff );
 }
 
-#if WORDS_BIGENDIAN
+#ifdef WORDS_BIGENDIAN
 #   define hton16(i)   ( i )
 #   define hton32(i)   ( i )
 #   define hton64(i)   ( i )
@@ -846,6 +837,13 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
 #   define vlc_strndup NULL
 #endif
 
+#ifndef HAVE_STRLCPY
+#   define strlcpy vlc_strlcpy
+    VLC_EXPORT( size_t, vlc_strlcpy, ( char *, const char *, size_t ) );
+#elif !defined(__PLUGIN__)
+#   define vlc_strlcpy NULL
+#endif
+
 #ifndef HAVE_ATOF
 #   define atof vlc_atof
     VLC_EXPORT( double, vlc_atof, ( const char *nptr ) );
@@ -873,6 +871,18 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
 #   define vlc_strtoll NULL
 #endif
 
+#if defined(SYS_BEOS) \
+ || (defined (__FreeBSD__) && (__FreeBSD__ < 5))
+    typedef struct {
+        long long quot; /* Quotient. */
+        long long rem;  /* Remainder. */
+    } lldiv_t;
+#   define lldiv vlc_lldiv
+    VLC_EXPORT( lldiv_t, vlc_lldiv, ( long long numer, long long denom ) );
+#elif !defined(__PLUGIN__)
+#   define vlc_lldiv NULL
+#endif
+
 #ifndef HAVE_SCANDIR
 #   define scandir vlc_scandir
 #   define alphasort vlc_alphasort
@@ -960,9 +970,20 @@ static inline void _SetQWBE( uint8_t *p, uint64_t i_qw )
 #   endif
 #endif
 
-    VLC_EXPORT( void *, vlc_opendir_wrapper, ( const char * ) );
-    VLC_EXPORT( struct dirent *, vlc_readdir_wrapper, ( void * ) );
-    VLC_EXPORT( int, vlc_closedir_wrapper, ( void * ) );
+#if defined (WIN32)
+#   include <dirent.h>
+VLC_INTERNAL( void *, vlc_wopendir, ( const wchar_t * ) );
+VLC_INTERNAL( struct _wdirent *, vlc_wreaddir, ( void * ) );
+VLC_EXPORT( int, vlc_wclosedir, ( void * ) );
+#   define opendir Use_utf8_opendir_or_vlc_wopendir_instead!
+#   define readdir Use_utf8_readdir_or_vlc_wreaddir_instead!
+#   define closedir vlc_wclosedir
+#   define _wopendir vlc_wopendir
+#   define _wreaddir vlc_wreaddir
+#   define _wclosedir vlc_wclosedir
+#else
+#   define vlc_wclosedir NULL
+#endif
 
 /* Format type specifiers for 64 bits numbers */
 #if defined(__CYGWIN32__) || (!defined(WIN32) && !defined(UNDER_CE))
@@ -1074,7 +1095,7 @@ VLC_EXPORT( char *, vlc_wraptext, ( const char *, int ) );
 /* iconv wrappers (defined in src/extras/libc.c) */
 typedef void *vlc_iconv_t;
 VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) );
-VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, char **, size_t *, char **, size_t * ) );
+VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) );
 VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) );
 
 /* execve wrapper (defined in src/extras/libc.c) */
@@ -1099,7 +1120,7 @@ VLC_EXPORT( int, __vlc_execve, ( vlc_object_t *p_object, int i_argc, char **pp_a
 /*****************************************************************************
  * I18n stuff
  *****************************************************************************/
-#ifndef HAVE_SHARED_LIBVLC
+#if defined (WIN32) || !defined (HAVE_SHARED_LIBVLC)
 VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) );
 #endif
 
@@ -1115,15 +1136,15 @@ VLC_EXPORT( char *, vlc_dgettext, ( const char *package, const char *msgid ) );
 #       include <libintl.h>
 #   endif
 #   undef _
-#   ifdef HAVE_SHARED_LIBVLC
-#       define _(String) dgettext (PACKAGE_NAME, String)
+#   if defined (WIN32) || !defined (HAVE_SHARED_LIBVLC)
+#       define _(String) vlc_dgettext (PACKAGE_NAME, String)
 #   else
-#       define _(String) vlc_dgettext(PACKAGE_NAME, String)
+#       define _(String) dgettext(PACKAGE_NAME, String)
 #   endif
-#   define N_(String) ((char*)(String))
+#   define N_(String) (String)
 #else
-#   define _(String) ((char*)(String))
-#   define N_(String) ((char*)(String))
+#   define _(String) (String)
+#   define N_(String) (String)
 #endif
 
 /*****************************************************************************
@@ -1134,27 +1155,39 @@ VLC_EXPORT( const char *, VLC_CompileBy, ( void ) );
 VLC_EXPORT( const char *, VLC_CompileHost, ( void ) );
 VLC_EXPORT( const char *, VLC_CompileDomain, ( void ) );
 VLC_EXPORT( const char *, VLC_Compiler, ( void ) );
-VLC_EXPORT( const char *, VLC_Changeset, ( void ) );
 VLC_EXPORT( const char *, VLC_Error, ( int ) );
 
 /*****************************************************************************
  * Additional vlc stuff
  *****************************************************************************/
 #ifndef HAVE_SHARED_LIBVLC
+#   ifdef HAVE_DIRENT_H
+#   include <dirent.h>  /* for DIR typedef in vlc_symbols.h */
+#   endif
+VLC_EXPORT( const char *, VLC_Changeset, ( void ) );
 #   include "vlc_symbols.h"
+#else
+#   define VLC_Changeset( ) ("exported")
 #endif
-#include "os_specific.h"
+#include "vlc_os_specific.h"
 #include "vlc_messages.h"
-#include "variables.h"
+#include "vlc_variables.h"
 #include "vlc_objects.h"
 #include "vlc_threads_funcs.h"
-#include "mtime.h"
-#include "modules.h"
+#include "vlc_mtime.h"
+#include "vlc_modules.h"
 #include "main.h"
-#include "configuration.h"
+#include "vlc_configuration.h"
 
 #if defined( __BORLANDC__ )
 #   undef PACKAGE
 #   define PACKAGE
 #endif
 
+#if defined( WIN32 ) || defined( UNDER_CE )
+#   define DIR_SEP_CHAR '\\'
+#   define DIR_SEP "\\"
+#else
+#   define DIR_SEP_CHAR '/'
+#   define DIR_SEP "/"
+#endif