control/tag_query.c: Make tag_query_match actually match something.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Mon, 20 Aug 2007 01:40:03 +0000 (01:40 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Mon, 20 Aug 2007 01:40:03 +0000 (01:40 +0000)
include/vlc/libvlc.h
src/control/libvlc_internal.h
src/control/media_descriptor.c
src/control/tag_query.c

index 95f42d0..3c7566b 100644 (file)
@@ -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 * );
index 088c739..99b07b2 100644 (file)
@@ -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
index 0174054..37e3d05 100644 (file)
@@ -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;
index 8de212c..f804e6a 100644 (file)
@@ -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;
 }