int main (void) { static const char * our_keys[] = { "Hello", "Hella", "flowmeter", "Frostnipped", "frostnipped", "remiform", "quadrifoliolate", "singularity", "unafflicted" }; const int size = sizeof(our_keys)/sizeof(our_keys[0]); char ** keys; int i = 0; vlc_dictionary_t dict; vlc_dictionary_init( &dict, 0 ); assert( vlc_dictionary_keys_count( &dict ) == 0 ); keys = vlc_dictionary_all_keys( &dict ); assert( keys && !keys[0] ); free(keys); /* Insert some values */ for( i = 0; i < size; i++ ) vlc_dictionary_insert( &dict, our_keys[i], (void*)i ); test_dictionary_validity( &dict, our_keys, size ); vlc_dictionary_remove_value_for_key( &dict, our_keys[size-1], NULL, NULL ); test_dictionary_validity( &dict, our_keys, size-1 ); vlc_dictionary_clear( &dict, NULL, NULL ); assert( vlc_dictionary_keys_count( &dict ) == 0 ); return 0; }
/** * Initialize messages queues * This function initializes all message queues */ void msg_Create (libvlc_int_t *p_libvlc) { libvlc_priv_t *priv = libvlc_priv (p_libvlc); msg_bank_t *bank = libvlc_bank (p_libvlc); vlc_mutex_init (&bank->lock); vlc_cond_init (&bank->wait); vlc_dictionary_init( &priv->msg_enabled_objects, 0 ); priv->msg_all_objects_enabled = true; QUEUE.i_sub = 0; QUEUE.pp_sub = NULL; #ifdef UNDER_CE QUEUE.logfile = CreateFile( L"vlc-log.txt", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL ); SetFilePointer( QUEUE.logfile, 0, NULL, FILE_END ); #endif vlc_mutex_lock( &msg_stack_lock ); if( banks++ == 0 ) vlc_threadvar_create( &msg_context, cleanup_msg_context ); vlc_mutex_unlock( &msg_stack_lock ); }
/************************************************************************** * new (Public) **************************************************************************/ libvlc_media_discoverer_t * libvlc_media_discoverer_new( libvlc_instance_t * p_inst, const char * psz_name ) { /* podcast SD is a hack and only works with custom playlist callbacks. */ if( !strncasecmp( psz_name, "podcast", 7 ) ) return NULL; libvlc_media_discoverer_t *p_mdis; p_mdis = malloc(sizeof(*p_mdis) + strlen(psz_name) + 1); if( unlikely(p_mdis == NULL) ) { libvlc_printerr( "Not enough memory" ); return NULL; } p_mdis->p_libvlc_instance = p_inst; p_mdis->p_mlist = libvlc_media_list_new( p_inst ); p_mdis->p_mlist->b_read_only = true; p_mdis->p_sd = NULL; vlc_dictionary_init( &p_mdis->catname_to_submedialist, 0 ); libvlc_event_manager_init( &p_mdis->event_manager, p_mdis ); libvlc_retain( p_inst ); strcpy( p_mdis->name, psz_name ); return p_mdis; }
/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ static int Open( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_sys_t *p_sys; int err; p_sd->p_sys = p_sys = calloc( 1, sizeof( services_discovery_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; p_sd->description = _("Zeroconf network services"); vlc_dictionary_init( &p_sys->services_name_to_input_item, 1 ); p_sys->poll = avahi_threaded_poll_new(); if( p_sys->poll == NULL ) { msg_Err( p_sd, "failed to create Avahi threaded poll" ); goto error; } p_sys->client = avahi_client_new( avahi_threaded_poll_get(p_sys->poll), 0, client_callback, p_sd, &err ); if( p_sys->client == NULL ) { msg_Err( p_sd, "failed to create avahi client: %s", avahi_strerror( err ) ); goto error; } for( unsigned i = 0; i < NB_PROTOCOLS; i++ ) { AvahiServiceBrowser *sb; sb = avahi_service_browser_new( p_sys->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, protocols[i].psz_service_name, NULL, 0, browse_callback, p_sd ); if( sb == NULL ) { msg_Err( p_sd, "failed to create avahi service browser %s", avahi_strerror( avahi_client_errno(p_sys->client) ) ); goto error; } } avahi_threaded_poll_start( p_sys->poll ); return VLC_SUCCESS; error: if( p_sys->client != NULL ) avahi_client_free( p_sys->client ); if( p_sys->poll != NULL ) avahi_threaded_poll_free( p_sys->poll ); vlc_dictionary_clear( &p_sys->services_name_to_input_item, NULL, NULL ); free( p_sys ); return VLC_EGENERIC; }
/** * vlc_meta contructor. * vlc_meta_Delete() will free the returned pointer. */ vlc_meta_t *vlc_meta_New( void ) { vlc_meta_t *m = (vlc_meta_t*)malloc( sizeof(*m) ); if( !m ) return NULL; memset( m->ppsz_meta, 0, sizeof(m->ppsz_meta) ); m->i_status = 0; vlc_dictionary_init( &m->extra_tags, 0 ); return m; }
/***************************************************************************** * Open: initialize and create stuff *****************************************************************************/ static int Open( vlc_object_t *p_this ) { services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_sys_t *p_sys; int err; p_sd->p_sys = p_sys = calloc( 1, sizeof( services_discovery_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; vlc_dictionary_init( &p_sys->services_name_to_input_item, 1 ); p_sys->poll = avahi_threaded_poll_new(); if( p_sys->poll == NULL ) { msg_Err( p_sd, "failed to create Avahi threaded poll" ); goto error; } p_sys->client = avahi_client_new( avahi_threaded_poll_get(p_sys->poll), 0, client_callback, p_sd, &err ); if( p_sys->client == NULL ) { msg_Err( p_sd, "failed to create avahi client: %s", avahi_strerror( err ) ); goto error; } p_sys->sb = avahi_service_browser_new( p_sys->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_vlc-http._tcp", NULL, 0, browse_callback, p_sd ); if( p_sys->sb == NULL ) { msg_Err( p_sd, "failed to create avahi service browser" ); goto error; } return VLC_SUCCESS; error: if( p_sys->sb != NULL ) avahi_service_browser_free( p_sys->sb ); if( p_sys->client != NULL ) avahi_client_free( p_sys->client ); if( p_sys->poll != NULL ) avahi_threaded_poll_free( p_sys->poll ); vlc_dictionary_clear( &p_sys->services_name_to_input_item, NULL, NULL ); free( p_sys ); return VLC_EGENERIC; }
static int vlc_sd_probe_Open( vlc_object_t *obj ) { vlc_dictionary_t name_d; char **ppsz_dir_list; if( vlclua_dir_list( "sd", &ppsz_dir_list ) ) return VLC_ENOMEM; vlc_dictionary_init( &name_d, 32 ); for( char **ppsz_dir = ppsz_dir_list; *ppsz_dir; ppsz_dir++ ) { char **ppsz_filelist; int i_files = vlc_scandir( *ppsz_dir, &ppsz_filelist, file_select, file_compare ); if( i_files < 1 ) continue; for( char **ppsz_file = ppsz_filelist; ppsz_file < ppsz_filelist + i_files; ppsz_file++ ) { char *temp = strchr( *ppsz_file, '.' ); if( temp ) *temp = '\0'; if( vlc_dictionary_value_for_key( &name_d, *ppsz_file ) == kVLCDictionaryNotFound ) vlc_dictionary_insert( &name_d, *ppsz_file, &name_d ); free( *ppsz_file ); } free( ppsz_filelist ); } vlclua_dir_list_free( ppsz_dir_list ); int r = VLC_PROBE_CONTINUE; char **names = vlc_dictionary_all_keys( &name_d ); if( names != NULL ) { for( char **name = names; *name; ++name ) { r = vlclua_probe_sd( obj, *name ); if( r != VLC_PROBE_CONTINUE ) break; } for( char **name = names; *name; ++name ) free( *name ); free( names ); } vlc_dictionary_clear( &name_d, NULL, NULL ); return r; }
/** * Initialize messages queues * This function initializes all message queues */ msg_bank_t *msg_Create (void) { msg_bank_t *bank = malloc (sizeof (*bank)); vlc_rwlock_init (&bank->lock); vlc_dictionary_init (&bank->enabled_objects, 0); bank->all_objects_enabled = true; bank->i_sub = 0; bank->pp_sub = NULL; /* C locale to get error messages in English in the logs */ bank->locale = newlocale (LC_MESSAGES_MASK, "C", (locale_t)0); return bank; }
tt_node_t * tt_node_New( xml_reader_t* reader, tt_node_t* p_parent, const char* psz_node_name ) { tt_node_t *p_node = calloc( 1, sizeof( *p_node ) ); if( !p_node ) return NULL; p_node->i_type = TT_NODE_TYPE_ELEMENT; p_node->psz_node_name = strdup( psz_node_name ); if( unlikely( p_node->psz_node_name == NULL ) ) { free( p_node ); return NULL; } vlc_dictionary_init( &p_node->attr_dict, 0 ); tt_time_Init( &p_node->timings.begin ); tt_time_Init( &p_node->timings.end ); tt_time_Init( &p_node->timings.dur ); p_node->p_parent = p_parent; if( p_parent ) tt_node_ParentAddChild( p_parent, (tt_basenode_t *) p_node ); const char* psz_value = NULL; for( const char* psz_key = xml_ReaderNextAttr( reader, &psz_value ); psz_key != NULL; psz_key = xml_ReaderNextAttr( reader, &psz_value ) ) { char *psz_val = strdup( psz_value ); if( psz_val ) { vlc_dictionary_insert( &p_node->attr_dict, psz_key, psz_val ); if( !strcasecmp( psz_key, "begin" ) ) p_node->timings.begin = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "end" ) ) p_node->timings.end = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "dur" ) ) p_node->timings.dur = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "timeContainer" ) ) p_node->timings.i_type = strcmp( psz_val, "seq" ) ? TT_TIMINGS_PARALLEL : TT_TIMINGS_SEQUENTIAL; } } return p_node; }
/** * Initialize messages queues * This function initializes all message queues */ msg_bank_t *msg_Create (void) { msg_bank_t *bank = malloc (sizeof (*bank)); vlc_rwlock_init (&bank->lock); vlc_dictionary_init (&bank->enabled_objects, 0); bank->all_objects_enabled = true; bank->i_sub = 0; bank->pp_sub = NULL; /* C locale to get error messages in English in the logs */ bank->locale = newlocale (LC_MESSAGES_MASK, "C", (locale_t)0); vlc_mutex_lock( &msg_stack_lock ); if( banks++ == 0 ) vlc_threadvar_create( &msg_context, cleanup_msg_context ); vlc_mutex_unlock( &msg_stack_lock ); return bank; }
/************************************************************************** * new (Public) * * Init an object. **************************************************************************/ libvlc_media_discoverer_t * libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, const char * psz_name, libvlc_exception_t * p_e ) { libvlc_media_discoverer_t * p_mdis; p_mdis = malloc(sizeof(libvlc_media_discoverer_t)); if( !p_mdis ) { libvlc_exception_raise( p_e, "Not enough memory" ); return NULL; } p_mdis->p_libvlc_instance = p_inst; p_mdis->p_mlist = libvlc_media_list_new( p_inst, NULL ); p_mdis->p_mlist->b_read_only = true; p_mdis->running = false; vlc_dictionary_init( &p_mdis->catname_to_submedialist, 0 ); p_mdis->p_event_manager = libvlc_event_manager_new( p_mdis, p_inst, NULL ); libvlc_event_manager_register_event_type( p_mdis->p_event_manager, libvlc_MediaDiscovererStarted, NULL ); libvlc_event_manager_register_event_type( p_mdis->p_event_manager, libvlc_MediaDiscovererEnded, NULL ); p_mdis->p_sd = services_discovery_Create( (vlc_object_t*)p_inst->p_libvlc_int, psz_name ); if( !p_mdis->p_sd ) { libvlc_exception_raise( p_e, "Can't find the services_discovery module named '%s'", psz_name ); libvlc_media_list_release( p_mdis->p_mlist ); free( p_mdis ); return NULL; } vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemAdded, services_discovery_item_added, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemRemoved, services_discovery_item_removed, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryStarted, services_discovery_started, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryEnded, services_discovery_ended, p_mdis ); services_discovery_Start( p_mdis->p_sd ); /* Here we go */ return p_mdis; }
/** * ProcessEvents() reacts to a list of events originating from other VLC threads * * This function must be called with p_sys->lock unlocked * * @param intf_thread_t *p_intf This interface thread state * @param callback_info_t *p_events the list of events to process */ static void ProcessEvents( intf_thread_t *p_intf, callback_info_t **p_events, int i_events ) { playlist_t *p_playlist = p_intf->p_sys->p_playlist; bool b_can_play = p_intf->p_sys->b_can_play; vlc_dictionary_t player_properties, tracklist_properties; vlc_dictionary_init( &player_properties, 0 ); vlc_dictionary_init( &tracklist_properties, 0 ); for( int i = 0; i < i_events; i++ ) { switch( p_events[i]->signal ) { case SIGNAL_ITEM_CURRENT: TrackChange( p_intf ); vlc_dictionary_insert( &player_properties, "Metadata", NULL ); break; case SIGNAL_INTF_CHANGE: case SIGNAL_PLAYLIST_ITEM_APPEND: case SIGNAL_PLAYLIST_ITEM_DELETED: PL_LOCK; b_can_play = playlist_CurrentSize( p_playlist ) > 0; PL_UNLOCK; if( b_can_play != p_intf->p_sys->b_can_play ) { p_intf->p_sys->b_can_play = b_can_play; vlc_dictionary_insert( &player_properties, "CanPlay", NULL ); } if( !vlc_dictionary_has_key( &tracklist_properties, "Tracks" ) ) vlc_dictionary_insert( &tracklist_properties, "Tracks", NULL ); break; case SIGNAL_VOLUME_MUTED: case SIGNAL_VOLUME_CHANGE: vlc_dictionary_insert( &player_properties, "Volume", NULL ); break; case SIGNAL_RANDOM: vlc_dictionary_insert( &player_properties, "Shuffle", NULL ); break; case SIGNAL_REPEAT: case SIGNAL_LOOP: vlc_dictionary_insert( &player_properties, "LoopStatus", NULL ); break; case SIGNAL_STATE: vlc_dictionary_insert( &player_properties, "PlaybackStatus", NULL ); break; case SIGNAL_RATE: vlc_dictionary_insert( &player_properties, "Rate", NULL ); break; case SIGNAL_INPUT_METADATA: { input_thread_t *p_input = playlist_CurrentInput( p_playlist ); input_item_t *p_item; if( p_input ) { p_item = input_GetItem( p_input ); vlc_object_release( p_input ); if( p_item ) vlc_dictionary_insert( &player_properties, "Metadata", NULL ); } break; } case SIGNAL_CAN_SEEK: vlc_dictionary_insert( &player_properties, "CanSeek", NULL ); break; case SIGNAL_CAN_PAUSE: vlc_dictionary_insert( &player_properties, "CanPause", NULL ); break; case SIGNAL_SEEK: { input_thread_t *p_input; input_item_t *p_item; p_input = playlist_CurrentInput( p_intf->p_sys->p_playlist ); if( p_input ) { p_item = input_GetItem( p_input ); vlc_object_release( p_input ); if( p_item && ( p_item->i_id == p_events[i]->i_item ) ) SeekedEmit( p_intf ); } break; } default: assert(0); } free( p_events[i] ); } if( vlc_dictionary_keys_count( &player_properties ) ) PlayerPropertiesChangedEmit( p_intf, &player_properties ); if( vlc_dictionary_keys_count( &tracklist_properties ) ) TrackListPropertiesChangedEmit( p_intf, &tracklist_properties ); vlc_dictionary_clear( &player_properties, NULL, NULL ); vlc_dictionary_clear( &tracklist_properties, NULL, NULL ); }
/************************************************************************** * new (Public) * * Init an object. **************************************************************************/ libvlc_media_discoverer_t * libvlc_media_discoverer_new_from_name( libvlc_instance_t * p_inst, const char * psz_name ) { libvlc_media_discoverer_t * p_mdis; p_mdis = malloc(sizeof(libvlc_media_discoverer_t)); if( unlikely(!p_mdis) ) { libvlc_printerr( "Not enough memory" ); return NULL; } p_mdis->p_libvlc_instance = p_inst; p_mdis->p_mlist = libvlc_media_list_new( p_inst ); p_mdis->p_mlist->b_read_only = true; p_mdis->running = false; vlc_dictionary_init( &p_mdis->catname_to_submedialist, 0 ); p_mdis->p_event_manager = libvlc_event_manager_new( p_mdis, p_inst ); if( unlikely(p_mdis->p_event_manager == NULL) ) { free( p_mdis ); return NULL; } libvlc_event_manager_register_event_type( p_mdis->p_event_manager, libvlc_MediaDiscovererStarted ); libvlc_event_manager_register_event_type( p_mdis->p_event_manager, libvlc_MediaDiscovererEnded ); p_mdis->p_sd = vlc_sd_Create( (vlc_object_t*)p_inst->p_libvlc_int, psz_name ); if( unlikely(p_mdis->p_sd == NULL) ) { libvlc_printerr( "%s: no such discovery module found", psz_name ); libvlc_media_list_release( p_mdis->p_mlist ); libvlc_event_manager_release( p_mdis->p_event_manager ); free( p_mdis ); return NULL; } vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemAdded, services_discovery_item_added, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemRemoved, services_discovery_item_removed, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryStarted, services_discovery_started, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryEnded, services_discovery_ended, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemRemoveAll, services_discovery_removeall, p_mdis ); /* Here we go */ if( !vlc_sd_Start( p_mdis->p_sd ) ) { libvlc_printerr( "%s: internal module error", p_mdis->p_sd->psz_name ); libvlc_media_list_release( p_mdis->p_mlist ); libvlc_event_manager_release( p_mdis->p_event_manager ); free( p_mdis ); return NULL; } return p_mdis; }
/************************************************************************** * new (Public) **************************************************************************/ libvlc_media_discoverer_t * libvlc_media_discoverer_new( libvlc_instance_t * p_inst, const char * psz_name ) { /* podcast SD is a hack and only works with custom playlist callbacks. */ if( !strncasecmp( psz_name, "podcast", 7 ) ) return NULL; libvlc_media_discoverer_t *p_mdis = malloc(sizeof(*p_mdis)); if( unlikely(!p_mdis) ) { libvlc_printerr( "Not enough memory" ); return NULL; } p_mdis->p_libvlc_instance = p_inst; p_mdis->p_mlist = libvlc_media_list_new( p_inst ); p_mdis->p_mlist->b_read_only = true; p_mdis->running = false; vlc_dictionary_init( &p_mdis->catname_to_submedialist, 0 ); p_mdis->p_event_manager = libvlc_event_manager_new( p_mdis ); if( unlikely(p_mdis->p_event_manager == NULL) ) { free( p_mdis ); return NULL; } p_mdis->p_sd = vlc_sd_Create( (vlc_object_t*)p_inst->p_libvlc_int, psz_name ); if( unlikely(p_mdis->p_sd == NULL) ) { libvlc_printerr( "%s: no such discovery module found", psz_name ); libvlc_media_list_release( p_mdis->p_mlist ); libvlc_event_manager_release( p_mdis->p_event_manager ); free( p_mdis ); return NULL; } vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemAdded, services_discovery_item_added, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemRemoved, services_discovery_item_removed, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryStarted, services_discovery_started, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryEnded, services_discovery_ended, p_mdis ); vlc_event_attach( services_discovery_EventManager( p_mdis->p_sd ), vlc_ServicesDiscoveryItemRemoveAll, services_discovery_removeall, p_mdis ); libvlc_retain( p_inst ); return p_mdis; }