[easytag/wip/musicbrainz-support] Level One Manual Search is now Asynchronous.



commit a2fa0d83e8e69727e766e89c5f69141d39b0c52f
Author: Abhinav <abhijangda hotmail com>
Date:   Sat May 17 10:38:21 2014 +0530

    Level One Manual Search is now Asynchronous.

 Makefile.am              |    3 +
 src/mb_search.c          |  268 ++++++++++++++++++++++++++++++++++++++++++++++
 src/mb_search.h          |   37 +++++++
 src/mbentityview.c       |  124 +++++++++++-----------
 src/mbentityview.h       |   18 +---
 src/musicbrainz_dialog.c |  219 ++++---------------------------------
 6 files changed, 396 insertions(+), 273 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index bed227d..cf2c36a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -67,6 +67,7 @@ easytag_SOURCES = \
        src/musepack_header.c \
        src/musicbrainz_dialog.c \
        src/mbentityview.c \
+       src/mb_search.c \
        src/ogg_header.c \
        src/ogg_tag.c \
        src/opus_header.c \
@@ -115,6 +116,8 @@ easytag_headers = \
        src/mp4_tag.h \
        src/musepack_header.h \
        src/musicbrainz_dialog.h \
+       src/mb_search.h \
+       src/mbentityview.h \
        src/ogg_header.h \
        src/ogg_tag.h \
        src/opus_header.h \
