Blame gdata/gdata-commentable.c

Packit 4b6dd7
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit 4b6dd7
/*
Packit 4b6dd7
 * GData Client
Packit 4b6dd7
 * Copyright (C) Philip Withnall 2008–2010 <philip@tecnocode.co.uk>
Packit 4b6dd7
 * Copyright (C) Richard Schwarting 2010 <aquarichy@gmail.com>
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is free software; you can redistribute it and/or
Packit 4b6dd7
 * modify it under the terms of the GNU Lesser General Public
Packit 4b6dd7
 * License as published by the Free Software Foundation; either
Packit 4b6dd7
 * version 2.1 of the License, or (at your option) any later version.
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is distributed in the hope that it will be useful,
Packit 4b6dd7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 4b6dd7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 4b6dd7
 * Lesser General Public License for more details.
Packit 4b6dd7
 *
Packit 4b6dd7
 * You should have received a copy of the GNU Lesser General Public
Packit 4b6dd7
 * License along with GData Client.  If not, see <http://www.gnu.org/licenses/>.
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * SECTION:gdata-commentable
Packit 4b6dd7
 * @short_description: GData commentable interface
Packit 4b6dd7
 * @stability: Stable
Packit 4b6dd7
 * @include: gdata/gdata-commentable.h
Packit 4b6dd7
 *
Packit 4b6dd7
 * #GDataCommentable is an interface which can be implemented by commentable objects: objects which support having comments added to them by users,
Packit 4b6dd7
 * such as videos and photos.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Comments may be queried, added and deleted. Note that they may not be edited.
Packit 4b6dd7
 *
Packit 4b6dd7
 * #GDataCommentable objects may not support all operations on comments, on an instance-by-instance basis (i.e. it's an invalid assumption that if,
Packit 4b6dd7
 * for example, one #GDataYouTubeVideo doesn't support adding comments all other #GDataYouTubeVideos don't support adding comments either).
Packit 4b6dd7
 * Specific documentation for a particular type of #GDataCommentable may state otherwise, though.
Packit 4b6dd7
 *
Packit 4b6dd7
 * <example>
Packit 4b6dd7
 * 	<title>Querying for Comments</title>
Packit 4b6dd7
 * 	<programlisting>
Packit 4b6dd7
 *	GDataService *service;
Packit 4b6dd7
 *	GDataCommentable *commentable;
Packit 4b6dd7
 *
Packit 4b6dd7
 *	/* Create a service */
Packit 4b6dd7
 *	service = create_service ();
Packit 4b6dd7
 *
Packit 4b6dd7
 *	/* Retrieve the GDataCommentable which is going to be queried. This may be, for example, a GDataYouTubeVideo. */
Packit 4b6dd7
 *	commentable = get_commentable ();
Packit 4b6dd7
 *
Packit 4b6dd7
 *	/* Start the async. query for the comments. */
Packit 4b6dd7
 *	gdata_commentable_query_comments_async (commentable, service, NULL, NULL, NULL, NULL, NULL, (GAsyncReadyCallback) query_comments_cb, NULL);
Packit 4b6dd7
 *
Packit 4b6dd7
 *	g_object_unref (service);
Packit 4b6dd7
 *	g_object_unref (commentable);
Packit 4b6dd7
 *
Packit 4b6dd7
 *	static void
Packit 4b6dd7
 *	query_comments_cb (GDataCommentable *commentable, GAsyncResult *result, gpointer user_data)
