[grilo-plugins] tmdb: Add grl_tmdb_request_get_list_with_filter()
- From: Juan A. Suarez Romero <jasuarez src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grilo-plugins] tmdb: Add grl_tmdb_request_get_list_with_filter()
- Date: Mon, 22 Oct 2012 16:13:57 +0000 (UTC)
commit d916409114a8b90724ce154629903a583778aef0
Author: Mathias Hasselmann <mathias openismus com>
Date: Wed Oct 17 13:29:46 2012 +0200
tmdb: Add grl_tmdb_request_get_list_with_filter()
This is needed for region specific release dates.
https://bugzilla.gnome.org/show_bug.cgi?id=679686
src/tmdb/grl-tmdb-request.c | 128 ++++++++++++++++++++++++++++++------------
src/tmdb/grl-tmdb-request.h | 11 +++-
2 files changed, 100 insertions(+), 39 deletions(-)
---
diff --git a/src/tmdb/grl-tmdb-request.c b/src/tmdb/grl-tmdb-request.c
index 3b7a521..3fbd9a1 100644
--- a/src/tmdb/grl-tmdb-request.c
+++ b/src/tmdb/grl-tmdb-request.c
@@ -47,7 +47,9 @@ GRL_LOG_DOMAIN_EXTERN(tmdb_log_domain);
#define TMDB_API_CALL_MOVIE_RELEASE_INFO TMDB_API_CALL_MOVIE_INFO"/releases"
struct _FilterClosure {
+ JsonArrayForeach callback;
GrlTmdbRequestFilterFunc filter;
+ GrlTmdbRequestStringFilterFunc string_filter;
GList *list;
};
@@ -218,6 +220,19 @@ grl_tmdb_request_constructed (GObject *object)
/* Private functions */
static void
+fill_list_filtered (JsonArray *array,
+ guint index_,
+ JsonNode *element,
+ gpointer user_data)
+{
+ FilterClosure *closure = (FilterClosure *) user_data;
+
+ if (closure->filter == NULL || closure->filter (element)) {
+ closure->list = g_list_prepend (closure->list, element);
+ }
+}
+
+static void
fill_string_list_filtered (JsonArray *array,
guint index_,
JsonNode *element,
@@ -226,18 +241,62 @@ fill_string_list_filtered (JsonArray *array,
FilterClosure *closure = (FilterClosure *) user_data;
char *result;
- if (closure->filter == NULL) {
+ if (closure->string_filter == NULL) {
closure->list = g_list_prepend (closure->list,
g_strdup (json_node_get_string (element)));
return;
}
- result = closure->filter (element);
+ result = closure->string_filter (element);
if (result != NULL) {
closure->list = g_list_prepend (closure->list, result);
}
}
+static GList *
+get_list_with_filter (GrlTmdbRequest *self,
+ const char *path,
+ FilterClosure *closure)
+{
+ JsonNode *node, *element;
+ GError *error = NULL;
+ JsonArray *values;
+
+ node = json_path_query (path,
+ json_parser_get_root (self->priv->parser),
+ &error);
+ if (error != NULL) {
+ GRL_DEBUG ("Failed to get %s: %s", path, error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ if (!JSON_NODE_HOLDS_ARRAY (node)) {
+ json_node_free (node);
+ return NULL;
+ }
+
+ values = json_node_get_array (node);
+ if (json_array_get_length (values) == 0) {
+ json_node_free (node);
+ return NULL;
+ }
+
+ /* Check if we have array in array */
+ element = json_array_get_element (values, 0);
+ if (JSON_NODE_HOLDS_ARRAY (element)) {
+ values = json_node_get_array (element);
+ }
+
+ closure->list = NULL;
+
+ json_array_foreach_element (values, closure->callback, closure);
+
+ json_node_free (node);
+
+ return closure->list;
+}
+
/* Callbacks */
static void
on_wc_request (GrlNetWc *wc,
@@ -509,10 +568,35 @@ grl_tmdb_request_get_string_list (GrlTmdbRequest *self,
}
/**
- * grl_tmdb_request_get_string_list_with_filter:
+ * grl_tmdb_request_get_list_with_filter:
* @self: Instance of #GrlTmdbRequest
* @path: JSONPath to get
* @filter: A #GrlTmdbRequestFilterFunc to match on a #JsonNode
+ * Returns: (transfer container) (element-type JsonNode): %NULL if the path
+ * cannot be found or no node matched the filter or a #GList containing #JsNode
+ * instances matching the path and are accepted by the filter.
+ */
+GList *
+grl_tmdb_request_get_list_with_filter (GrlTmdbRequest *self,
+ const char *path,
+ GrlTmdbRequestFilterFunc filter)
+{
+ FilterClosure closure;
+
+ closure.list = NULL;
+ closure.filter = filter;
+ closure.callback = fill_list_filtered;
+
+ get_list_with_filter (self, path, &closure);
+
+ return closure.list;
+}
+
+/**
+ * grl_tmdb_request_get_string_list_with_filter:
+ * @self: Instance of #GrlTmdbRequest
+ * @path: JSONPath to get
+ * @filter: A #GrlTmdbRequestStringFilterFunc to match on a #JsonNode
* Returns: (transfer full) (element-type utf-8): %NULL if the path cannot be
* found or no node matched the filter or a #GList containing strings matching
* the path and are accepted by the filter.
@@ -520,45 +604,15 @@ grl_tmdb_request_get_string_list (GrlTmdbRequest *self,
GList *
grl_tmdb_request_get_string_list_with_filter (GrlTmdbRequest *self,
const char *path,
- GrlTmdbRequestFilterFunc filter)
+ GrlTmdbRequestStringFilterFunc filter)
{
- JsonNode *node, *element;
- GError *error = NULL;
- JsonArray *values;
FilterClosure closure;
- node = json_path_query (path,
- json_parser_get_root (self->priv->parser),
- &error);
- if (error != NULL) {
- GRL_DEBUG ("Failed to get %s: %s", path, error->message);
- g_error_free (error);
- return NULL;
- }
-
- if (!JSON_NODE_HOLDS_ARRAY (node)) {
- json_node_free (node);
- return NULL;
- }
-
- values = json_node_get_array (node);
- if (json_array_get_length (values) == 0) {
- json_node_free (node);
- return NULL;
- }
-
- /* Check if we have array in array */
- element = json_array_get_element (values, 0);
- if (JSON_NODE_HOLDS_ARRAY (element)) {
- values = json_node_get_array (element);
- }
-
closure.list = NULL;
- closure.filter = filter;
+ closure.string_filter = filter;
+ closure.callback = fill_string_list_filtered;
- json_array_foreach_element (values, fill_string_list_filtered, &closure);
-
- json_node_free (node);
+ get_list_with_filter (self, path, &closure);
return closure.list;
}
diff --git a/src/tmdb/grl-tmdb-request.h b/src/tmdb/grl-tmdb-request.h
index ba96985..0343ce1 100644
--- a/src/tmdb/grl-tmdb-request.h
+++ b/src/tmdb/grl-tmdb-request.h
@@ -75,7 +75,8 @@ enum _GrlTmdbRequestDetail {
};
typedef enum _GrlTmdbRequestDetail GrlTmdbRequestDetail;
-typedef char *(*GrlTmdbRequestFilterFunc) (JsonNode *element);
+typedef gboolean (*GrlTmdbRequestFilterFunc) (JsonNode *element);
+typedef char *(*GrlTmdbRequestStringFilterFunc) (JsonNode *element);
GType grl_tmdb_request_get_type (void);
@@ -120,7 +121,13 @@ grl_tmdb_request_get_string_list (GrlTmdbRequest *request,
const char *path);
GList *
+grl_tmdb_request_get_list_with_filter (GrlTmdbRequest *self,
+ const char *path,
+ GrlTmdbRequestFilterFunc filter);
+
+GList *
grl_tmdb_request_get_string_list_with_filter (GrlTmdbRequest *self,
const char *path,
- GrlTmdbRequestFilterFunc filter);
+ GrlTmdbRequestStringFilterFunc filter);
+
#endif /* _GRL_TMDB_REQUEST_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]