diff --git a/src/mb_search.c b/src/mb_search.c
new file mode 100644
index 0000000..e851faf
--- /dev/null
+++ b/src/mb_search.c
@@ -0,0 +1,268 @@
+/* mb_search.c - 2014/05/05 */
+/*
+ *  EasyTAG - Tag editor for MP3 and Ogg Vorbis files
+ *  Copyright (C) 2000-2014  Abhinav Jangda <abhijangda hotmail com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "mb_search.h"
+
+/*
+ * et_musicbrainz_search_in_entity:
+ * @string:
+ * @child_type:
+ * @parent_type:
+ * @parent_mbid:
+ * @root:
+ *
+ *
+ */
+void
+et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
+                                 enum MB_ENTITY_TYPE parent_type,
+                                 gchar *parent_mbid, GNode *root)
+{
+    Mb5Query query;
+    Mb5Metadata metadata;
+    char error_message[256];
+    tQueryResult result;
+    //int httpcode;
+    char *param_values[1];
+    char *param_names[1];
+
+    param_names [0] = "inc";
+    query = mb5_query_new ("easytag", NULL, 0);
+
+    if (child_type == MB_ENTITY_TYPE_ALBUM &&
+        parent_type == MB_ENTITY_TYPE_ARTIST)
+    {
+        param_values [0] = "releases";
+        metadata = mb5_query_query (query, "artist", parent_mbid, "", 1, param_names,
+                                    param_values);
+        result = mb5_query_get_lastresult (query);
+        //httpcode = mb5_query_get_lasthttpcode (query);
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5ReleaseList list;
+                Mb5Artist artist;
+                artist = mb5_metadata_get_artist (metadata);
+                list = mb5_artist_get_releaselist (artist);
+
+                for (i = 0; i < mb5_release_list_size (list); i++)
+                {
+                    Mb5Release release;
+                    release = mb5_artist_list_item (list, i);
+                    if (release)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = release;
+                        entity->type = MB_ENTITY_TYPE_ALBUM;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (param_values [0]);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+    else if (child_type == MB_ENTITY_TYPE_TRACK &&
+             parent_type == MB_ENTITY_TYPE_ALBUM)
+    {
+        
+    }
+
+    return;
+    err:
+    mb5_query_get_lasterrormessage (query, error_message,
+                                    sizeof(error_message));
+    printf ("Error searching MusicBrainz Database: '%s'\n", error_message);
+    mb5_query_delete (query);
+}
+
+/*
+ * et_musicbrainz_search:
+ * @string:
+ * @type:
+ * @root:
+ *
+ *
+ */
+void
+et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root)
+{
+    /* TODO: to free metadata, first use mb5_<entity>_copy to copy that entity */
+    Mb5Query query;
+    Mb5Metadata metadata;
+    char error_message[256];
+    tQueryResult result;
+    //int HTTPCode;
+    char *param_values[2];
+    char *param_names[2];
+
+    param_names [0] = "query";
+    param_names [1] = "limit";
+    param_values [1] = SEARCH_LIMIT_STR;
+    query = mb5_query_new ("easytag", NULL, 0);
+
+    if (type == MB_ENTITY_TYPE_ARTIST)
+    {
+        param_values [0] = g_strconcat ("artist:", string, NULL);
+        metadata = mb5_query_query (query, "artist", "", "", 2, param_names,
+                                    param_values);
+        result = mb5_query_get_lastresult (query);
+        //HTTPCode = mb5_query_get_lasthttpcode (Query);
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5ArtistList list;
+                list = mb5_metadata_get_artistlist (metadata);
+
+                for (i = 0; i < mb5_artist_list_size (list); i++)
+                {
+                    Mb5Artist artist;
+                    artist = mb5_artist_list_item (list, i);
+                    if (artist)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = mb5_artist_clone (artist);
+                        entity->type = MB_ENTITY_TYPE_ARTIST;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (param_values [0]);
+            mb5_metadata_delete (metadata);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+
+    else if (type == MB_ENTITY_TYPE_ALBUM)
+    {
+        param_values [0] = g_strconcat ("release:", string, NULL);
+        metadata = mb5_query_query (query, "release", "", "", 2, param_names,
+                                    param_values);
+        result = mb5_query_get_lastresult (query);
+        //HTTPCode = mb5_query_get_lasthttpcode (Query);
+        if (result == eQuery_Success)
+        {
+            if (metadata)
+            {
+                int i;
+                Mb5ReleaseList list;
+                list = mb5_metadata_get_releaselist (metadata);
+
+                for (i = 0; i < mb5_release_list_size (list); i++)
+                {
+                    Mb5Release release;
+                    release = mb5_artist_list_item (list, i);
+                    if (release)
+                    {
+                        GNode *node;
+                        EtMbEntity *entity;
+                        entity = g_malloc (sizeof (EtMbEntity));
+                        entity->entity = mb5_release_clone (release);
+                        entity->type = MB_ENTITY_TYPE_ALBUM;
+                        node = g_node_new (entity);
+                        g_node_append (root, node);
+                    }
+                }
+            }
+
+            g_free (param_values [0]);
+            mb5_metadata_delete (metadata);
+        }
+        else
+        {
+            goto err;
+        }
+    }
+
+    else if (type == MB_ENTITY_TYPE_TRACK)
+    {
+    }
+
+    mb5_query_delete (query);
+    return;
+
+    err:
+    mb5_query_get_lasterrormessage (query, error_message,
+                                    sizeof(error_message));
+    printf ("Error searching MusicBrainz Database: '%s'\n", error_message);
+}
+
+/*
+ * free_mb_tree:
+ * @node:
+ *
+ *
+ */
+void
+free_mb_tree (GNode *node)
+{
+    EtMbEntity *et_entity;
+    GNode *child;
+
+    et_entity = (EtMbEntity *)node->data;
+
+    if (et_entity)
+    {
+        if (et_entity->type == MB_ENTITY_TYPE_ARTIST)
+        {
+            mb5_artist_delete ((Mb5Artist)et_entity->entity);
+        }
+
+        else if (et_entity->type == MB_ENTITY_TYPE_ALBUM)
+        {
+            mb5_release_delete ((Mb5Release)et_entity->entity);
+        }
+
+        else if (et_entity->type == MB_ENTITY_TYPE_TRACK)
+        {
+            mb5_recording_delete ((Mb5Recording)et_entity->entity);
+        }
+    }
+
+    g_free (et_entity);
+    g_node_unlink (node);
+    child = g_node_first_child (node);
+
+    while (child)
+    {
+        free_mb_tree (child);
+        child = g_node_next_sibling (child);
+    }
+
+    g_node_destroy (node);
+}
\ No newline at end of file
diff --git a/src/mb_search.h b/src/mb_search.h
new file mode 100644
index 0000000..5a8454a
--- /dev/null
+++ b/src/mb_search.h
@@ -0,0 +1,37 @@
+
+#ifndef __MB_SEARCH_H__
+#define __MB_SEARCH_H__
+
+#include <gtk/gtk.h>
+#include <musicbrainz5/mb5_c.h>
+
+#define SEARCH_LIMIT_STR "5"
+#define SEARCH_LIMIT_INT 5
+
+enum MB_ENTITY_TYPE
+{
+    MB_ENTITY_TYPE_ARTIST = 0,
+    MB_ENTITY_TYPE_ALBUM,
+    MB_ENTITY_TYPE_TRACK,
+    MB_ENTITY_TYPE_COUNT,
+};
+
+typedef struct
+{
+    Mb5Entity entity;
+    enum MB_ENTITY_TYPE type;    
+} EtMbEntity;
+
+/**************
+ * Prototypes *
+ **************/
+
+void
+et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
+                                 enum MB_ENTITY_TYPE parent_type,
+                                 gchar *parent_mbid, GNode *root);
+void
+et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root);
+void
+free_mb_tree (GNode *node);
+#endif /* __MB_SEARCH_H__ */
\ No newline at end of file
diff --git a/src/mbentityview.c b/src/mbentityview.c
index fa6a4ad..302d53a 100644
--- a/src/mbentityview.c
+++ b/src/mbentityview.c
@@ -38,27 +38,27 @@ char *columns [MB_ENTITY_TYPE_COUNT][8] = {
 
 /*
  * EtMbEntityViewPrivate:
- * @breadCrumbBox: GtkBox which represents the BreadCrumbWidget
- * @treeView: GtkTreeView to display the recieved music brainz data
- * @breadCrumbNodes: Array of GNode being displayed by the GtkToggleButton
- * @listStore: GtkTreeStore for treeView
- * @scrolledWindow: GtkScrolledWindow for treeView
- * @mbTreeRoot: Root Node of the Mb5Entity Tree
- * @mbTreeCurrentNode: Current node being displayed by EtMbEntityView
- * @activeToggleButton: Current active GtkToggleToolButton
+ * @bread_crumb_box: GtkBox which represents the BreadCrumbWidget
+ * @tree_view: GtkTreeView to display the recieved music brainz data
+ * @bread_crumb_nodes: Array of GNode being displayed by the GtkToggleButton
+ * @list_store: GtkTreeStore for treeView
+ * @scrolled_window: GtkScrolledWindow for treeView
+ * @mb_tree_root: Root Node of the Mb5Entity Tree
+ * @mb_tree_current_node: Current node being displayed by EtMbEntityView
+ * @active_toggle_button: Current active GtkToggleToolButton
  *
  * Private data for EtMbEntityView.
  */
 typedef struct
 {
-    GtkWidget *breadCrumbBox;
-    GNode *breadCrumbNodes[MB_ENTITY_TYPE_COUNT];
-    GtkWidget *treeView;
-    GtkTreeModel *listStore;
-    GtkWidget *scrolledWindow;
-    GNode *mbTreeRoot;
-    GNode *mbTreeCurrentNode;
-    GtkWidget *activeToggleButton;
+    GtkWidget *bread_crumb_box;
+    GNode *bread_crumb_nodes[MB_ENTITY_TYPE_COUNT];
+    GtkWidget *tree_view;
+    GtkTreeModel *list_store;
+    GtkWidget *scrolled_window;
+    GNode *mb_tree_root;
+    GNode *mb_tree_current_node;
+    GtkWidget *active_toggle_button;
 } EtMbEntityViewPrivate;
 
 /**************
@@ -155,7 +155,7 @@ insert_togglebtn_in_breadcrumb (GtkBox *breadCrumb)
 static void
 add_iter_to_list_store (GtkListStore *list_store, GNode *node)
 {
-    /* Traverse node in GNode and add it to listStore */
+    /* Traverse node in GNode and add it to list_store */
     enum MB_ENTITY_TYPE type;
     Mb5ReleaseList *release_list;
     Mb5ArtistCredit artist_credit;
@@ -268,25 +268,25 @@ show_data_in_entity_view (EtMbEntityView *entity_view)
     priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
 
     /* Remove the previous List Store */
-    if (GTK_IS_LIST_STORE (priv->listStore))
+    if (GTK_IS_LIST_STORE (priv->list_store))
     {
-        gtk_list_store_clear (GTK_LIST_STORE (priv->listStore));
+        gtk_list_store_clear (GTK_LIST_STORE (priv->list_store));
     }
 
-    gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeView), NULL);
+    gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
 
     /* Remove all colums */
-    list_cols = gtk_tree_view_get_columns (GTK_TREE_VIEW (priv->treeView));
+    list_cols = gtk_tree_view_get_columns (GTK_TREE_VIEW (priv->tree_view));
     for (list = g_list_first (list_cols); list != NULL; list = g_list_next (list))
     {
-        gtk_tree_view_remove_column (GTK_TREE_VIEW (priv->treeView),
+        gtk_tree_view_remove_column (GTK_TREE_VIEW (priv->tree_view),
                                      GTK_TREE_VIEW_COLUMN (list->data));
     }
 
     g_list_free (list_cols);
 
     /* Create new List Store and add it */
-    type = ((EtMbEntity *)(g_node_first_child (priv->mbTreeCurrentNode)->data))->type;
+    type = ((EtMbEntity *)(g_node_first_child (priv->mb_tree_current_node)->data))->type;
     switch (type)
     {
         case MB_ENTITY_TYPE_ARTIST:
@@ -313,17 +313,17 @@ show_data_in_entity_view (EtMbEntityView *entity_view)
         renderer = gtk_cell_renderer_text_new ();
         column = gtk_tree_view_column_new_with_attributes (columns[type][i], 
                                                            renderer, "text", i, NULL);
-        gtk_tree_view_append_column (GTK_TREE_VIEW (priv->treeView), column);
+        gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), column);
     }
 
