Commit 1eda9d86 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

control/tag_query.c: Make tag_query_match actually match something.

parent 3374626a
......@@ -462,6 +462,12 @@ VLC_PUBLIC_API void
VLC_PUBLIC_API void
libvlc_tag_query_retain( libvlc_tag_query_t * );
VLC_PUBLIC_API void
libvlc_tag_query_set_match_tag_and_key( libvlc_tag_query_t * p_q,
libvlc_tag_t tag,
char * psz_tag_key,
libvlc_exception_t * );
VLC_PUBLIC_API vlc_bool_t
libvlc_tag_query_match( libvlc_tag_query_t *, libvlc_media_descriptor_t *,
libvlc_exception_t * );
......
......@@ -63,6 +63,12 @@ struct libvlc_instance_t
struct libvlc_callback_entry_list_t *p_callback_list;
};
struct libvlc_tags_storage_t
{
char ** ppsz_tags;
int i_count;
};
struct libvlc_media_descriptor_t
{
libvlc_event_manager_t * p_event_manager;
......@@ -77,6 +83,8 @@ struct libvlc_tag_query_t
{
struct libvlc_instance_t *p_libvlc_instance; /* Parent instance */
int i_refcount;
libvlc_tag_t tag;
char * psz_tag_key;
};
struct libvlc_tree_t
......
......@@ -69,12 +69,6 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] =
[vlc_meta_TrackID] = libvlc_meta_TrackID
};
struct tag_storage
{
char ** ppsz_tags;
int i_count;
};
/**************************************************************************
* input_item_subitem_added (Private) (vlc event Callback)
**************************************************************************/
......@@ -246,7 +240,7 @@ void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md )
for( i = 0; all_keys[i]; i++ )
{
int j;
struct tag_storage * p_ts = vlc_dictionary_value_for_key( &p_md->tags, all_keys[i] );
struct libvlc_tags_storage_t * p_ts = vlc_dictionary_value_for_key( &p_md->tags, all_keys[i] );
for( j = 0; j < p_ts->i_count; j++ )
{
free( p_ts->ppsz_tags[j] );
......@@ -325,7 +319,7 @@ void libvlc_media_descriptor_add_tag( libvlc_media_descriptor_t *p_md,
const libvlc_tag_t tag,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
struct libvlc_tags_storage_t * p_ts;
if( !tag || !key )
return;
......@@ -334,8 +328,8 @@ void libvlc_media_descriptor_add_tag( libvlc_media_descriptor_t *p_md,
if( !p_ts )
{
p_ts = malloc(sizeof(struct tag_storage));
memset( p_ts, 0, sizeof(struct tag_storage) );
p_ts = malloc(sizeof(struct libvlc_tags_storage_t));
memset( p_ts, 0, sizeof(struct libvlc_tags_storage_t) );
}
p_ts->i_count++;
......@@ -356,7 +350,7 @@ void libvlc_media_descriptor_remove_tag( libvlc_media_descriptor_t *p_md,
const libvlc_tag_t tag,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
struct libvlc_tags_storage_t * p_ts;
int i;
if( !tag || !key )
......@@ -387,7 +381,7 @@ int libvlc_media_descriptor_tags_count_for_key( libvlc_media_descriptor_t *p_md,
const char * key,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
struct libvlc_tags_storage_t * p_ts;
if( !key )
return 0;
......@@ -408,7 +402,7 @@ libvlc_media_descriptor_tag_at_index_for_key( libvlc_media_descriptor_t *p_md,
const char * key,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
struct libvlc_tags_storage_t * p_ts;
if( !key )
return NULL;
......
......@@ -36,7 +36,7 @@
*/
/**************************************************************************
* libvlc_tag_query_new (Public)
* new (Public)
*
* Init an object.
**************************************************************************/
......@@ -54,12 +54,14 @@ libvlc_tag_query_new( libvlc_instance_t * p_inst,
p_q->p_libvlc_instance = p_inst;
p_q->i_refcount = 1;
p_q->tag = NULL;
p_q->psz_tag_key = NULL;
return p_q;
}
/**************************************************************************
* libvlc_media_list_release (Public)
* release (Public)
*
* Release an object.
**************************************************************************/
......@@ -70,11 +72,14 @@ void libvlc_tag_query_release( libvlc_tag_query_t * p_q )
if( p_q->i_refcount > 0 )
return;
free( p_q->tag );
free( p_q->psz_tag_key );
free( p_q );
}
/**************************************************************************
* libvlc_media_list_retain (Public)
* retain (Public)
*
* Release an object.
**************************************************************************/
......@@ -83,9 +88,22 @@ void libvlc_tag_query_retain( libvlc_tag_query_t * p_q )
p_q->i_refcount++;
}
/**************************************************************************
* set_match_tag_and_key (Public)
**************************************************************************/
void libvlc_tag_query_set_match_tag_and_key( libvlc_tag_query_t * p_q,
libvlc_tag_t tag,
char * psz_tag_key,
libvlc_exception_t * p_e )
{
(void)p_e;
p_q->tag = strdup( tag );
p_q->psz_tag_key = strdup( psz_tag_key );
}
/**************************************************************************
* libvlc_query_match (Public)
* match (Public)
*
* Return true if the query p_q is matched in p_md
**************************************************************************/
......@@ -94,10 +112,23 @@ libvlc_tag_query_match( libvlc_tag_query_t * p_q,
libvlc_media_descriptor_t * p_md,
libvlc_exception_t * p_e )
{
(void)p_q;
(void)p_md;
(void)p_e;
int i;
struct libvlc_tags_storage_t * p_ts;
(void)p_e;
if( !p_q->psz_tag_key )
return 1;
p_ts = vlc_dictionary_value_for_key( &p_md->tags, p_q->psz_tag_key );
if( !p_q->tag )
return p_ts->i_count > 0;
for( i = 0; i < p_ts->i_count; i++ )
{
if( !strcmp( p_ts->ppsz_tags[i], p_q->tag ) )
return 1;
}
/* In construction... */
return 1;
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment