summaryrefslogtreecommitdiffstats
path: root/src/.svn/text-base/caldav.c.svn-base
diff options
context:
space:
mode:
Diffstat (limited to 'src/.svn/text-base/caldav.c.svn-base')
-rw-r--r--src/.svn/text-base/caldav.c.svn-base745
1 files changed, 0 insertions, 745 deletions
diff --git a/src/.svn/text-base/caldav.c.svn-base b/src/.svn/text-base/caldav.c.svn-base
deleted file mode 100644
index 193429c..0000000
--- a/src/.svn/text-base/caldav.c.svn-base
+++ /dev/null
@@ -1,745 +0,0 @@
-/* vim: set textwidth=80 tabstop=4: */
-
-/* Copyright (c) 2008 Michael Rasmussen (mir@datanom.net)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "caldav.h"
-#include "caldav-utils.h"
-#include "get-caldav-report.h"
-#include "add-caldav-object.h"
-#include "delete-caldav-object.h"
-#include "modify-caldav-object.h"
-#include "get-display-name.h"
-#include "options-caldav-server.h"
-#include "get-freebusy-report.h"
-#include <curl/curl.h>
-#include <glib.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static void init_runtime(runtime_info* info) {
- if (! info)
- return;
- if (! info->error)
- info->error = g_new0(caldav_error, 1);
- if (! info->options) {
- info->options = g_new0(debug_curl, 1);
- info->options->trace_ascii = 1;
- info->options->debug = 0;
- info->options->verify_ssl_certificate = TRUE;
- info->options->use_locking = TRUE;
- info->options->custom_cacert = NULL;
- }
-}
-
-/**
- * @param curl An instance of libcurl.
- * @param settings Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. URL is part of the structure. [http://][username:password@]host[:port]/url-path.
- * See (RFC1738).
- * @return FALSE (zero) mens URL does not reference a CalDAV calendar
- * resource. TRUE if the URL does reference a CalDAV calendar resource.
- */
-static gboolean test_caldav_enabled(CURL* curl,
- caldav_settings* settings,
- caldav_error* error) {
- return caldav_getoptions(curl, settings, NULL, error, TRUE);
-}
-
-/*
- * @param settings An instance of caldav_settings. @see caldav_settings
- * @return TRUE if there was an error. Error can be in libcurl, in libcaldav,
- * or an error related to the CalDAV protocol.
- */
-static gboolean make_caldav_call(caldav_settings* settings,
- runtime_info* info) {
- CURL* curl;
- gboolean result = FALSE;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- curl = get_curl(settings);
- if (!curl) {
- info->error->str = g_strdup("Could not initialize libcurl");
- g_free(settings->file);
- settings->file = NULL;
- return TRUE;
- }
- if (!test_caldav_enabled(curl, settings, info->error)) {
- g_free(settings->file);
- settings->file = NULL;
- curl_easy_cleanup(curl);
- return TRUE;
- }
- curl_easy_cleanup(curl);
- switch (settings->ACTION) {
- case GETALL: result = caldav_getall(settings, info->error); break;
- case GET: result = caldav_getrange(settings, info->error); break;
- case ADD: result = caldav_add(settings, info->error); break;
- case DELETE: result = caldav_delete(settings, info->error); break;
- case MODIFY: result = caldav_modify(settings, info->error); break;
- case GETCALNAME: result = caldav_getname(settings, info->error); break;
- case FREEBUSY: result = caldav_freebusy(settings, info->error); break;
- default: break;
- }
- return result;
-}
-
-/**
- * Function for adding a new event.
- * @param object Appointment following ICal format (RFC2445). Receiver is
- * responsible for freeing the memory.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_add_object(const char* object,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- init_caldav_settings(&settings);
- settings.file = g_strdup(object);
- settings.ACTION = ADD;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function for deleting an event.
- * @param object Appointment following ICal format (RFC2445). Receiver is
- * responsible for freeing the memory.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_delete_object(const char* object,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- init_caldav_settings(&settings);
- settings.file = g_strdup(object);
- settings.ACTION = DELETE;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function for modifying an event.
- * @param object Appointment following ICal format (RFC2445). Receiver is
- * responsible for freeing the memory.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_modify_object(const char* object,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- init_caldav_settings(&settings);
- settings.file = g_strdup(object);
- settings.ACTION = MODIFY;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function for getting a collection of events determined by time range.
- * @param result A pointer to struct _response where the result is to stored.
- * @see response. Caller is responsible for freeing the memory.
- * @param start time_t variable specifying start and end for range. Both
- * are included in range.
- * @param end time_t variable specifying start and end for range. Both
- * are included in range.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_get_object(response *result,
- time_t start,
- time_t end,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- if (!result) {
- result = malloc(sizeof(response *));
- memset(result, '\0', sizeof(response *));
- }
- init_caldav_settings(&settings);
- settings.ACTION = GET;
- settings.start = start;
- settings.end = end;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- result->msg = NULL;
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- result->msg = g_strdup(settings.file);
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function for getting all events from the collection.
- * @param result A pointer to struct _response where the result is to stored.
- * @see response. Caller is responsible for freeing the memory.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_getall_object(response* result,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- if (!result) {
- result = malloc(sizeof(response *));
- memset(result, '\0', sizeof(response *));
- }
- init_caldav_settings(&settings);
- settings.ACTION = GETALL;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- result->msg = NULL;
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- result->msg = g_strdup(settings.file);
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function for getting the stored display name for the collection.
- * @param result A pointer to struct _response where the result is to stored.
- * @see response. Caller is responsible for freeing the memory.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_get_displayname(response* result,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- if (!result) {
- result = malloc(sizeof(response *));
- memset(result, '\0', sizeof(response *));
- }
- init_caldav_settings(&settings);
- settings.ACTION = GETCALNAME;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- result->msg = NULL;
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- result->msg = g_strdup(settings.file);
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function to test wether a calendar resource is CalDAV enabled or not.
- * @param URL Defines CalDAV resource. Receiver is responsible for
- * freeing the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @result 0 (zero) means no CalDAV support, otherwise CalDAV support
- * detechted.
- */
-int caldav_enabled_resource(const char* URL, runtime_info* info) {
- CURL* curl;
- caldav_settings settings;
- struct config_data data;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- init_caldav_settings(&settings);
-
- parse_url(&settings, URL);
- curl = get_curl(&settings);
- if (!curl) {
- info->error->code = -1;
- info->error->str = g_strdup("Could not initialize libcurl");
- settings.file = NULL;
- return TRUE;
- }
-
- if (info->options->trace_ascii)
- data.trace_ascii = 1;
- else
- data.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
-
- if (info->options->debug) {
- curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
- curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &data);
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
- }
- gboolean res = test_caldav_enabled(curl, &settings, info->error);
- free_caldav_settings(&settings);
- curl_easy_cleanup(curl);
- return (res && (info->error->code == 0 || info->error->code == 200)) ? 1 : 0;
-}
-
-/**
- * Function for getting free/busy information.
- * @param result A pointer to struct _response where the result is to stored.
- * @see response. Caller is responsible for freeing the memory.
- * @param start time_t variable specifying start and end for range. Both
- * are included in range.
- * @param end time_t variable specifying start and end for range. Both
- * are included in range.
- * @param URL Defines CalDAV resource. Receiver is responsible for freeing
- * the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @return Ok, FORBIDDEN, or CONFLICT. @see CALDAV_RESPONSE
- */
-CALDAV_RESPONSE caldav_get_freebusy(response *result,
- time_t start,
- time_t end,
- const char* URL,
- runtime_info* info) {
- caldav_settings settings;
- CALDAV_RESPONSE caldav_response;
-
- g_return_val_if_fail(info != NULL, TRUE);
-
- init_runtime(info);
- if (!result) {
- result = malloc(sizeof(response *));
- memset(result, '\0', sizeof(response *));
- }
- init_caldav_settings(&settings);
- settings.ACTION = FREEBUSY;
- settings.start = start;
- settings.end = end;
- if (info->options->debug)
- settings.debug = TRUE;
- else
- settings.debug = FALSE;
- if (info->options->trace_ascii)
- settings.trace_ascii = 1;
- else
- settings.trace_ascii = 0;
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
- parse_url(&settings, URL);
- gboolean res = make_caldav_call(&settings, info);
- if (res) {
- result->msg = NULL;
- if (info->error->code > 0) {
- switch (info->error->code) {
- case 403: caldav_response = FORBIDDEN; break;
- case 409: caldav_response = CONFLICT; break;
- case 423: caldav_response = LOCKED; break;
- case 501: caldav_response = NOTIMPLEMENTED; break;
- default: caldav_response = CONFLICT; break;
- }
- }
- else {
- /* fall-back to conflicting state */
- caldav_response = CONFLICT;
- }
- }
- else {
- result->msg = g_strdup(settings.file);
- caldav_response = OK;
- }
- free_caldav_settings(&settings);
- return caldav_response;
-}
-
-/**
- * Function which supports sending various options inside the library.
- * @param curl_options A struct debug_curl. See debug_curl.
- */
-void caldav_set_options(debug_curl curl_options) {
-}
-
-/**
- * @deprecated Function to call in case of errors.
- * Caller provides a pointer to a local caldav_error structure.
- * Caldav_get_error will initialize pointer if NULL.
- * Caller is responsible for freeing returned memory.
- * After the first call the internal error buffer is reset.
- * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error
- * @return An initialized caldav_error pointer to memory where error
- * messages can be found from the last call to the library.
- */
-caldav_error* caldav_get_error(caldav_error* lib_error) {
- if (!lib_error) {
- lib_error = g_new0(caldav_error, 1);
- }
- return lib_error;
-}
-
-/**
- * Function for freeing memory for a previous initialization of a
- * caldav_error. @see caldav_get_error()
- * Caller provides a pointer to a local caldav_error structure.
- * @param lib_error A pointer to a struct _caldav_error. @see _caldav_error
- */
-void caldav_free_error(caldav_error* lib_error) {
- if (lib_error->str)
- g_free(lib_error->str);
- g_free(lib_error);
- lib_error = NULL;
-}
-
-/**
- * Function to call to get a list of supported CalDAV options for a server
- * @param URL Defines CalDAV resource. Receiver is responsible for
- * freeing the memory. [http://][username[:password]@]host[:port]/url-path.
- * See (RFC1738).
- * @result A list of available options or NULL in case of any error.
- */
-char** caldav_get_server_options(const char* URL, runtime_info* info) {
- CURL* curl;
- caldav_settings settings;
- response server_options;
- gchar** option_list = NULL;
- gchar** tmp;
- gboolean res = FALSE;
-
- g_return_val_if_fail(info != NULL, NULL);
-
- init_runtime(info);
- tmp = option_list = NULL;
- init_caldav_settings(&settings);
-
- parse_url(&settings, URL);
- curl = get_curl(&settings);
- if (!curl) {
- info->error->code = -1;
- info->error->str = g_strdup("Could not initialize libcurl");
- settings.file = NULL;
- return NULL;
- }
- if (info->options->use_locking)
- settings.use_locking = 1;
- else
- settings.use_locking = 0;
-
- res = caldav_getoptions(curl, &settings, &server_options, info->error, FALSE);
- if (res) {
- if (server_options.msg) {
- option_list = g_strsplit(server_options.msg, ", ", 0);
- tmp = &(*(option_list));
- while (*tmp) {
- g_strstrip(*tmp++);
- }
- }
- }
- free_caldav_settings(&settings);
- curl_easy_cleanup(curl);
- return (option_list) ? option_list : NULL;
-}
-
-/**
- * Function for getting an initialized runtime_info structure
- * @return runtime_info. @see runtime_info
- */
-runtime_info* caldav_get_runtime_info() {
- runtime_info* rt_info;
-
- rt_info = g_new0(runtime_info, 1);
- rt_info->error = g_new0(caldav_error, 1);
- rt_info->options = g_new0(debug_curl, 1);
-
- return rt_info;
-}
-
-/**
- * Function for freeing memory for a previous initialization of an info
- * structure
- * @param info Address to a pointer to a runtime_info structure. @see
- * runtime_info
- */
-void caldav_free_runtime_info(runtime_info** info) {
- runtime_info* ri;
-
- if (*info) {
- ri = *info;
- if (ri->error) {
- if (ri->error->str)
- g_free(ri->error->str);
- g_free(ri->error);
- ri->error = NULL;
- }
- if (ri->options) {
- if (ri->options->custom_cacert)
- g_free(ri->options->custom_cacert);
- g_free(ri->options);
- ri->options = NULL;
- }
- g_free(ri);
- *info = ri = NULL;
- }
-}
-
-/**
- * Function for getting an initialized response structure
- * @return response. @see _response
- */
-response* caldav_get_response() {
- response* r;
-
- r = g_new0(response, 1);
-
- return r;
-}
-
-/**
- * Function for freeing memory for a previous initialization of an response
- * structure
- * @param info Address to a pointer to a response structure. @see
- * _response
- */
-void caldav_free_response(response** resp) {
- response* r;
-
- if (*resp) {
- r = *resp;
- if (r->msg)
- g_free(r->msg);
- g_free(r);
- *resp = r = NULL;
- }
-}