-    priv->listStore = GTK_TREE_MODEL (gtk_list_store_newv (total_cols, types));
+    priv->list_store = GTK_TREE_MODEL (gtk_list_store_newv (total_cols, types));
     g_free (types);
 
-    gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeView), priv->listStore);
-    g_object_unref (priv->listStore);
+    gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), priv->list_store);
+    g_object_unref (priv->list_store);
 
-    add_iter_to_list_store (GTK_LIST_STORE (priv->listStore),
-                            g_node_first_child (priv->mbTreeCurrentNode));
+    add_iter_to_list_store (GTK_LIST_STORE (priv->list_store),
+                            g_node_first_child (priv->mb_tree_current_node));
 }
 
 /*
@@ -343,7 +343,7 @@ toggle_button_clicked (GtkWidget *btn, gpointer user_data)
     entity_view = ET_MB_ENTITY_VIEW (user_data);
     priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
 
-    if (btn == priv->activeToggleButton)
+    if (btn == priv->active_toggle_button)
     {
         return;
     }
@@ -353,15 +353,15 @@ toggle_button_clicked (GtkWidget *btn, gpointer user_data)
         return;
     }
 
-    if (priv->activeToggleButton)
+    if (priv->active_toggle_button)
     {
-        gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (priv->activeToggleButton),
+        gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (priv->active_toggle_button),
                                            FALSE);
     }
 
-    children = gtk_container_get_children (GTK_CONTAINER (priv->breadCrumbBox));
-    priv->mbTreeCurrentNode = priv->breadCrumbNodes[g_list_index (children, btn)];
-    priv->activeToggleButton = btn;
+    children = gtk_container_get_children (GTK_CONTAINER (priv->bread_crumb_box));
+    priv->mb_tree_current_node = priv->bread_crumb_nodes[g_list_index (children, btn)];
+    priv->active_toggle_button = btn;
     show_data_in_entity_view (entity_view);
 }
 
@@ -391,7 +391,7 @@ tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
 
     /* Depth is 1-based */
     depth = gtk_tree_path_get_depth (path);
-    child = g_node_nth_child (priv->mbTreeCurrentNode,
+    child = g_node_nth_child (priv->mb_tree_current_node,
                               depth - 1);
 
     /* Check if child node has children or not */
@@ -400,31 +400,31 @@ tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path,
         return;
     }
 
-    priv->mbTreeCurrentNode = child;
+    priv->mb_tree_current_node = child;
 
-    if (((EtMbEntity *)(priv->mbTreeCurrentNode->data))->type ==
+    if (((EtMbEntity *)(priv->mb_tree_current_node->data))->type ==
         MB_ENTITY_TYPE_TRACK)
     {
         return;
     }
 
-    toggle_btn = insert_togglebtn_in_breadcrumb (GTK_BOX (priv->breadCrumbBox));
-    priv->breadCrumbNodes [g_list_length (gtk_container_get_children (GTK_CONTAINER (priv->breadCrumbBox))) 
- 1] = priv->mbTreeCurrentNode;
+    toggle_btn = insert_togglebtn_in_breadcrumb (GTK_BOX (priv->bread_crumb_box));
+    priv->bread_crumb_nodes [g_list_length (gtk_container_get_children (GTK_CONTAINER 
(priv->bread_crumb_box))) - 1] = priv->mb_tree_current_node;
 
-    if (priv->activeToggleButton)
+    if (priv->active_toggle_button)
     {
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->activeToggleButton),
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->active_toggle_button),
                                            FALSE);
     }
 
     gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (toggle_btn), TRUE);
     g_signal_connect (G_OBJECT (toggle_btn), "clicked",
                       G_CALLBACK (toggle_button_clicked), entity_view);
-    priv->activeToggleButton = toggle_btn;
-    gtk_tree_model_get_iter (priv->listStore, &iter, path);
-    gtk_tree_model_get (priv->listStore, &iter, 0, &entity_name, -1);
+    priv->active_toggle_button = toggle_btn;
+    gtk_tree_model_get_iter (priv->list_store, &iter, path);
+    gtk_tree_model_get (priv->list_store, &iter, 0, &entity_name, -1);
     gtk_button_set_label (GTK_BUTTON (toggle_btn), entity_name);
-    gtk_widget_show_all (GTK_WIDGET (priv->breadCrumbBox));
+    gtk_widget_show_all (GTK_WIDGET (priv->bread_crumb_box));
     show_data_in_entity_view (entity_view);
 }
 
@@ -442,21 +442,21 @@ et_mb_entity_view_init (EtMbEntityView *entity_view)
     gtk_orientable_set_orientation (GTK_ORIENTABLE (entity_view), GTK_ORIENTATION_VERTICAL);
 
     /* Adding child widgets */    
-    priv->breadCrumbBox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
-    priv->treeView = gtk_tree_view_new ();
-    priv->scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
-    gtk_container_add (GTK_CONTAINER (priv->scrolledWindow), priv->treeView);
-    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolledWindow),
+    priv->bread_crumb_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+    priv->tree_view = gtk_tree_view_new ();
+    priv->scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_container_add (GTK_CONTAINER (priv->scrolled_window), priv->tree_view);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scrolled_window),
                                     GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
