Blame demos/tasks/tasks-cli.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 © 2017 Philip Withnall <philip@tecnocode.co.uk>
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
#include <gdata/gdata.h>
Packit 4b6dd7
#include <locale.h>
Packit 4b6dd7
#include <string.h>
Packit 4b6dd7
Packit 4b6dd7
#define CLIENT_ID "1074795795536-necvslvs0pchk65nf6ju4i6mniogg8fr.apps.googleusercontent.com"
Packit 4b6dd7
#define CLIENT_SECRET "8totRi50eo2Zfr3SD2DeNAzo"
Packit 4b6dd7
#define REDIRECT_URI "urn:ietf:wg:oauth:2.0:oob"
Packit 4b6dd7
Packit 4b6dd7
static int
Packit 4b6dd7
print_usage (char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	g_printerr ("%s: Usage — %s <subcommand>\n"
Packit 4b6dd7
	            "Subcommands:\n"
Packit 4b6dd7
	            "   tasklists\n"
Packit 4b6dd7
	            "   tasks <tasklist ID> [query string]\n",
Packit 4b6dd7
	            argv[0], argv[0]);
Packit 4b6dd7
	return -1;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
print_tasklist (GDataTasksTasklist *tasklist)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *id, *title, *description;
Packit 4b6dd7
Packit 4b6dd7
	id = gdata_entry_get_id (GDATA_ENTRY (tasklist));
Packit 4b6dd7
	title = gdata_entry_get_title (GDATA_ENTRY (tasklist));
Packit 4b6dd7
	description = gdata_entry_get_summary (GDATA_ENTRY (tasklist));
Packit 4b6dd7
Packit 4b6dd7
	g_print ("%s — %s\n", id, title);
Packit 4b6dd7
	g_print ("   Description:\n      %s\n", description);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("\n");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static const gchar *
Packit 4b6dd7
format_status (const gchar *status)
Packit 4b6dd7
{
Packit 4b6dd7
	if (g_strcmp0 (status, GDATA_TASKS_STATUS_NEEDS_ACTION) == 0)
Packit 4b6dd7
		return "needs action";
Packit 4b6dd7
	else if (g_strcmp0 (status, GDATA_TASKS_STATUS_COMPLETED) == 0)
Packit 4b6dd7
		return "completed";
Packit 4b6dd7
	else
Packit 4b6dd7
		return status;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
print_task (GDataTasksTask *task)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *title, *id, *description, *parent_id, *position, *notes;
Packit 4b6dd7
	const gchar *status;
Packit 4b6dd7
	GTimeVal date_published_tv = { 0, };
Packit 4b6dd7
	gchar *date_published = NULL;  /* owned */
Packit 4b6dd7
	GTimeVal due_tv = { 0, };
Packit 4b6dd7
	gchar *due = NULL;  /* owned */
Packit 4b6dd7
	GTimeVal completed_tv = { 0, };
Packit 4b6dd7
	gchar *completed = NULL;  /* owned */
Packit 4b6dd7
	gboolean is_deleted, is_hidden;
Packit 4b6dd7
Packit 4b6dd7
	title = gdata_entry_get_title (GDATA_ENTRY (task));
Packit 4b6dd7
	id = gdata_entry_get_id (GDATA_ENTRY (task));
Packit 4b6dd7
	description = gdata_entry_get_content (GDATA_ENTRY (task));
Packit 4b6dd7
	date_published_tv.tv_sec = gdata_entry_get_published (GDATA_ENTRY (task));
Packit 4b6dd7
	date_published = g_time_val_to_iso8601 (&date_published_tv);
Packit 4b6dd7
	parent_id = gdata_tasks_task_get_parent (task);
Packit 4b6dd7
	position = gdata_tasks_task_get_position (task);
Packit 4b6dd7
	notes = gdata_tasks_task_get_notes (task);
Packit 4b6dd7
	status = gdata_tasks_task_get_status (task);
Packit 4b6dd7
	due_tv.tv_sec = gdata_tasks_task_get_due (task);
Packit 4b6dd7
	due = g_time_val_to_iso8601 (&due_tv);
Packit 4b6dd7
	completed_tv.tv_sec = gdata_tasks_task_get_completed (task);
Packit 4b6dd7
	completed = g_time_val_to_iso8601 (&completed_tv);
Packit 4b6dd7
	is_deleted = gdata_tasks_task_is_deleted (task);
Packit 4b6dd7
	is_hidden = gdata_tasks_task_is_hidden (task);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("%s — %s\n", id, title);
Packit 4b6dd7
	g_print ("   Published: %s\n", date_published_tv.tv_sec != 0 ? date_published : "unknown");
Packit 4b6dd7
	g_print ("   Status: %s\n", format_status (status));
Packit 4b6dd7
	g_print ("   Due: %s\n", due_tv.tv_sec != 0 ? due : "not set");
Packit 4b6dd7
	g_print ("   Completed: %s\n", completed_tv.tv_sec != 0 ? completed : "not yet");
Packit 4b6dd7
	g_print ("   Deleted? %s\n", is_deleted ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Hidden? %s\n", is_hidden ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Position: %s\n", position);
Packit 4b6dd7
	g_print ("   Parent ID: %s\n", parent_id);
Packit 4b6dd7
	g_print ("   Description:\n      %s\n", description);
Packit 4b6dd7
	g_print ("   Notes:\n      %s\n", notes);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("\n");
Packit 4b6dd7
Packit 4b6dd7
	g_free (completed);
Packit 4b6dd7
	g_free (due);
Packit 4b6dd7
	g_free (date_published);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* FIXME: Factor all this code out of all the demos */
Packit 4b6dd7
static GDataAuthorizer *
Packit 4b6dd7
create_authorizer (GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataOAuth2Authorizer *authorizer = NULL;  /* owned */
Packit 4b6dd7
	gchar *uri = NULL;
Packit 4b6dd7
	gchar code[100];
Packit 4b6dd7
	GError *child_error = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Go through the interactive OAuth dance. */
Packit 4b6dd7
	authorizer = gdata_oauth2_authorizer_new (CLIENT_ID, CLIENT_SECRET,
Packit 4b6dd7
	                                          REDIRECT_URI,
Packit 4b6dd7
	                                          GDATA_TYPE_TASKS_SERVICE);
Packit 4b6dd7
Packit 4b6dd7
	/* Get an authentication URI */
Packit 4b6dd7
	uri = gdata_oauth2_authorizer_build_authentication_uri (authorizer,
Packit 4b6dd7
	                                                        NULL, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	/* Wait for the user to retrieve and enter the verifier. */
Packit 4b6dd7
	g_print ("Please navigate to the following URI and grant access:\n"
Packit 4b6dd7
	         "   %s\n", uri);
Packit 4b6dd7
	g_print ("Enter verifier (EOF to abort): ");
Packit 4b6dd7
Packit 4b6dd7
	g_free (uri);
Packit 4b6dd7
Packit 4b6dd7
	if (scanf ("%100s", code) != 1) {
Packit 4b6dd7
		/* User chose to abort. */
Packit 4b6dd7
		g_print ("\n");
Packit 4b6dd7
		g_clear_object (&authorizer);
Packit 4b6dd7
		return NULL;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Authorise the token. */
Packit 4b6dd7
	gdata_oauth2_authorizer_request_authorization (authorizer, code, NULL,
Packit 4b6dd7
	                                               &child_error);
Packit 4b6dd7
Packit 4b6dd7
	if (child_error != NULL) {
Packit 4b6dd7
		g_propagate_error (error, child_error);
Packit 4b6dd7
		g_clear_object (&authorizer);
Packit 4b6dd7
		return NULL;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return GDATA_AUTHORIZER (authorizer);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* List all the user’s task-lists. */
Packit 4b6dd7
static int
Packit 4b6dd7
command_tasklists (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	GDataTasksService *service = NULL;
Packit 4b6dd7
	GDataTasksQuery *query = NULL;
Packit 4b6dd7
	GDataFeed *feed = NULL;
Packit 4b6dd7
	GList/*<unowned GDataTasksTasklist>*/ *entries;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gint retval = 0;
Packit 4b6dd7
	GDataAuthorizer *authorizer = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (argc != 2) {
Packit 4b6dd7
		return print_usage (argv);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Authenticate and create a service. */
Packit 4b6dd7
	authorizer = create_authorizer (&error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL) {
Packit 4b6dd7
		g_printerr ("%s: Error authenticating: %s\n",
Packit 4b6dd7
		            argv[0], error->message);
Packit 4b6dd7
		g_error_free (error);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	} else if (authorizer == NULL) {
Packit 4b6dd7
		g_printerr ("%s: User chose to abort authentication.\n",
Packit 4b6dd7
		            argv[0]);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	service = gdata_tasks_service_new (authorizer);
Packit 4b6dd7
	query = gdata_tasks_query_new (NULL);
Packit 4b6dd7
Packit 4b6dd7
	feed = gdata_tasks_service_query_all_tasklists (service,
Packit 4b6dd7
	                                                GDATA_QUERY (query),
Packit 4b6dd7
	                                                NULL, NULL,
Packit 4b6dd7
	                                                NULL,
Packit 4b6dd7
	                                                &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL) {
Packit 4b6dd7
		g_printerr ("%s: Error querying tasklists: %s\n",
Packit 4b6dd7
		            argv[0], error->message);
Packit 4b6dd7
		g_error_free (error);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Print results. */
Packit 4b6dd7
	for (entries = gdata_feed_get_entries (feed); entries != NULL;
Packit 4b6dd7
	     entries = entries->next) {
Packit 4b6dd7
		GDataTasksTasklist *tasklist;
Packit 4b6dd7
Packit 4b6dd7
		tasklist = GDATA_TASKS_TASKLIST (entries->data);
Packit 4b6dd7
		print_tasklist (tasklist);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_print ("Total of %u results.\n",
Packit 4b6dd7
	         g_list_length (gdata_feed_get_entries (feed)));
Packit 4b6dd7
Packit 4b6dd7
done:
Packit 4b6dd7
	g_clear_object (&feed);
Packit 4b6dd7
	g_clear_object (&query);
Packit 4b6dd7
	g_clear_object (&authorizer);
Packit 4b6dd7
	g_clear_object (&service);
Packit 4b6dd7
Packit 4b6dd7
	return retval;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* Query the tasks in a tasklist. */
Packit 4b6dd7
static int
Packit 4b6dd7
command_tasks (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	GDataTasksService *service = NULL;
Packit 4b6dd7
	GDataTasksTasklist *tasklist = NULL;
Packit 4b6dd7
	GDataTasksQuery *query = NULL;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gint retval = 0;
Packit 4b6dd7
	const gchar *query_string, *tasklist_id;
Packit 4b6dd7
	GDataAuthorizer *authorizer = NULL;
Packit 4b6dd7
	guint n_results;
Packit 4b6dd7
Packit 4b6dd7
	if (argc < 3) {
Packit 4b6dd7
		return print_usage (argv);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	tasklist_id = argv[2];
Packit 4b6dd7
	query_string = (argc > 3) ? argv[3] : NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Authenticate and create a service. */
Packit 4b6dd7
	authorizer = create_authorizer (&error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL) {
Packit 4b6dd7
		g_printerr ("%s: Error authenticating: %s\n",
Packit 4b6dd7
		            argv[0], error->message);
Packit 4b6dd7
		g_error_free (error);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	} else if (authorizer == NULL) {
Packit 4b6dd7
		g_printerr ("%s: User chose to abort authentication.\n",
Packit 4b6dd7
		            argv[0]);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	service = gdata_tasks_service_new (authorizer);
Packit 4b6dd7
	query = gdata_tasks_query_new (query_string);
Packit 4b6dd7
	gdata_query_set_max_results (GDATA_QUERY (query), 10);
Packit 4b6dd7
	tasklist = gdata_tasks_tasklist_new (tasklist_id);
Packit 4b6dd7
	n_results = 0;
Packit 4b6dd7
Packit 4b6dd7
	while (TRUE) {
Packit 4b6dd7
		GList/*<unowned GDataTasksTask>*/ *entries, *l;
Packit 4b6dd7
		GDataFeed *feed = NULL;
Packit 4b6dd7
Packit 4b6dd7
		feed = gdata_tasks_service_query_tasks (service, tasklist,
Packit 4b6dd7
		                                        GDATA_QUERY (query),
Packit 4b6dd7
		                                        NULL, NULL, NULL,
Packit 4b6dd7
		                                        &error);
Packit 4b6dd7
Packit 4b6dd7
		if (error != NULL) {
Packit 4b6dd7
			g_printerr ("%s: Error querying tasks: %s\n",
Packit 4b6dd7
			            argv[0], error->message);
Packit 4b6dd7
			g_error_free (error);
Packit 4b6dd7
			retval = 1;
Packit 4b6dd7
			goto done;
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		/* Print results. */
Packit 4b6dd7
		entries = gdata_feed_get_entries (feed);
Packit 4b6dd7
Packit 4b6dd7
		if (entries == NULL) {
Packit 4b6dd7
			retval = 0;
Packit 4b6dd7
			g_object_unref (feed);
Packit 4b6dd7
			break;
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		for (l = entries; l != NULL; l = l->next) {
Packit 4b6dd7
			GDataTasksTask *task;
Packit 4b6dd7
Packit 4b6dd7
			task = GDATA_TASKS_TASK (l->data);
Packit 4b6dd7
			print_task (task);
Packit 4b6dd7
			n_results++;
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		gdata_query_next_page (GDATA_QUERY (query));
Packit 4b6dd7
		g_object_unref (feed);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_print ("Total of %u results.\n", n_results);
Packit 4b6dd7
Packit 4b6dd7
done:
Packit 4b6dd7
	g_clear_object (&query);
Packit 4b6dd7
	g_clear_object (&authorizer);
Packit 4b6dd7
	g_clear_object (&tasklist);
Packit 4b6dd7
	g_clear_object (&service);
Packit 4b6dd7
Packit 4b6dd7
	return retval;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static const struct {
Packit 4b6dd7
	const gchar *command;
Packit 4b6dd7
	int (*handler_fn) (int argc, char **argv);
Packit 4b6dd7
} command_handlers[] = {
Packit 4b6dd7
	{ "tasklists", command_tasklists },
Packit 4b6dd7
	{ "tasks", command_tasks },
Packit 4b6dd7
};
Packit 4b6dd7
Packit 4b6dd7
int
Packit 4b6dd7
main (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	guint i;
Packit 4b6dd7
	gint retval = -1;
Packit 4b6dd7
Packit 4b6dd7
	setlocale (LC_ALL, "");
Packit 4b6dd7
Packit 4b6dd7
	if (argc < 2) {
Packit 4b6dd7
		return print_usage (argv);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	for (i = 0; i < G_N_ELEMENTS (command_handlers); i++) {
Packit 4b6dd7
		if (strcmp (argv[1], command_handlers[i].command) == 0) {
Packit 4b6dd7
			retval = command_handlers[i].handler_fn (argc, argv);
Packit 4b6dd7
		}
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	if (retval == -1) {
Packit 4b6dd7
		retval = print_usage (argv);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return retval;
Packit 4b6dd7
}