From 697761cc337aa77a47140c8df50ed84bc25e23f6 Mon Sep 17 00:00:00 2001 From: Hans Petter Date: Thu, 11 Sep 2003 22:04:44 +0000 Subject: Import new libical from mainline HEAD and make appropriate changes to Evolution. svn path=/trunk/; revision=22538 --- libical/src/libicalcap/icalcap_message.c | 225 +++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 libical/src/libicalcap/icalcap_message.c (limited to 'libical/src/libicalcap/icalcap_message.c') diff --git a/libical/src/libicalcap/icalcap_message.c b/libical/src/libicalcap/icalcap_message.c new file mode 100644 index 0000000000..32abbf0a73 --- /dev/null +++ b/libical/src/libicalcap/icalcap_message.c @@ -0,0 +1,225 @@ +#include "config.h" + +#ifdef HAVE_STRING_H +#include +#endif + +#include "ical.h" +#include "icalcap.h" +#include "icalcap_message_impl.h" + + +/** + * constructor + * + * Create a new icalcap_message from a component. This represents a command. + */ +icalcap_message * +icalcap_message_new(const icalcap *cap, const icalcomponent *comp) { + + icalcap_message *ret = NULL; + +#ifdef WITH_RR + ret = icalcap_message_new_rr(cap, comp); +#else + ret = NULL; +#endif + return ret; +} + +/** + * constructor + * + * Create a new icalcap_message from a component. This represents a reply. + */ +icalcap_message * +icalcap_message_new_reply(const icalcap_message *capmsg, const icalcomponent *comp) { + +#ifdef WITH_RR + return icalcap_message_new_reply_rr(capmsg, comp); +#else + return NULL; +#endif +} + +/** + * destructor + * + * Delete icalcap_message + */ +void +icalcap_message_free(icalcap_message *capmsg) { + +#ifdef WITH_RR + icalcap_message_free_rr(capmsg); +#else +#endif +} + +/** + * Send the icalcap_message and wait for an answer. + * The icalcap_message will be invalid after this call, and only valid call will be + * icalcap_message_free(). + */ +icalcomponent * +icalcap_message_sync_send(icalcap_message *capmsg, int timeout) { + + g_return_val_if_fail(capmsg, NULL); + +#ifdef WITH_RR + return icalcap_message_sync_send_rr(capmsg, timeout); +#else + return NULL; +#endif +} + +/** + * Send the icalcap_message. + * The icalcap_message will be invalid after this call, and only valid call will be + * icalcap_message_free(). + */ +int +icalcap_message_send(icalcap_message *capmsg) { + + int rc = FALSE; + char *str; + + g_return_val_if_fail(capmsg, FALSE); + +#ifdef WITH_RR + rc = icalcap_message_send_reply_rr(capmsg); +#else + rc = FALSE; +#endif + + return rc; +} + +/** + * Convenience method to send a component in reply to the given icalcap_message. + * The icalcomponent is not modified in any way. + * + * FIXME should be const icalcomponent * + */ +int +icalcap_message_reply_component(const icalcap_message *orig, icalcomponent *in) { + + icalcap_message*reply; + int rc; + + reply = icalcap_message_new_reply(orig, in); + if (reply == NULL) + return FALSE; + + rc = icalcap_message_send(reply); + icalcap_message_free(reply); + + return rc; +} + +/* Only used by icalcap_message_reply_error */ +static icalcomponent *new_reply_component(const icalcap_message *capmsg, const icalcomponent *comp); + +/** + * Convenience method to send an error in reply to the given icalcap_message. + */ +int +icalcap_message_reply_error(const icalcap_message *orig, enum icalrequeststatus status, + const char *msg, const char *debug) { + + struct icalreqstattype stat; + icalcomponent *comp, *vreply; + int rc; + + /* Prepare the REQUEST-STATUS */ + stat = icalreqstattype_from_string( + icalenum_reqstat_code(status)); + + if (msg != NULL) { + /* FIXME we used to do + stat.desc = strdup(msg); + but this created a memory leak. Maybe the destructor for reqstat? */ + stat.desc = msg; + } else { + stat.desc = icalenum_reqstat_desc(status); + } + + if (debug != NULL) + stat.debug = debug; + + /* Prepare a VREPLY component */ + vreply = icalcomponent_vanew( + ICAL_VREPLY_COMPONENT, + icalproperty_new_requeststatus(stat), + 0); + if (vreply == NULL) { + /* FIXME */ + return FALSE; + } + + comp = new_reply_component(orig, vreply); + + rc = icalcap_message_reply_component(orig, comp); + + icalcomponent_free(comp); + icalcomponent_free(vreply); + + return rc; +} + + +/* internal use */ + +/* only used by new_reply_component */ +static const char * +get_id(icalcomponent *comp) { + + icalproperty *prop; + icalparameter *param; + + prop = icalcomponent_get_first_property(comp, ICAL_CMD_PROPERTY); + if (prop == NULL) + return NULL; + + param = icalproperty_get_first_parameter(prop, ICAL_ID_PARAMETER); + if (param == NULL) + return NULL; + + return icalparameter_get_id(param); +} + +/* only used by icalcap_message_reply_error */ +static icalcomponent * +new_reply_component(const icalcap_message *capmsg, const icalcomponent *comp) { + + icalcomponent *clone, *cal, *root; + icalproperty *cmd; + const char *id; + + cmd = icalproperty_new_cmd(ICAL_CMD_REPLY); + + if (capmsg->comp != NULL) { + id = get_id(capmsg->comp); + + if (id != NULL) + icalproperty_add_parameter(cmd, icalparameter_new_id(id)); + } + + cal = icalcomponent_vanew( + ICAL_VCALENDAR_COMPONENT, + icalproperty_new_version("2.0"), + icalproperty_new_prodid("-//I.Net spa//NONSGML//EN"), + cmd, + 0); + + if (comp != NULL) { + clone = icalcomponent_new_clone(comp); + icalcomponent_add_component(cal, clone); + } + + root = icalcomponent_vanew( + ICAL_XROOT_COMPONENT, + cal, + 0); + return root; +} -- cgit v1.2.3