-    gtk_box_pack_start (GTK_BOX (entity_view), priv->breadCrumbBox,
+    gtk_box_pack_start (GTK_BOX (entity_view), priv->bread_crumb_box,
                         FALSE, FALSE, 2);
-    gtk_box_pack_start (GTK_BOX (entity_view), priv->scrolledWindow,
+    gtk_box_pack_start (GTK_BOX (entity_view), priv->scrolled_window,
                         TRUE, TRUE, 2);
-    priv->mbTreeRoot = NULL;
-    priv->mbTreeCurrentNode = NULL;
-    priv->activeToggleButton = NULL;
+    priv->mb_tree_root = NULL;
+    priv->mb_tree_current_node = NULL;
+    priv->active_toggle_button = NULL;
 
-    g_signal_connect (G_OBJECT (priv->treeView), "row-activated",
+    g_signal_connect (G_OBJECT (priv->tree_view), "row-activated",
                       G_CALLBACK (tree_view_row_activated), entity_view);
 }
 
@@ -474,9 +474,9 @@ et_mb_entity_view_set_tree_root (EtMbEntityView *entity_view, GNode *treeRoot)
     GtkWidget *btn;
     GNode *child;
     priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
-    priv->mbTreeRoot = treeRoot;
-    priv->mbTreeCurrentNode = treeRoot;
-    btn = insert_togglebtn_in_breadcrumb (GTK_BOX (priv->breadCrumbBox));
+    priv->mb_tree_root = treeRoot;
+    priv->mb_tree_current_node = treeRoot;
+    btn = insert_togglebtn_in_breadcrumb (GTK_BOX (priv->bread_crumb_box));
     child = g_node_first_child (treeRoot);
     if (child)
     {
@@ -498,8 +498,8 @@ et_mb_entity_view_set_tree_root (EtMbEntityView *entity_view, GNode *treeRoot)
                 break;
         }
 
-        priv->breadCrumbNodes [0] = treeRoot;
-        priv->activeToggleButton = btn;
+        priv->bread_crumb_nodes [0] = treeRoot;
+        priv->active_toggle_button = btn;
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE);
         show_data_in_entity_view (entity_view);
     }
diff --git a/src/mbentityview.h b/src/mbentityview.h
index 05e7b9d..3a5c4e9 100644
--- a/src/mbentityview.h
+++ b/src/mbentityview.h
@@ -22,7 +22,7 @@
 #define __MB_ENTITY_VIEW_H__
 
 #include <gtk/gtk.h>
-#include <musicbrainz5/mb5_c.h>
+#include "mb_search.h"
 
 #define ET_MB_ENTITY_VIEW_TYPE (et_mb_entity_view_get_type ())
 #define ET_MB_ENTITY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
@@ -66,14 +66,6 @@ typedef struct
     GtkBoxClass parent;
 } EtMbEntityViewClass;
 
-enum MB_ENTITY_TYPE
-{
-    MB_ENTITY_TYPE_ARTIST = 0,
-    MB_ENTITY_TYPE_ALBUM,
-    MB_ENTITY_TYPE_TRACK,
-    MB_ENTITY_TYPE_COUNT,
-};
-
 enum MB_ARTIST_COLUMNS
 {
     MB_ARTIST_COLUMNS_NAME,
@@ -100,18 +92,12 @@ enum MB_TRACK_COLUMNS
     MB_TRACK_COLUMNS_N
 };
 
-typedef struct
-{
-    Mb5Entity entity;
-    enum MB_ENTITY_TYPE type;    
-} EtMbEntity;
-
 /**************
  * Prototypes *
  **************/
 
 GType
-et_mb_entity_view_get_type (void) G_GNUC_CONST;
+et_mb_entity_view_get_type (void);
 GtkWidget *
 et_mb_entity_view_new (void);
 void
diff --git a/src/musicbrainz_dialog.c b/src/musicbrainz_dialog.c
index a1a0895..670badf 100644
--- a/src/musicbrainz_dialog.c
+++ b/src/musicbrainz_dialog.c
@@ -29,9 +29,6 @@
 #include "log.h"
 #include "musicbrainz_dialog.h"
 #include "mbentityview.h"
-
-#define SEARCH_LIMIT_STR "5"
-#define SEARCH_LIMIT_INT 5
  
 /***************
  * Declaration *
@@ -41,203 +38,25 @@ static GtkBuilder *builder;
 static GtkWidget *mbDialog;
 static GtkWidget *entityView;
 static GNode *mb_tree_root;
-
-/**************
- * Prototypes *
- **************/
-
-static void
-et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
-                                 enum MB_ENTITY_TYPE parent_type,
-                                 gchar *parent_mbid, GNode *root);
-static void
-et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root);
+static GSimpleAsyncResult *async_result;
+static GCancellable *cancellable;
 
 /*************
  * Functions *
  *************/
 
 static void