Packit 4b6dd7
 *	{
Packit 4b6dd7
 *		GDataFeed *comment_feed;
Packit 4b6dd7
 *		GList *comments, *i;
Packit 4b6dd7
 *		GError *error = NULL;
Packit 4b6dd7
 *
Packit 4b6dd7
 *		comment_feed = gdata_commentable_query_comments_finish (commentable, result, &error);
Packit 4b6dd7
 *
Packit 4b6dd7
 *		if (error != NULL) {
Packit 4b6dd7
 *			/* Error! */
Packit 4b6dd7
 *			g_error ("Error querying comments: %s", error->message);
Packit 4b6dd7
 *			g_error_free (error);
Packit 4b6dd7
 *			return;
Packit 4b6dd7
 *		}
Packit 4b6dd7
 *
Packit 4b6dd7
 *		/* Examine the comments. */
Packit 4b6dd7
 *		comments = gdata_feed_get_entries (comment_feed);
Packit 4b6dd7
 *		for (i = comments; i != NULL; i = i->next) {
Packit 4b6dd7
 *			/* Note that this will actually be a subclass of GDataComment,
Packit 4b6dd7
 *			 * such as GDataYouTubeComment or GDataPicasaWebComment. */
Packit 4b6dd7
 *			GDataComment *comment = GDATA_COMMENT (i->data);
Packit 4b6dd7
 *			GDataAuthor *author;
Packit 4b6dd7
 *
Packit 4b6dd7
 *			/* Note that in practice it might not always be safe to assume that a comment always has an author. */
Packit 4b6dd7
 *			author = GDATA_AUTHOR (gdata_entry_get_authors (GDATA_ENTRY (comment))->data);
Packit 4b6dd7
 *
Packit 4b6dd7
 *			g_message ("Comment by %s (%s): %s",
Packit 4b6dd7
 *			           gdata_author_get_name (author),
Packit 4b6dd7
 *			           gdata_author_get_uri (author),
Packit 4b6dd7
 *			           gdata_entry_get_content (GDATA_ENTRY (comment)));
Packit 4b6dd7
 *		}
Packit 4b6dd7
 *
Packit 4b6dd7
 *		g_object_unref (comment_feed);
Packit 4b6dd7
 *	}
Packit 4b6dd7
 * 	</programlisting>
