|
Packit |
87b8d1 |
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
87b8d1 |
/*
|
|
Packit |
87b8d1 |
* libgfbgraph - GObject library for Facebook Graph API
|
|
Packit |
87b8d1 |
* Copyright (C) 2013 Álvaro Peña <alvaropg@gmail.com>
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* GFBGraph is free software; you can redistribute it and/or
|
|
Packit |
87b8d1 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
87b8d1 |
* License as published by the Free Software Foundation; either
|
|
Packit |
87b8d1 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* GFBGraph is distributed in the hope that it will be useful,
|
|
Packit |
87b8d1 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
87b8d1 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
87b8d1 |
* Lesser General Public License for more details.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
87b8d1 |
* License along with GFBGraph. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
87b8d1 |
*/
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* SECTION:gfbgraph-node
|
|
Packit |
87b8d1 |
* @short_description: GFBGraph Node object
|
|
Packit |
87b8d1 |
* @stability: Unstable
|
|
Packit |
87b8d1 |
* @include: gfbgraph/gfbgraph.h
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* #GFBGraphNode is the base class for the nodes in the Facebook Graph API, such a Album,
|
|
Packit |
87b8d1 |
* a Photo or a User. Only usefull to expand the current library functionality creating
|
|
Packit |
87b8d1 |
* new nodes based on it.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* This object provide the common functions to manage the relations between nodes trough the
|
|
Packit |
87b8d1 |
* #GFBGraphConnectable interface. See #gfbgraph_node_get_connection_nodes and #gfbgraph_node_append_node
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
#include <rest/rest-proxy-call.h>
|
|
Packit |
87b8d1 |
#include <json-glib/json-glib.h>
|
|
Packit |
87b8d1 |
#include <string.h>
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
#include "gfbgraph-common.h"
|
|
Packit |
87b8d1 |
#include "gfbgraph-connectable.h"
|
|
Packit |
87b8d1 |
#include "gfbgraph-node.h"
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
enum
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
PROP_0,
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
PROP_ID,
|
|
Packit |
87b8d1 |
PROP_LINK,
|
|
Packit |
87b8d1 |
PROP_CREATEDTIME,
|
|
Packit |
87b8d1 |
PROP_UPDATEDTIME
|
|
Packit |
87b8d1 |
};
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
struct _GFBGraphNodePrivate {
|
|
Packit |
87b8d1 |
GList *connections;
|
|
Packit |
87b8d1 |
gchar *id;
|
|
Packit |
87b8d1 |
gchar *link;
|
|
Packit |
87b8d1 |
gchar *created_time;
|
|
Packit |
87b8d1 |
gchar *updated_time;
|
|
Packit |
87b8d1 |
};
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
typedef struct {
|
|
Packit |
87b8d1 |
GList *list;
|
|
Packit |
87b8d1 |
GType node_type;
|
|
Packit |
87b8d1 |
GFBGraphAuthorizer *authorizer;
|
|
Packit |
87b8d1 |
} GFBGraphNodeConnectionAsyncData;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
GQuark
|
|
Packit |
87b8d1 |
gfbgraph_node_error_quark (void)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
return g_quark_from_static_string ("gfbgraph-node-error-quark");
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void gfbgraph_node_init (GFBGraphNode *obj);
|
|
Packit |
87b8d1 |
static void gfbgraph_node_class_init (GFBGraphNodeClass *klass);
|
|
Packit |
87b8d1 |
static void gfbgraph_node_finalize (GObject *object);
|
|
Packit |
87b8d1 |
static void gfbgraph_node_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
|
|
Packit |
87b8d1 |
static void gfbgraph_node_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void gfbgraph_node_connection_async_data_free (GFBGraphNodeConnectionAsyncData *data);
|
|
Packit |
87b8d1 |
static void gfbgraph_node_get_connection_nodes_async_thread (GSimpleAsyncResult *simple_async, GFBGraphNode *node, GCancellable cancellable);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
#define GFBGRAPH_NODE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), GFBGRAPH_TYPE_NODE, GFBGraphNodePrivate))
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static GObjectClass *parent_class = NULL;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
G_DEFINE_TYPE (GFBGraphNode, gfbgraph_node, G_TYPE_OBJECT);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_class_init (GFBGraphNodeClass *klass)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
parent_class = g_type_class_peek_parent (klass);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
gobject_class->finalize = gfbgraph_node_finalize;
|
|
Packit |
87b8d1 |
gobject_class->set_property = gfbgraph_node_set_property;
|
|
Packit |
87b8d1 |
gobject_class->get_property = gfbgraph_node_get_property;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_type_class_add_private (gobject_class, sizeof(GFBGraphNodePrivate));
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* GFBGraphNode:id:
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* The node ID. All nodes have one of this.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
g_object_class_install_property (gobject_class,
|
|
Packit |
87b8d1 |
PROP_ID,
|
|
Packit |
87b8d1 |
g_param_spec_string ("id",
|
|
Packit |
87b8d1 |
"The Facebook node ID", "Every node in the Facebook Graph is identified by his ID",
|
|
Packit |
87b8d1 |
"",
|
|
Packit |
87b8d1 |
G_PARAM_READABLE | G_PARAM_WRITABLE));
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* GFBGraphNode:link:
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* The node link. An URL to the node on Facebook.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
g_object_class_install_property (gobject_class,
|
|
Packit |
87b8d1 |
PROP_LINK,
|
|
Packit |
87b8d1 |
g_param_spec_string ("link",
|
|
Packit |
87b8d1 |
"The link to the node", "A link (url) to the node on Facebook",
|
|
Packit |
87b8d1 |
"",
|
|
Packit |
87b8d1 |
G_PARAM_READABLE | G_PARAM_WRITABLE));
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* GFBGraphNode:created_time:
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* The time the node was initially published. Is an ISO 8601 encoded date.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
g_object_class_install_property (gobject_class,
|
|
Packit |
87b8d1 |
PROP_CREATEDTIME,
|
|
Packit |
87b8d1 |
g_param_spec_string ("created_time",
|
|
Packit |
87b8d1 |
"The node creation time", "An ISO 8601 encoded date when the node was initially published",
|
|
Packit |
87b8d1 |
"",
|
|
Packit |
87b8d1 |
G_PARAM_READABLE | G_PARAM_WRITABLE));
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* GFBGraphNode:updated_time:
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* The last time the node was updated. Is an ISO 8601 encoded date.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
g_object_class_install_property (gobject_class,
|
|
Packit |
87b8d1 |
PROP_UPDATEDTIME,
|
|
Packit |
87b8d1 |
g_param_spec_string ("updated_time",
|
|
Packit |
87b8d1 |
"The node updated time", "An ISO 8601 encoded date when the node was updated",
|
|
Packit |
87b8d1 |
"",
|
|
Packit |
87b8d1 |
G_PARAM_READABLE | G_PARAM_WRITABLE));
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_init (GFBGraphNode *obj)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
obj->priv = GFBGRAPH_NODE_GET_PRIVATE(obj);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_finalize (GObject *object)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodePrivate *priv;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
priv = GFBGRAPH_NODE_GET_PRIVATE (object);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (priv->id)
|
|
Packit |
87b8d1 |
g_free (priv->id);
|
|
Packit |
87b8d1 |
if (priv->link)
|
|
Packit |
87b8d1 |
g_free (priv->link);
|
|
Packit |
87b8d1 |
if (priv->created_time)
|
|
Packit |
87b8d1 |
g_free (priv->created_time);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
G_OBJECT_CLASS(parent_class)->finalize (object);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodePrivate *priv;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
priv = GFBGRAPH_NODE_GET_PRIVATE (object);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
switch (prop_id) {
|
|
Packit |
87b8d1 |
case PROP_ID:
|
|
Packit |
87b8d1 |
if (priv->id)
|
|
Packit |
87b8d1 |
g_free (priv->id);
|
|
Packit |
87b8d1 |
priv->id = g_strdup (g_value_get_string (value));
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_LINK:
|
|
Packit |
87b8d1 |
if (priv->link)
|
|
Packit |
87b8d1 |
g_free (priv->link);
|
|
Packit |
87b8d1 |
priv->link = g_strdup (g_value_get_string (value));
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_CREATEDTIME:
|
|
Packit |
87b8d1 |
if (priv->created_time)
|
|
Packit |
87b8d1 |
g_free (priv->created_time);
|
|
Packit |
87b8d1 |
priv->created_time = g_strdup (g_value_get_string (value));
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_UPDATEDTIME:
|
|
Packit |
87b8d1 |
if (priv->updated_time)
|
|
Packit |
87b8d1 |
g_free (priv->updated_time);
|
|
Packit |
87b8d1 |
priv->updated_time = g_strdup (g_value_get_string (value));
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
default:
|
|
Packit |
87b8d1 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodePrivate *priv;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
priv = GFBGRAPH_NODE_GET_PRIVATE (object);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
switch (prop_id) {
|
|
Packit |
87b8d1 |
case PROP_ID:
|
|
Packit |
87b8d1 |
g_value_set_string (value, priv->id);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_LINK:
|
|
Packit |
87b8d1 |
g_value_set_string (value, priv->link);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_CREATEDTIME:
|
|
Packit |
87b8d1 |
g_value_set_string (value, priv->created_time);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
case PROP_UPDATEDTIME:
|
|
Packit |
87b8d1 |
g_value_set_string (value, priv->updated_time);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
default:
|
|
Packit |
87b8d1 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
87b8d1 |
break;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_connection_async_data_free (GFBGraphNodeConnectionAsyncData *data)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_list_free (data->list);
|
|
Packit |
87b8d1 |
g_object_unref (data->authorizer);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_slice_free (GFBGraphNodeConnectionAsyncData, data);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
static void
|
|
Packit |
87b8d1 |
gfbgraph_node_get_connection_nodes_async_thread (GSimpleAsyncResult *simple_async, GFBGraphNode *node, GCancellable cancellable)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodeConnectionAsyncData *data;
|
|
Packit |
87b8d1 |
GError *error;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
data = (GFBGraphNodeConnectionAsyncData *) g_simple_async_result_get_op_res_gpointer (simple_async);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
error = NULL;
|
|
Packit |
87b8d1 |
data->list = gfbgraph_node_get_connection_nodes (node, data->node_type, data->authorizer, &error);
|
|
Packit |
87b8d1 |
if (error != NULL)
|
|
Packit |
87b8d1 |
g_simple_async_result_take_error (simple_async, error);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_new:
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Creates a new #GFBGraphNode.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer full): a new #GFBGraphNode; unref with g_object_unref()
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
GFBGraphNode*
|
|
Packit |
87b8d1 |
gfbgraph_node_new (void)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
return GFBGRAPH_NODE (g_object_new (GFBGRAPH_TYPE_NODE, NULL));
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_new_from_id:
|
|
Packit |
87b8d1 |
* @id: a const #gchar with the node ID.
|
|
Packit |
87b8d1 |
* @node_type: a #GFBGraphNode type #GType.
|
|
Packit |
87b8d1 |
* @authorizer: a #GFBGraphAuthorizer.
|
|
Packit |
87b8d1 |
* @error: (allow-none): a #GError or %NULL.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Retrieve a node object as a #GFBgraphNode of #node_type type, with the given @id from the Facebook Graph.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer full): a #GFBGraphNode or %NULL.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
GFBGraphNode*
|
|
Packit |
87b8d1 |
gfbgraph_node_new_from_id (GFBGraphAuthorizer *authorizer, const gchar *id, GType node_type, GError **error)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNode *node;
|
|
Packit |
87b8d1 |
RestProxyCall *rest_call;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_return_val_if_fail ((strlen (id) > 0), NULL);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_AUTHORIZER (authorizer), NULL);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (g_type_is_a (node_type, GFBGRAPH_TYPE_NODE), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
rest_call = gfbgraph_new_rest_call (authorizer);
|
|
Packit |
87b8d1 |
rest_proxy_call_set_method (rest_call, "GET");
|
|
Packit |
87b8d1 |
rest_proxy_call_set_function (rest_call, id);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
node = NULL;
|
|
Packit |
87b8d1 |
if (rest_proxy_call_sync (rest_call, error)) {
|
|
Packit |
87b8d1 |
JsonParser *jparser;
|
|
Packit |
87b8d1 |
JsonNode *jnode;
|
|
Packit |
87b8d1 |
const gchar *payload;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
payload = rest_proxy_call_get_payload (rest_call);
|
|
Packit |
87b8d1 |
jparser = json_parser_new ();
|
|
Packit |
87b8d1 |
if (json_parser_load_from_data (jparser, payload, -1, error)) {
|
|
Packit |
87b8d1 |
jnode = json_parser_get_root (jparser);
|
|
Packit |
87b8d1 |
node = GFBGRAPH_NODE (json_gobject_deserialize (node_type, jnode));
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_object_unref (jparser);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return node;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_id:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Gets the Facebook Graph unique node ID.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer none): the node ID.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
const gchar*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_id (GFBGraphNode *node)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return node->priv->id;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_url:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Gets the node link to the Facebook web page.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer none): the URL.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
const gchar*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_link (GFBGraphNode *node)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return node->priv->link;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_created_time:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Gets a node created time.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer none): an ISO 8601 encoded date when the node was initially published.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
const gchar*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_created_time (GFBGraphNode *node)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return node->priv->created_time;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_updated_time:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Gets a node updated time.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (transfer none): an ISO 8601 encoded date when the node was updated.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
const gchar*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_updated_time (GFBGraphNode *node)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return node->priv->updated_time;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_set_id:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode.
|
|
Packit |
87b8d1 |
* @id: a const pointer to a #gchar.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Sets the ID for a node. Just useful when a new node is created
|
|
Packit |
87b8d1 |
* and the Graph API returns the ID of the new created node.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
void
|
|
Packit |
87b8d1 |
gfbgraph_node_set_id (GFBGraphNode *node, const gchar *id)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
g_return_if_fail (GFBGRAPH_IS_NODE (node));
|
|
Packit |
87b8d1 |
g_return_if_fail (id != NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_object_set (G_OBJECT (node),
|
|
Packit |
87b8d1 |
"id", id,
|
|
Packit |
87b8d1 |
NULL);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_connection_nodes:
|
|
Packit |
87b8d1 |
* @node: a #GFBGraphNode object which retrieve the connected nodes.
|
|
Packit |
87b8d1 |
* @node_type: a #GFBGraphNode type #GType that determines the kind of nodes to retrieve.
|
|
Packit |
87b8d1 |
* @authorizer: a #GFBGraphAuthorizer.
|
|
Packit |
87b8d1 |
* @error: (allow-none): a #GError or %NULL.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Retrieve the nodes of type @node_type connected to the @node object. The @node_type object must
|
|
Packit |
87b8d1 |
* implement the #GFBGraphConnectionable interface and be connectable to @node type object.
|
|
Packit |
87b8d1 |
* See gfbgraph_node_get_connection_nodes_async() for the asynchronous version of this call.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (element-type GFBGraphNode) (transfer full): a newly-allocated #GList of type @node_type objects with the found nodes.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
GList*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_connection_nodes (GFBGraphNode *node, GType node_type, GFBGraphAuthorizer *authorizer, GError **error)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodePrivate *priv;
|
|
Packit |
87b8d1 |
GList *nodes_list = NULL;
|
|
Packit |
87b8d1 |
GFBGraphNode *connected_node;
|
|
Packit |
87b8d1 |
RestProxyCall *rest_call;
|
|
Packit |
87b8d1 |
gchar *function_path;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), NULL);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (g_type_is_a (node_type, GFBGRAPH_TYPE_NODE), NULL);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_AUTHORIZER (authorizer), NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
priv = GFBGRAPH_NODE_GET_PRIVATE (node);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/* Dummy node just for test */
|
|
Packit |
87b8d1 |
connected_node = g_object_new (node_type, NULL);
|
|
Packit |
87b8d1 |
if (GFBGRAPH_IS_CONNECTABLE (connected_node) == FALSE) {
|
|
Packit |
87b8d1 |
g_set_error (error, GFBGRAPH_NODE_ERROR,
|
|
Packit |
87b8d1 |
GFBGRAPH_NODE_ERROR_NO_CONNECTABLE,
|
|
Packit |
87b8d1 |
"The given node type (%s) doesn't implement connectable interface", g_type_name (node_type));
|
|
Packit |
87b8d1 |
return NULL;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (gfbgraph_connectable_is_connectable_to (GFBGRAPH_CONNECTABLE (connected_node), G_OBJECT_TYPE (node)) == FALSE) {
|
|
Packit |
87b8d1 |
g_set_error (error, GFBGRAPH_NODE_ERROR,
|
|
Packit |
87b8d1 |
GFBGRAPH_NODE_ERROR_NO_CONNECTABLE,
|
|
Packit |
87b8d1 |
"The given node type (%s) can't connect with the node", g_type_name (node_type));
|
|
Packit |
87b8d1 |
return NULL;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
rest_call = gfbgraph_new_rest_call (authorizer);
|
|
Packit |
87b8d1 |
rest_proxy_call_set_method (rest_call, "GET");
|
|
Packit |
87b8d1 |
function_path = g_strdup_printf ("%s/%s",
|
|
Packit |
87b8d1 |
priv->id,
|
|
Packit |
87b8d1 |
gfbgraph_connectable_get_connection_path (GFBGRAPH_CONNECTABLE (connected_node),
|
|
Packit |
87b8d1 |
G_OBJECT_TYPE (node)));
|
|
Packit |
87b8d1 |
rest_proxy_call_set_function (rest_call, function_path);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (rest_proxy_call_sync (rest_call, error)) {
|
|
Packit |
87b8d1 |
const gchar *payload;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
payload = rest_proxy_call_get_payload (rest_call);
|
|
Packit |
87b8d1 |
nodes_list = gfbgraph_connectable_parse_connected_data (GFBGRAPH_CONNECTABLE (connected_node), payload, error);
|
|
Packit |
87b8d1 |
} else {
|
|
Packit |
87b8d1 |
return NULL;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/* We don't need this node again */
|
|
Packit |
87b8d1 |
g_clear_object (&connected_node);
|
|
Packit |
87b8d1 |
g_free (function_path);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return nodes_list;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_connection_nodes_async:
|
|
Packit |
87b8d1 |
* @node: A #GFBGraphNode object which retrieve the connected nodes.
|
|
Packit |
87b8d1 |
* @node_type: a #GFBGraphNode type #GType that must implement the #GFBGraphConnectionable interface.
|
|
Packit |
87b8d1 |
* @authorizer: a #GFBGraphAuthorizer.
|
|
Packit |
87b8d1 |
* @cancellable: (allow-none): An optional #GCancellable object, or %NULL.
|
|
Packit |
87b8d1 |
* @callback: (scope async): A #GAsyncReadyCallback to call when the request is completed.
|
|
Packit |
87b8d1 |
* @user_data: (closure): The data to pass to @callback.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Asynchronously retrieve the list of nodes of type @node_type connected to the @node object. See
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_connection_nodes() for the synchronous version of this call.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* When the operation is finished, @callback will be called. You can then call gfbgraph_node_get_connection_nodes_finish()
|
|
Packit |
87b8d1 |
* to get the list of connected nodes.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
void
|
|
Packit |
87b8d1 |
gfbgraph_node_get_connection_nodes_async (GFBGraphNode *node, GType node_type, GFBGraphAuthorizer *authorizer, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GSimpleAsyncResult *result;
|
|
Packit |
87b8d1 |
GFBGraphNodeConnectionAsyncData *data;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_return_if_fail (GFBGRAPH_IS_NODE (node));
|
|
Packit |
87b8d1 |
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
|
|
Packit |
87b8d1 |
g_return_if_fail (callback != NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
result = g_simple_async_result_new (G_OBJECT (node), callback, user_data, gfbgraph_node_get_connection_nodes_async);
|
|
Packit |
87b8d1 |
g_simple_async_result_set_check_cancellable (result, cancellable);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
data = g_slice_new (GFBGraphNodeConnectionAsyncData);
|
|
Packit |
87b8d1 |
data->list = NULL;
|
|
Packit |
87b8d1 |
data->node_type = node_type;
|
|
Packit |
87b8d1 |
data->authorizer = authorizer;
|
|
Packit |
87b8d1 |
g_object_ref (data->authorizer);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_simple_async_result_set_op_res_gpointer (result, data, (GDestroyNotify) gfbgraph_node_connection_async_data_free);
|
|
Packit |
87b8d1 |
g_simple_async_result_run_in_thread (result, (GSimpleAsyncThreadFunc) gfbgraph_node_get_connection_nodes_async_thread, G_PRIORITY_DEFAULT, cancellable);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_object_unref (result);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_connection_nodes_async_finish:
|
|
Packit |
87b8d1 |
* @node: A #GFBGraphNode.
|
|
Packit |
87b8d1 |
* @result: A #GAsyncResult.
|
|
Packit |
87b8d1 |
* @error: (allow-none): An optional #GError, or %NULL.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Finishes an asynchronous operation started with
|
|
Packit |
87b8d1 |
* gfbgraph_node_get_connection_nodes_async().
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: (element-type GFBGraphNode) (transfer full): a newly-allocated #GList of type #node_type objects with the found nodes.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
GList*
|
|
Packit |
87b8d1 |
gfbgraph_node_get_connection_nodes_async_finish (GFBGraphNode *node, GAsyncResult *result, GError **error)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GSimpleAsyncResult *simple_async;
|
|
Packit |
87b8d1 |
GFBGraphNodeConnectionAsyncData *data;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (node), gfbgraph_node_get_connection_nodes_async), NULL);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
simple_async = G_SIMPLE_ASYNC_RESULT (result);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (g_simple_async_result_propagate_error (simple_async, error))
|
|
Packit |
87b8d1 |
return NULL;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
data = (GFBGraphNodeConnectionAsyncData *) g_simple_async_result_get_op_res_gpointer (simple_async);
|
|
Packit |
87b8d1 |
return data->list;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
/**
|
|
Packit |
87b8d1 |
* gfbgraph_node_append_connection:
|
|
Packit |
87b8d1 |
* @node: A #GFBGraphNode.
|
|
Packit |
87b8d1 |
* @connect_node: A #GFBGraphNode.
|
|
Packit |
87b8d1 |
* @authorizer: A #GFBGraphAuthorizer.
|
|
Packit |
87b8d1 |
* @error: (allow-none): An optional #GError, or %NULL.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Appends @connect_node to @node. @connect_node must implement the #GFBGraphConnectable interface
|
|
Packit |
87b8d1 |
* and be connectable to @node GType.
|
|
Packit |
87b8d1 |
*
|
|
Packit |
87b8d1 |
* Returns: TRUE on sucess, FALSE if an error ocurred.
|
|
Packit |
87b8d1 |
**/
|
|
Packit |
87b8d1 |
gboolean
|
|
Packit |
87b8d1 |
gfbgraph_node_append_connection (GFBGraphNode *node, GFBGraphNode *connect_node, GFBGraphAuthorizer *authorizer, GError **error)
|
|
Packit |
87b8d1 |
{
|
|
Packit |
87b8d1 |
GFBGraphNodePrivate *priv;
|
|
Packit |
87b8d1 |
RestProxyCall *rest_call;
|
|
Packit |
87b8d1 |
GHashTable *params;
|
|
Packit |
87b8d1 |
gchar *function_path;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (node), FALSE);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_NODE (connect_node), FALSE);
|
|
Packit |
87b8d1 |
g_return_val_if_fail (GFBGRAPH_IS_AUTHORIZER (authorizer), FALSE);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (GFBGRAPH_IS_CONNECTABLE (connect_node) == FALSE) {
|
|
Packit |
87b8d1 |
g_set_error (error, GFBGRAPH_NODE_ERROR,
|
|
Packit |
87b8d1 |
GFBGRAPH_NODE_ERROR_NO_CONNECTABLE,
|
|
Packit |
87b8d1 |
"The given node type (%s) doesn't implement connectable interface", G_OBJECT_TYPE_NAME (connect_node));
|
|
Packit |
87b8d1 |
return FALSE;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (gfbgraph_connectable_is_connectable_to (GFBGRAPH_CONNECTABLE (connect_node), G_OBJECT_TYPE (node)) == FALSE) {
|
|
Packit |
87b8d1 |
g_set_error (error, GFBGRAPH_NODE_ERROR,
|
|
Packit |
87b8d1 |
GFBGRAPH_NODE_ERROR_NO_CONNECTABLE,
|
|
Packit |
87b8d1 |
"The given node type (%s) can't append a %s connection", G_OBJECT_TYPE_NAME (node), G_OBJECT_TYPE_NAME (connect_node));
|
|
Packit |
87b8d1 |
return FALSE;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
priv = GFBGRAPH_NODE_GET_PRIVATE (node);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
rest_call = gfbgraph_new_rest_call (authorizer);
|
|
Packit |
87b8d1 |
rest_proxy_call_set_method (rest_call, "POST");
|
|
Packit |
87b8d1 |
function_path = g_strdup_printf ("%s/%s",
|
|
Packit |
87b8d1 |
priv->id,
|
|
Packit |
87b8d1 |
gfbgraph_connectable_get_connection_path (GFBGRAPH_CONNECTABLE (connect_node),
|
|
Packit |
87b8d1 |
G_OBJECT_TYPE (node)));
|
|
Packit |
87b8d1 |
rest_proxy_call_set_function (rest_call, function_path);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
params = gfbgraph_connectable_get_connection_post_params (GFBGRAPH_CONNECTABLE (connect_node), G_OBJECT_TYPE (node));
|
|
Packit |
87b8d1 |
if (g_hash_table_size (params) > 0) {
|
|
Packit |
87b8d1 |
GHashTableIter iter;
|
|
Packit |
87b8d1 |
const gchar *key;
|
|
Packit |
87b8d1 |
const gchar *value;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_hash_table_iter_init (&iter, params);
|
|
Packit |
87b8d1 |
while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
|
|
Packit |
87b8d1 |
rest_proxy_call_add_param (rest_call, key, value);
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
if (rest_proxy_call_sync (rest_call, error)) {
|
|
Packit |
87b8d1 |
const gchar *payload;
|
|
Packit |
87b8d1 |
JsonParser *jparser;
|
|
Packit |
87b8d1 |
JsonNode *jnode;
|
|
Packit |
87b8d1 |
JsonReader *jreader;
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
payload = rest_proxy_call_get_payload (rest_call);
|
|
Packit |
87b8d1 |
/* Parssing the new ID */
|
|
Packit |
87b8d1 |
jparser = json_parser_new ();
|
|
Packit |
87b8d1 |
json_parser_load_from_data (jparser, payload, -1, error);
|
|
Packit |
87b8d1 |
jnode = json_parser_get_root (jparser);
|
|
Packit |
87b8d1 |
jreader = json_reader_new (jnode);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
json_reader_read_element (jreader, 0);
|
|
Packit |
87b8d1 |
gfbgraph_node_set_id (connect_node,
|
|
Packit |
87b8d1 |
json_reader_get_string_value (jreader));
|
|
Packit |
87b8d1 |
json_reader_end_element (jreader);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_object_unref (jreader);
|
|
Packit |
87b8d1 |
g_object_unref (jparser);
|
|
Packit |
87b8d1 |
} else {
|
|
Packit |
87b8d1 |
return FALSE;
|
|
Packit |
87b8d1 |
}
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
g_free (function_path);
|
|
Packit |
87b8d1 |
|
|
Packit |
87b8d1 |
return TRUE;
|
|
Packit |
87b8d1 |
}
|