Blame demos/calendar/calendar-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 (C) 2015 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
	            "   calendars [--all|--own]\n"
Packit 4b6dd7
	            "   events <calendar ID> [query string]\n"
Packit 4b6dd7
	            "   insert-event <calendar ID> <title> <start time> "
Packit 4b6dd7
	               "<end time> <attendee 1> [attendee 2 …]\n",
Packit 4b6dd7
	            argv[0], argv[0]);
Packit 4b6dd7
	return -1;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* Convert a GTimeVal to an ISO 8601 date string (without a time component). */
Packit 4b6dd7
static gchar *
Packit 4b6dd7
tv_to_iso8601_date (GTimeVal *tv)
Packit 4b6dd7
{
Packit 4b6dd7
	struct tm *tm;
Packit 4b6dd7
Packit 4b6dd7
	tm = gmtime (&tv->tv_sec);
Packit 4b6dd7
Packit 4b6dd7
	return g_strdup_printf ("%04d-%02d-%02d",
Packit 4b6dd7
	                        tm->tm_year + 1900,
Packit 4b6dd7
	                        tm->tm_mon + 1,
Packit 4b6dd7
	                        tm->tm_mday);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
print_calendar (GDataCalendarCalendar *calendar)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *id, *title, *time_zone, *access_level, *description;
Packit 4b6dd7
	gboolean is_hidden, is_selected;
Packit 4b6dd7
Packit 4b6dd7
	id = gdata_entry_get_id (GDATA_ENTRY (calendar));
Packit 4b6dd7
	title = gdata_entry_get_title (GDATA_ENTRY (calendar));
Packit 4b6dd7
	time_zone = gdata_calendar_calendar_get_timezone (calendar);
Packit 4b6dd7
	is_hidden = gdata_calendar_calendar_is_hidden (calendar);
Packit 4b6dd7
	is_selected = gdata_calendar_calendar_is_selected (calendar);
Packit 4b6dd7
	access_level = gdata_calendar_calendar_get_access_level (calendar);
Packit 4b6dd7
	description = gdata_entry_get_summary (GDATA_ENTRY (calendar));
Packit 4b6dd7
Packit 4b6dd7
	g_print ("%s — %s\n", id, title);
Packit 4b6dd7
	g_print ("   Timezone: %s\n", time_zone);
Packit 4b6dd7
	g_print ("   Access level: %s\n", access_level);
Packit 4b6dd7
	g_print ("   Hidden? %s\n", is_hidden ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Selected? %s\n", is_selected ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Description:\n      %s\n", description);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("\n");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
print_event (GDataCalendarEvent *event)
Packit 4b6dd7
{
Packit 4b6dd7
	const gchar *title, *id, *description, *status, *visibility;
Packit 4b6dd7
	const gchar *transparency, *uid;
Packit 4b6dd7
	GTimeVal date_published_tv = { 0, };
Packit 4b6dd7
	GTimeVal date_edited_tv = { 0, };
Packit 4b6dd7
	gchar *date_published = NULL;  /* owned */
Packit 4b6dd7
	gchar *date_edited = NULL;  /* owned */
Packit 4b6dd7
	guint sequence;
Packit 4b6dd7
	gboolean guests_can_modify, guests_can_invite_others;
Packit 4b6dd7
	gboolean guests_can_see_guests, anyone_can_add_self;
Packit 4b6dd7
	GList/*<unowned GDataGDWho>*/ *people;  /* unowned */
Packit 4b6dd7
	GList/*<unowned GDataGDWhere>*/ *places;  /* unowned */
Packit 4b6dd7
	GList/*<unowned GDataGDWhen>*/ *times;  /* unowned */
Packit 4b6dd7
Packit 4b6dd7
	title = gdata_entry_get_title (GDATA_ENTRY (event));
Packit 4b6dd7
	id = gdata_entry_get_id (GDATA_ENTRY (event));
Packit 4b6dd7
	description = gdata_entry_get_content (GDATA_ENTRY (event));
Packit 4b6dd7
	date_published_tv.tv_sec = gdata_entry_get_published (GDATA_ENTRY (event));
Packit 4b6dd7
	date_published = g_time_val_to_iso8601 (&date_published_tv);
Packit 4b6dd7
	date_edited_tv.tv_sec = gdata_calendar_event_get_edited (event);
Packit 4b6dd7
	date_edited = g_time_val_to_iso8601 (&date_edited_tv);
Packit 4b6dd7
	status = gdata_calendar_event_get_status (event);
Packit 4b6dd7
	visibility = gdata_calendar_event_get_visibility (event);
Packit 4b6dd7
	transparency = gdata_calendar_event_get_transparency (event);
Packit 4b6dd7
	uid = gdata_calendar_event_get_uid (event);
Packit 4b6dd7
	sequence = gdata_calendar_event_get_sequence (event);
Packit 4b6dd7
	guests_can_modify = gdata_calendar_event_get_guests_can_modify (event);
Packit 4b6dd7
	guests_can_invite_others = gdata_calendar_event_get_guests_can_invite_others (event);
Packit 4b6dd7
	guests_can_see_guests = gdata_calendar_event_get_guests_can_see_guests (event);
Packit 4b6dd7
	anyone_can_add_self = gdata_calendar_event_get_anyone_can_add_self (event);
Packit 4b6dd7
	people = gdata_calendar_event_get_people (event);
Packit 4b6dd7
	places = gdata_calendar_event_get_places (event);
Packit 4b6dd7
	times = gdata_calendar_event_get_times (event);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("%s — %s\n", id, title);
Packit 4b6dd7
	g_print ("   UID: %s\n", uid);
Packit 4b6dd7
	g_print ("   Sequence: %u\n", sequence);
Packit 4b6dd7
	g_print ("   Published: %s\n", date_published);
Packit 4b6dd7
	g_print ("   Edited: %s\n", date_edited);
Packit 4b6dd7
	g_print ("   Status: %s\n", status);
Packit 4b6dd7
	g_print ("   Visibility: %s\n", visibility);
Packit 4b6dd7
	g_print ("   Transparency: %s\n", transparency);
Packit 4b6dd7
	g_print ("   Guests can modify event? %s\n",
Packit 4b6dd7
	         guests_can_modify ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Guests can invite others? %s\n",
Packit 4b6dd7
	         guests_can_invite_others ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Guests can see guest list? %s\n",
Packit 4b6dd7
	         guests_can_see_guests ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Anyone can add themselves? %s\n",
Packit 4b6dd7
	         anyone_can_add_self ? "Yes" : "No");
Packit 4b6dd7
	g_print ("   Description:\n      %s\n", description);
Packit 4b6dd7
Packit 4b6dd7
	g_print ("   Guests:\n");
Packit 4b6dd7
Packit 4b6dd7
	for (; people != NULL; people = people->next) {
Packit 4b6dd7
		GDataGDWho *who;
Packit 4b6dd7
Packit 4b6dd7
		who = GDATA_GD_WHO (people->data);
Packit 4b6dd7
		g_print ("    • %s — %s (%s)\n",
Packit 4b6dd7
		         gdata_gd_who_get_value_string (who),
Packit 4b6dd7
		         gdata_gd_who_get_email_address (who),
Packit 4b6dd7
		         gdata_gd_who_get_relation_type (who));
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_print ("   Locations:\n");
Packit 4b6dd7
Packit 4b6dd7
	for (; places != NULL; places = places->next) {
Packit 4b6dd7
		GDataGDWhere *where;
Packit 4b6dd7
Packit 4b6dd7
		where = GDATA_GD_WHERE (places->data);
Packit 4b6dd7
		g_print ("    • %s\n", gdata_gd_where_get_value_string (where));
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_print ("   Times:\n");
Packit 4b6dd7
Packit 4b6dd7
	for (; times != NULL; times = times->next) {
Packit 4b6dd7
		GDataGDWhen *when;
Packit 4b6dd7
		GTimeVal start_time = { 0, }, end_time = { 0, };
Packit 4b6dd7
		gchar *start = NULL, *end = NULL;  /* owned */
Packit 4b6dd7
Packit 4b6dd7
		when = GDATA_GD_WHEN (times->data);
Packit 4b6dd7
Packit 4b6dd7
		start_time.tv_sec = gdata_gd_when_get_start_time (when);
Packit 4b6dd7
		end_time.tv_sec = gdata_gd_when_get_end_time (when);
Packit 4b6dd7
Packit 4b6dd7
		if (gdata_gd_when_is_date (when)) {
Packit 4b6dd7
			start = tv_to_iso8601_date (&start_time);
Packit 4b6dd7
			end = tv_to_iso8601_date (&end_time);
Packit 4b6dd7
		} else {
Packit 4b6dd7
			start = g_time_val_to_iso8601 (&start_time);
Packit 4b6dd7
			end = g_time_val_to_iso8601 (&end_time);
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		g_print ("    • %s to %s (%s)\n",
Packit 4b6dd7
		         start, end, gdata_gd_when_get_value_string (when));
Packit 4b6dd7
Packit 4b6dd7
		/* TODO: Reminders are not supported yet. */
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	g_print ("\n");
Packit 4b6dd7
Packit 4b6dd7
	g_free (date_published);
Packit 4b6dd7
}
Packit 4b6dd7
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_CALENDAR_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 calendars. */
Packit 4b6dd7
static int
Packit 4b6dd7
command_calendars (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCalendarService *service = NULL;
Packit 4b6dd7
	GDataCalendarQuery *query = NULL;
Packit 4b6dd7
	GDataFeed *feed = NULL;
Packit 4b6dd7
	GList/*<unowned GDataCalendarCalendar>*/ *entries;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gint retval = 0;
Packit 4b6dd7
	gboolean only_own;  /* only query for calendars the user owns */
Packit 4b6dd7
	GDataAuthorizer *authorizer = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (argc < 2) {
Packit 4b6dd7
		return print_usage (argv);
Packit 4b6dd7
	} else if (argc == 2) {
Packit 4b6dd7
		only_own = FALSE;
Packit 4b6dd7
	} else if (g_strcmp0 (argv[2], "--all") == 0 ||
Packit 4b6dd7
	           g_strcmp0 (argv[2], "--own") == 0) {
Packit 4b6dd7
		only_own = (g_strcmp0 (argv[2], "--own") == 0);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		only_own = FALSE;
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_calendar_service_new (authorizer);
Packit 4b6dd7
	query = gdata_calendar_query_new (NULL);
Packit 4b6dd7
Packit 4b6dd7
	if (only_own) {
Packit 4b6dd7
		feed = gdata_calendar_service_query_own_calendars (service,
Packit 4b6dd7
		                                                   GDATA_QUERY (query),
Packit 4b6dd7
		                                                   NULL, NULL,
Packit 4b6dd7
		                                                   NULL,
Packit 4b6dd7
		                                                   &error);
Packit 4b6dd7
	} else {
Packit 4b6dd7
		feed = gdata_calendar_service_query_all_calendars (service,
Packit 4b6dd7
		                                                   GDATA_QUERY (query),
Packit 4b6dd7
		                                                   NULL, NULL,
Packit 4b6dd7
		                                                   NULL,
Packit 4b6dd7
		                                                   &error);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL) {
Packit 4b6dd7
		g_printerr ("%s: Error querying calendars: %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
		GDataCalendarCalendar *calendar;
Packit 4b6dd7
Packit 4b6dd7
		calendar = GDATA_CALENDAR_CALENDAR (entries->data);
Packit 4b6dd7
		print_calendar (calendar);
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 events in a calendar. */
Packit 4b6dd7
static int
Packit 4b6dd7
command_events (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCalendarService *service = NULL;
Packit 4b6dd7
	GDataCalendarCalendar *calendar = NULL;
Packit 4b6dd7
	GDataCalendarQuery *query = NULL;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gint retval = 0;
Packit 4b6dd7
	const gchar *query_string, *calendar_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
	calendar_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_calendar_service_new (authorizer);
Packit 4b6dd7
	query = gdata_calendar_query_new (query_string);
Packit 4b6dd7
	gdata_query_set_max_results (GDATA_QUERY (query), 10);
Packit 4b6dd7
	calendar = gdata_calendar_calendar_new (calendar_id);
Packit 4b6dd7
	n_results = 0;
Packit 4b6dd7
Packit 4b6dd7
	while (TRUE) {
Packit 4b6dd7
		GList/*<unowned GDataCalendarEvent>*/ *entries, *l;
Packit 4b6dd7
		GDataFeed *feed = NULL;
Packit 4b6dd7
Packit 4b6dd7
		feed = gdata_calendar_service_query_events (service, calendar,
Packit 4b6dd7
		                                            GDATA_QUERY (query), NULL,
Packit 4b6dd7
		                                            NULL, NULL, &error);
Packit 4b6dd7
Packit 4b6dd7
		if (error != NULL) {
Packit 4b6dd7
			g_printerr ("%s: Error querying events: %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
			goto done;
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		for (l = entries; l != NULL; l = l->next) {
Packit 4b6dd7
			GDataCalendarEvent *event;
Packit 4b6dd7
Packit 4b6dd7
			event = GDATA_CALENDAR_EVENT (l->data);
Packit 4b6dd7
			print_event (event);
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 (&calendar);
Packit 4b6dd7
	g_clear_object (&service);
Packit 4b6dd7
Packit 4b6dd7
	return retval;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/* Insert a new event into a calendar. */
Packit 4b6dd7
static int
Packit 4b6dd7
command_insert_event (int argc, char *argv[])
Packit 4b6dd7
{
Packit 4b6dd7
	GDataCalendarService *service = NULL;
Packit 4b6dd7
	GDataCalendarCalendar *calendar = NULL;
Packit 4b6dd7
	GDataCalendarEvent *event = NULL;
Packit 4b6dd7
	GDataCalendarEvent *inserted_event = NULL;
Packit 4b6dd7
	GError *error = NULL;
Packit 4b6dd7
	gint retval = 0;
Packit 4b6dd7
	const gchar *calendar_id, *title, *start, *end;
Packit 4b6dd7
	GDataAuthorizer *authorizer = NULL;
Packit 4b6dd7
	GDataGDWhen *when = NULL;
Packit 4b6dd7
	gboolean is_date;
Packit 4b6dd7
	gchar *start_with_time = NULL, *end_with_time = NULL;
Packit 4b6dd7
	GTimeVal start_tv = { 0, }, end_tv = { 0, };
Packit 4b6dd7
	gint i;
Packit 4b6dd7
Packit 4b6dd7
	if (argc < 7) {
Packit 4b6dd7
		return print_usage (argv);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	calendar_id = argv[2];
Packit 4b6dd7
	title = argv[3];
Packit 4b6dd7
	start = argv[4];
Packit 4b6dd7
	end = argv[5];
Packit 4b6dd7
	/* subsequent arguments are e-mail addresses of attendees,
Packit 4b6dd7
	 * with at least one required. */
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_calendar_service_new (authorizer);
Packit 4b6dd7
	calendar = gdata_calendar_calendar_new (calendar_id);
Packit 4b6dd7
Packit 4b6dd7
	/* Create the event to insert. */
Packit 4b6dd7
	event = gdata_calendar_event_new (NULL);
Packit 4b6dd7
	gdata_entry_set_title (GDATA_ENTRY (event), title);
Packit 4b6dd7
Packit 4b6dd7
	start_with_time = g_strconcat (start, "T00:00:00Z", NULL);
Packit 4b6dd7
	end_with_time = g_strconcat (end, "T00:00:00Z", NULL);
Packit 4b6dd7
Packit 4b6dd7
	if (g_time_val_from_iso8601 (start, &start_tv) &&
Packit 4b6dd7
	    g_time_val_from_iso8601 (end, &end_tv)) {
Packit 4b6dd7
		/* Includes time. */
Packit 4b6dd7
		is_date = FALSE;
Packit 4b6dd7
	} else if (g_time_val_from_iso8601 (start_with_time, &start_tv) &&
Packit 4b6dd7
	           g_time_val_from_iso8601 (end_with_time, &end_tv)) {
Packit 4b6dd7
		/* Does not include time. */
Packit 4b6dd7
		is_date = TRUE;
Packit 4b6dd7
	} else {
Packit 4b6dd7
		g_printerr ("%s: Could not parse start time ‘%s’ and end time "
Packit 4b6dd7
		            "‘%s’ as ISO 8601.\n", argv[0], start, end);
Packit 4b6dd7
		retval = 1;
Packit 4b6dd7
		goto done;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	when = gdata_gd_when_new (start_tv.tv_sec, end_tv.tv_sec, is_date);
Packit 4b6dd7
	gdata_calendar_event_add_time (event, when);
Packit 4b6dd7
	g_object_unref (when);
Packit 4b6dd7
Packit 4b6dd7
	for (i = 6; i < argc; i++) {
Packit 4b6dd7
		GDataGDWho *who = NULL;
Packit 4b6dd7
		const gchar *relation_type, *email_address;
Packit 4b6dd7
Packit 4b6dd7
		relation_type = GDATA_GD_WHO_EVENT_ATTENDEE;
Packit 4b6dd7
		email_address = argv[i];
Packit 4b6dd7
Packit 4b6dd7
		who = gdata_gd_who_new (relation_type, NULL, email_address);
Packit 4b6dd7
		gdata_calendar_event_add_person (event, who);
Packit 4b6dd7
		g_object_unref (who);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	/* Insert the event. */
Packit 4b6dd7
	inserted_event = gdata_calendar_service_insert_calendar_event (service,
Packit 4b6dd7
	                                                               calendar,
Packit 4b6dd7
	                                                               event,
Packit 4b6dd7
	                                                               NULL,
Packit 4b6dd7
	                                                               &error);
Packit 4b6dd7
Packit 4b6dd7
	if (error != NULL) {
Packit 4b6dd7
		g_printerr ("%s: Error inserting event: %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
	print_event (inserted_event);
Packit 4b6dd7
Packit 4b6dd7
done:
Packit 4b6dd7
	g_free (start_with_time);
Packit 4b6dd7
	g_free (end_with_time);
Packit 4b6dd7
	g_clear_object (&inserted_event);
Packit 4b6dd7
	g_clear_object (&event);
Packit 4b6dd7
	g_clear_object (&authorizer);
Packit 4b6dd7
	g_clear_object (&calendar);
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
	{ "calendars", command_calendars },
Packit 4b6dd7
	{ "events", command_events },
Packit 4b6dd7
	{ "insert-event", command_insert_event },
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
}