Packit 4b6dd7
 * </example>
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
#include <config.h>
Packit 4b6dd7
#include <glib.h>
Packit 4b6dd7
#include <glib/gi18n-lib.h>
Packit 4b6dd7
#include <string.h>
Packit 4b6dd7
Packit 4b6dd7
#include "gdata-commentable.h"
Packit 4b6dd7
#include "gdata-service.h"
Packit 4b6dd7
Packit 4b6dd7
G_DEFINE_INTERFACE (GDataCommentable, gdata_commentable, GDATA_TYPE_ENTRY)
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_commentable_default_init (GDataCommentableInterface *iface)
Packit 4b6dd7
{
Packit 4b6dd7
	iface->comment_type = G_TYPE_INVALID;
Packit 4b6dd7
	iface->get_authorization_domain = NULL;
Packit 4b6dd7
	iface->get_query_comments_uri = NULL;
Packit 4b6dd7
	iface->get_insert_comment_uri = NULL;
Packit 4b6dd7
	iface->is_comment_deletable = NULL;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static GType
Packit 4b6dd7
get_comment_type (GDataCommentableInterface *iface)
Packit 4b6dd7
{
Packit 4b6dd7
	GType comment_type;
Packit 4b6dd7
Packit 4b6dd7
	comment_type = iface->comment_type;
Packit 4b6dd7
	g_assert (g_type_is_a (comment_type, GDATA_TYPE_COMMENT) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	return comment_type;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_query_comments:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService representing the service with which the object's comments will be manipulated
Packit 4b6dd7
 * @query: (allow-none): a #GDataQuery with query parameters, or %NULL
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @progress_callback: (allow-none) (scope call) (closure progress_user_data): a #GDataQueryProgressCallback to call when a comment is loaded, or %NULL
Packit 4b6dd7
 * @progress_user_data: (closure): data to pass to the @progress_callback function
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Retrieves a #GDataFeed containing the #GDataComments representing the comments on the #GDataCommentable which match the given @query.
Packit 4b6dd7
 *
Packit 4b6dd7
 * If the #GDataCommentable doesn't support commenting, %NULL will be returned and @error will be set to %GDATA_SERVICE_ERROR_FORBIDDEN. This is in
Packit 4b6dd7
 * contrast to if it does support commenting but hasn't had any comments added yet, in which case an empty #GDataFeed will be returned and no error
Packit 4b6dd7
 * will be set.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (transfer full) (allow-none): a #GDataFeed of #GDataComments, or %NULL; unref with g_object_unref()
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
GDataFeed *
Packit 4b6dd7
gdata_commentable_query_comments (GDataCommentable *self, GDataService *service, GDataQuery *query,
Packit 4b6dd7
                                  GCancellable *cancellable, GDataQueryProgressCallback progress_callback,
Packit 4b6dd7
                                  gpointer progress_user_data, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	gchar *uri;
Packit 4b6dd7
	GDataFeed *feed;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_SERVICE (service), NULL);
Packit 4b6dd7
	g_return_val_if_fail (query == NULL || GDATA_IS_QUERY (query), NULL);
Packit 4b6dd7
	g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the comment feed URI. */
Packit 4b6dd7
	g_assert (iface->get_query_comments_uri != NULL);
Packit 4b6dd7
	uri = iface->get_query_comments_uri (self);
Packit 4b6dd7
Packit 4b6dd7
	/* The URI can be NULL when no comments and thus no feedLink is present in a GDataCommentable */
Packit 4b6dd7
	if (uri == NULL) {
Packit 4b6dd7
		/* Translators: This is an error message for if a user attempts to retrieve comments from an entry (such as a video) which doesn't
Packit 4b6dd7
		 * support comments. */
Packit 4b6dd7
		g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN, _("This entry does not support comments."));
Packit 4b6dd7
		return NULL;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the comment feed. */
Packit 4b6dd7
	feed = gdata_service_query (service, domain, uri, query, get_comment_type (iface), cancellable, progress_callback, progress_user_data, error);
Packit 4b6dd7
	g_free (uri);
Packit 4b6dd7
Packit 4b6dd7
	return feed;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
query_comments_async_cb (GDataService *service, GAsyncResult *service_result, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	g_autoptr(GTask) commentable_task = G_TASK (user_data);
Packit 4b6dd7
	g_autoptr(GDataFeed) feed = NULL;
Packit 4b6dd7
	g_autoptr(GError) error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_service_query_finish (service, service_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL)
Packit 4b6dd7
		g_task_return_error (commentable_task, g_steal_pointer (&error));
Packit 4b6dd7
	else
Packit 4b6dd7
		g_task_return_pointer (commentable_task, g_steal_pointer (&feed), g_object_unref);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_query_comments_async:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService representing the service with which the object's comments will be manipulated
Packit 4b6dd7
 * @query: (allow-none): a #GDataQuery with query parameters, or %NULL
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @progress_callback: (allow-none) (scope notified) (closure progress_user_data): a #GDataQueryProgressCallback to call when a comment is loaded,
Packit 4b6dd7
 * or %NULL
Packit 4b6dd7
 * @progress_user_data: (closure): data to pass to the @progress_callback function
Packit 4b6dd7
 * @destroy_progress_user_data: (allow-none): a function to call when @progress_callback will not be called any more, or %NULL; this function will be
Packit 4b6dd7
 * called with @progress_user_data as a parameter and can be used to free any memory allocated for it
Packit 4b6dd7
 * @callback: a #GAsyncReadyCallback to call when the query is finished
Packit 4b6dd7
 * @user_data: (closure): data to pass to the @callback function
Packit 4b6dd7
 *
Packit 4b6dd7
 * Retrieves a #GDataFeed containing the #GDataComments representing the comments on the #GDataCommentable which match the given @query.
Packit 4b6dd7
 * @self, @service and @query are all reffed when this method is called, so can safely be freed after this method returns.
Packit 4b6dd7
 *
Packit 4b6dd7
 * For more details, see gdata_commentable_query_comments(), which is the synchronous version of this method.
Packit 4b6dd7
 *
Packit 4b6dd7
 * When the operation is finished, @callback will be called. You can then call gdata_commentable_query_comments_finish() to get the results of the
Packit 4b6dd7
 * operation.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_commentable_query_comments_async (GDataCommentable *self, GDataService *service, GDataQuery *query, GCancellable *cancellable,
Packit 4b6dd7
                                        GDataQueryProgressCallback progress_callback, gpointer progress_user_data,
Packit 4b6dd7
                                        GDestroyNotify destroy_progress_user_data, GAsyncReadyCallback callback, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	gchar *uri;
Packit 4b6dd7
	g_autoptr(GTask) task = NULL;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_COMMENTABLE (self));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_SERVICE (service));
Packit 4b6dd7
	g_return_if_fail (query == NULL || GDATA_IS_QUERY (query));
Packit 4b6dd7
	g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
Packit 4b6dd7
	g_return_if_fail (callback != NULL);
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the comment feed URI. */
Packit 4b6dd7
	g_assert (iface->get_query_comments_uri != NULL);
Packit 4b6dd7
	uri = iface->get_query_comments_uri (self);
Packit 4b6dd7
Packit 4b6dd7
	/* Build the async result. */
Packit 4b6dd7
	task = g_task_new (self, cancellable, callback, user_data);
Packit 4b6dd7
	g_task_set_source_tag (task, gdata_commentable_query_comments_async);
Packit 4b6dd7
Packit 4b6dd7
	/* The URI can be NULL when no comments and thus no feedLink is present in a GDataCommentable */
Packit 4b6dd7
	if (uri == NULL) {
Packit 4b6dd7
		g_task_return_new_error (task, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN,
Packit 4b6dd7
		                         /* Translators: This is an error message for if a user attempts to retrieve comments from an entry
Packit 4b6dd7
		                          * (such as a video) which doesn't support comments. */
Packit 4b6dd7
		                         _("This entry does not support comments."));
Packit 4b6dd7
		return;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the comment feed. */
Packit 4b6dd7
	gdata_service_query_async (service, domain, uri, query, get_comment_type (iface), cancellable, progress_callback, progress_user_data,
Packit 4b6dd7
	                           destroy_progress_user_data, (GAsyncReadyCallback) query_comments_async_cb, g_object_ref (task));
Packit 4b6dd7
	g_free (uri);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_query_comments_finish:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @result: a #GAsyncResult
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Finishes an asynchronous comment query operation started with gdata_commentable_query_comments_async().
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (transfer full) (allow-none): a #GDataFeed of #GDataComments, or %NULL; unref with g_object_unref()
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
GDataFeed *
Packit 4b6dd7
gdata_commentable_query_comments_finish (GDataCommentable *self, GAsyncResult *result, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
Packit 4b6dd7
	g_return_val_if_fail (g_task_is_valid (result, self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (g_async_result_is_tagged (result, gdata_commentable_query_comments_async), NULL);
Packit 4b6dd7
Packit 4b6dd7
	return g_task_propagate_pointer (G_TASK (result), error);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_insert_comment:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService with which the comment will be added
Packit 4b6dd7
 * @comment_: a new comment to be added to the #GDataCommentable
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Adds @comment to the #GDataCommentable.
Packit 4b6dd7
 *
Packit 4b6dd7
 * If the #GDataCommentable doesn't support commenting, %NULL will be returned and @error will be set to %GDATA_SERVICE_ERROR_FORBIDDEN.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (transfer full) (allow-none): the added #GDataComment, or %NULL; unref with g_object_unref()
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
GDataComment *
Packit 4b6dd7
gdata_commentable_insert_comment (GDataCommentable *self, GDataService *service, GDataComment *comment_, GCancellable *cancellable, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	gchar *uri;
Packit 4b6dd7
	GDataComment *new_comment;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_SERVICE (service), NULL);
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENT (comment_), NULL);
Packit 4b6dd7
	g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (g_type_is_a (G_OBJECT_TYPE (comment_), get_comment_type (iface)) == TRUE, NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the upload URI. */
Packit 4b6dd7
	g_assert (iface->get_insert_comment_uri != NULL);
Packit 4b6dd7
	uri = iface->get_insert_comment_uri (self, comment_);
Packit 4b6dd7
Packit 4b6dd7
	if (uri == NULL) {
Packit 4b6dd7
		/* Translators: This is an error message for if a user attempts to add a comment to an entry (such as a video) which doesn't support
Packit 4b6dd7
		 * comments. */
Packit 4b6dd7
		g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN, _("Comments may not be added to this entry."));
Packit 4b6dd7
		return NULL;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Add the comment. */
Packit 4b6dd7
	new_comment = GDATA_COMMENT (gdata_service_insert_entry (service, domain, uri, GDATA_ENTRY (comment_), cancellable, error));
Packit 4b6dd7
Packit 4b6dd7
	g_free (uri);
Packit 4b6dd7
Packit 4b6dd7
	return new_comment;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
insert_comment_async_cb (GDataService *service, GAsyncResult *service_result, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	g_autoptr(GTask) commentable_task = G_TASK (user_data);
Packit 4b6dd7
	g_autoptr(GDataEntry) new_comment = NULL;
Packit 4b6dd7
	g_autoptr(GError) error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	new_comment = gdata_service_insert_entry_finish (service, service_result, &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL)
Packit 4b6dd7
		g_task_return_error (commentable_task, g_steal_pointer (&error));
Packit 4b6dd7
	else
Packit 4b6dd7
		g_task_return_pointer (commentable_task, g_steal_pointer (&new_comment), g_object_unref);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_insert_comment_async:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService with which the comment will be added
Packit 4b6dd7
 * @comment_: a new comment to be added to the #GDataCommentable
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @callback: a #GAsyncReadyCallback to call when the operation is finished
Packit 4b6dd7
 * @user_data: (closure): data to pass to the @callback function
Packit 4b6dd7
 *
Packit 4b6dd7
 * Adds @comment to the #GDataCommentable. @self, @service and @comment_ are all reffed when this method is called, so can safely be freed after this
Packit 4b6dd7
 * method returns.
Packit 4b6dd7
 *
Packit 4b6dd7
 * For more details, see gdata_commentable_insert_comment(), which is the synchronous version of this method.
Packit 4b6dd7
 *
Packit 4b6dd7
 * When the operation is finished, @callback will be called. You can then call gdata_commentable_insert_comment_finish() to get the results of the
Packit 4b6dd7
 * operation.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_commentable_insert_comment_async (GDataCommentable *self, GDataService *service, GDataComment *comment_, GCancellable *cancellable,
Packit 4b6dd7
                                        GAsyncReadyCallback callback, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	g_autofree gchar *uri = NULL;
Packit 4b6dd7
	g_autoptr(GTask) task = NULL;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_COMMENTABLE (self));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_SERVICE (service));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_COMMENT (comment_));
Packit 4b6dd7
	g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (comment_), get_comment_type (iface)) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	/* Get the upload URI. */
Packit 4b6dd7
	g_assert (iface->get_insert_comment_uri != NULL);
Packit 4b6dd7
	uri = iface->get_insert_comment_uri (self, comment_);
Packit 4b6dd7
Packit 4b6dd7
	/* Build the async result. */
Packit 4b6dd7
	task = g_task_new (self, cancellable, callback, user_data);
Packit 4b6dd7
	g_task_set_source_tag (task, gdata_commentable_insert_comment_async);
Packit 4b6dd7
Packit 4b6dd7
	/* The URI can be NULL when no comments and thus no feedLink is present in a GDataCommentable */
Packit 4b6dd7
	if (uri == NULL) {
Packit 4b6dd7
		g_task_return_new_error (task, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN,
Packit 4b6dd7
		                         /* Translators: This is an error message for if a user attempts to add a comment to an entry
Packit 4b6dd7
		                          * (such as a video) which doesn't support comments. */
Packit 4b6dd7
		                         _("Comments may not be added to this entry."));
Packit 4b6dd7
		return;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Add the comment. */
Packit 4b6dd7
	gdata_service_insert_entry_async (service, domain, uri, GDATA_ENTRY (comment_), cancellable, (GAsyncReadyCallback) insert_comment_async_cb,
Packit 4b6dd7
	                                  g_object_ref (task));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_insert_comment_finish:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @result: a #GAsyncResult
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Finishes an asynchronous comment insertion operation started with gdata_commentable_insert_comment_async().
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (transfer full) (allow-none): the added #GDataComment, or %NULL; unref with g_object_unref()
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
GDataComment *
Packit 4b6dd7
gdata_commentable_insert_comment_finish (GDataCommentable *self, GAsyncResult *result, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, NULL);
Packit 4b6dd7
	g_return_val_if_fail (g_task_is_valid (result, self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (g_async_result_is_tagged (result, gdata_commentable_insert_comment_async), NULL);
Packit 4b6dd7
Packit 4b6dd7
	return g_task_propagate_pointer (G_TASK (result), error);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_delete_comment:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService with which the comment will be deleted
Packit 4b6dd7
 * @comment_: a comment to be deleted
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Deletes @comment from the #GDataCommentable.
Packit 4b6dd7
 *
Packit 4b6dd7
 * If the given @comment isn't deletable (either because the service doesn't support deleting comments at all, or because this particular comment
Packit 4b6dd7
 * is not deletable due to having insufficient permissions), %GDATA_SERVICE_ERROR_FORBIDDEN will be set in @error and %FALSE will be returned.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: %TRUE if the comment was successfully deleted, %FALSE otherwise
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
gboolean
Packit 4b6dd7
gdata_commentable_delete_comment (GDataCommentable *self, GDataService *service, GDataComment *comment_, GCancellable *cancellable, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_SERVICE (service), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENT (comment_), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (g_type_is_a (G_OBJECT_TYPE (comment_), get_comment_type (iface)) == TRUE, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (iface->is_comment_deletable != NULL);
Packit 4b6dd7
	if (iface->is_comment_deletable (self, comment_) == FALSE) {
Packit 4b6dd7
		/* Translators: This is an error message for if a user attempts to delete a comment they're not allowed to delete. */
Packit 4b6dd7
		g_set_error_literal (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN, _("This comment may not be deleted."));
Packit 4b6dd7
		return FALSE;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Delete the comment. */
Packit 4b6dd7
	return gdata_service_delete_entry (service, domain, GDATA_ENTRY (comment_), cancellable, error);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
delete_comment_async_cb (GDataService *service, GAsyncResult *service_result, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	g_autoptr(GTask) commentable_task = G_TASK (user_data);
Packit 4b6dd7
	g_autoptr(GError) error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (!gdata_service_delete_entry_finish (service, service_result, &error))
Packit 4b6dd7
		g_task_return_error (commentable_task, g_steal_pointer (&error));
Packit 4b6dd7
	else
Packit 4b6dd7
		g_task_return_boolean (commentable_task, TRUE);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_delete_comment_async:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @service: a #GDataService with which the comment will be deleted
Packit 4b6dd7
 * @comment_: a comment to be deleted
Packit 4b6dd7
 * @cancellable: (allow-none): optional #GCancellable object, or %NULL
Packit 4b6dd7
 * @callback: a #GAsyncReadyCallback to call when the operation is finished
Packit 4b6dd7
 * @user_data: (closure): data to pass to the @callback function
Packit 4b6dd7
 *
Packit 4b6dd7
 * Deletes @comment from the #GDataCommentable. @self, @service and @comment_ are all reffed when this method is called, so can safely be freed after
Packit 4b6dd7
 * this method returns.
Packit 4b6dd7
 *
Packit 4b6dd7
 * For more details, see gdata_commentable_delete_comment(), which is the synchronous version of this method.
Packit 4b6dd7
 *
Packit 4b6dd7
 * When the operation is finished, @callback will be called. You can then call gdata_commentable_delete_comment_finish() to get the results of the
Packit 4b6dd7
 * operation.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_commentable_delete_comment_async (GDataCommentable *self, GDataService *service, GDataComment *comment_, GCancellable *cancellable,
Packit 4b6dd7
                                        GAsyncReadyCallback callback, gpointer user_data)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCommentableInterface *iface;
Packit 4b6dd7
	g_autoptr(GTask) task = NULL;
Packit 4b6dd7
	GDataAuthorizationDomain *domain = NULL;
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_COMMENTABLE (self));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_SERVICE (service));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_COMMENT (comment_));
Packit 4b6dd7
	g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
Packit 4b6dd7
Packit 4b6dd7
	iface = GDATA_COMMENTABLE_GET_IFACE (self);
Packit 4b6dd7
Packit 4b6dd7
	g_return_if_fail (g_type_is_a (G_OBJECT_TYPE (comment_), get_comment_type (iface)) == TRUE);
Packit 4b6dd7
Packit 4b6dd7
	/* Build the async result. */
Packit 4b6dd7
	task = g_task_new (self, cancellable, callback, user_data);
Packit 4b6dd7
	g_task_set_source_tag (task, gdata_commentable_delete_comment_async);
Packit 4b6dd7
Packit 4b6dd7
	g_assert (iface->is_comment_deletable != NULL);
Packit 4b6dd7
	if (iface->is_comment_deletable (self, comment_) == FALSE) {
Packit 4b6dd7
		g_task_return_new_error (task, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_FORBIDDEN,
Packit 4b6dd7
		                         /* Translators: This is an error message for if a user attempts to delete a comment they're not allowed to delete. */
Packit 4b6dd7
		                         _("This comment may not be deleted."));
Packit 4b6dd7
		return;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Get the authorisation domain. */
Packit 4b6dd7
	if (iface->get_authorization_domain != NULL) {
Packit 4b6dd7
		domain = iface->get_authorization_domain (self);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Delete the comment. */
Packit 4b6dd7
	gdata_service_delete_entry_async (service, domain, GDATA_ENTRY (comment_), cancellable, (GAsyncReadyCallback) delete_comment_async_cb, g_object_ref (task));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_commentable_delete_comment_finish:
Packit 4b6dd7
 * @self: a #GDataCommentable
Packit 4b6dd7
 * @result: a #GAsyncResult
Packit 4b6dd7
 * @error: a #GError, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Finishes an asynchronous comment deletion operation started with gdata_commentable_delete_comment_async().
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: %TRUE if the comment was successfully deleted, %FALSE otherwise
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.10.0
Packit 4b6dd7
 */
Packit 4b6dd7
gboolean
Packit 4b6dd7
gdata_commentable_delete_comment_finish (GDataCommentable *self, GAsyncResult *result, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_COMMENTABLE (self), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
Packit 4b6dd7
	g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (g_async_result_is_tagged (result, gdata_commentable_delete_comment_async), FALSE);
Packit 4b6dd7
Packit 4b6dd7
	return g_task_propagate_boolean (G_TASK (result), error);
Packit 4b6dd7
}