-et_musicbrainz_search_in_entity (gchar *string, enum MB_ENTITY_TYPE child_type,
-                                 enum MB_ENTITY_TYPE parent_type,
-                                 gchar *parent_mbid, GNode *root)
-{
-    Mb5Query query;
-    Mb5Metadata metadata;
-    char error_message[256];
-    tQueryResult result;
-    //int httpcode;
-    char *param_values[1];
-    char *param_names[1];
-
-    param_names [0] = "inc";
-    query = mb5_query_new ("easytag", NULL, 0);
-
-    if (child_type == MB_ENTITY_TYPE_ALBUM &&
-        parent_type == MB_ENTITY_TYPE_ARTIST)
-    {
-        param_values [0] = "releases";
-        metadata = mb5_query_query (query, "artist", parent_mbid, "", 1, param_names,
-                                    param_values);
-        result = mb5_query_get_lastresult (query);
-        //httpcode = mb5_query_get_lasthttpcode (query);
-        if (result == eQuery_Success)
-        {
-            if (metadata)
-            {
-                int i;
-                Mb5ReleaseList list;
-                Mb5Artist artist;
-                artist = mb5_metadata_get_artist (metadata);
-                list = mb5_artist_get_releaselist (artist);
-
-                for (i = 0; i < mb5_release_list_size (list); i++)
-                {
-                    Mb5Release release;
-                    release = mb5_artist_list_item (list, i);
-                    if (release)
-                    {
-                        GNode *node;
-                        EtMbEntity *entity;
-                        entity = g_malloc (sizeof (EtMbEntity));
-                        entity->entity = release;
-                        entity->type = MB_ENTITY_TYPE_ALBUM;
-                        node = g_node_new (entity);
-                        g_node_append (root, node);
-                    }
-                }
-            }
-
-            g_free (param_values [0]);
-        }
-        else
-        {
-            goto err;
-        }
-    }
-    else if (child_type == MB_ENTITY_TYPE_TRACK &&
-             parent_type == MB_ENTITY_TYPE_ALBUM)
-    {
-        
-    }
-
-    return;
-    err:
-    mb5_query_get_lasterrormessage (query, error_message,
-                                    sizeof(error_message));
-    printf ("Error searching MusicBrainz Database: '%s'\n", error_message);
-    mb5_query_delete (query);
-}
-
-static void
-et_musicbrainz_search (gchar *string, enum MB_ENTITY_TYPE type, GNode *root)
+manual_search_callback (GObject *source, GAsyncResult *res,
+                        gpointer user_data)
 {
-    /* TODO: to free metadata, first use mb5_<entity>_copy to copy that entity */
-    Mb5Query Query;
-    Mb5Metadata Metadata;
-    char ErrorMessage[256];
-    tQueryResult Result;
-    //int HTTPCode;
-    char *ParamValues[2];
-    char *ParamNames[2];
-
-    ParamNames [0] = "query";
-    ParamNames [1] = "limit";
-    ParamValues [1] = SEARCH_LIMIT_STR;
-    Query = mb5_query_new ("easytag", NULL, 0);
-
-    if (type == MB_ENTITY_TYPE_ARTIST)
-    {
-        ParamValues [0] = g_strconcat ("artist:", string, NULL);
-        Metadata = mb5_query_query (Query, "artist", "", "", 2, ParamNames,
-                                    ParamValues);
-        Result = mb5_query_get_lastresult (Query);
-        //HTTPCode = mb5_query_get_lasthttpcode (Query);
-        if (Result == eQuery_Success)
-        {
-            if (Metadata)
-            {
-                int i;
-                Mb5ArtistList ArtistList;
-                ArtistList = mb5_metadata_get_artistlist (Metadata);
-
-                for (i = 0; i < mb5_artist_list_size (ArtistList); i++)
-                {
-                    Mb5Artist Artist;
-                    Artist = mb5_artist_list_item (ArtistList, i);
-                    if (Artist)
-                    {
-                        GNode *node;
-                        EtMbEntity *entity;
-                        entity = g_malloc (sizeof (EtMbEntity));
-                        entity->entity = Artist;
-                        entity->type = MB_ENTITY_TYPE_ARTIST;
-                        node = g_node_new (entity);
-                        g_node_append (root, node);
-                    }
-                }
-            }
-
-            g_free (ParamValues [0]);
-        }
-        else
-        {
-            goto err;
-        }
-    }
-    else if (type == MB_ENTITY_TYPE_ALBUM)
-    {
-        ParamValues [0] = g_strconcat ("release:", string, NULL);
-        Metadata = mb5_query_query (Query, "release", "", "", 2, ParamNames,
-                                    ParamValues);
-        Result = mb5_query_get_lastresult (Query);
-        //HTTPCode = mb5_query_get_lasthttpcode (Query);
-        if (Result == eQuery_Success)
-        {
-            if (Metadata)
-            {
-                int i;
-                Mb5ReleaseList list;
-                list = mb5_metadata_get_releaselist (Metadata);
-
-                for (i = 0; i < mb5_release_list_size (list); i++)
-                {
-                    Mb5Release release;
-                    release = mb5_artist_list_item (list, i);
-                    if (release)
-                    {
-                        GNode *node;
-                        EtMbEntity *entity;
-                        entity = g_malloc (sizeof (EtMbEntity));
-                        entity->entity = release;
-                        entity->type = MB_ENTITY_TYPE_ALBUM;
-                        node = g_node_new (entity);
-                        g_node_append (root, node);
-                    }
-                }
-            }
-
-            g_free (ParamValues [0]);
-        }
-        else
-        {
-            goto err;
-        }
-    }
-    else if (type == MB_ENTITY_TYPE_TRACK)
-    {
-    }
-
-    return;
-    err:
-    mb5_query_get_lasterrormessage (Query, ErrorMessage,
-                                    sizeof(ErrorMessage));
-    printf ("Error searching MusicBrainz Database: '%s'\n", ErrorMessage);
-    mb5_query_delete (Query);
+    et_mb_entity_view_set_tree_root (ET_MB_ENTITY_VIEW (entityView),
+                                     mb_tree_root);
+    g_object_unref (res);
 }
 
 static void
-btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
+manual_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
+                           GCancellable *cancellable)
 {
     GtkWidget *cb_manual_search;
     GtkWidget *cb_manual_search_in;
@@ -248,16 +67,25 @@ btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
     cb_manual_search_in = GTK_WIDGET (gtk_builder_get_object (builder,
                                                               "cbManualSearchIn"));
     type = gtk_combo_box_get_active (GTK_COMBO_BOX (cb_manual_search_in));
+    et_musicbrainz_search (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (cb_manual_search)),
+                           type, mb_tree_root);
+}
 
+static void
+btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
+{
     if (g_node_first_child (mb_tree_root))
     {
-        /* TODO: Clear the tree */
+        free_mb_tree (mb_tree_root);
+        mb_tree_root = g_node_new (NULL);
     }
 
-    et_musicbrainz_search (gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (cb_manual_search)),
-                           type, mb_tree_root);
-    et_mb_entity_view_set_tree_root (ET_MB_ENTITY_VIEW (entityView),
-                                     mb_tree_root);
+    /* TODO: Add Cancellable object */
+    /* TODO: Use GSimpleAsyncResult with GError */
+    async_result = g_simple_async_result_new (NULL, manual_search_callback, 
+                                              NULL, btn_manual_find_clicked);
+    g_simple_async_result_run_in_thread (async_result,
+                                         manual_search_thread_func, 0, NULL);
 }
 
 /*
@@ -298,4 +126,5 @@ et_open_musicbrainz_dialog ()
     gtk_dialog_run (GTK_DIALOG (mbDialog));
     gtk_widget_destroy (mbDialog);
     g_object_unref (G_OBJECT (builder));
+    free_mb_tree (mb_tree_root);
 }
\ No newline at end of file


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]