aboutsummaryrefslogblamecommitdiffstats
path: root/libical/src/libicalcap/client.c
blob: 399568ac798894e337818d169251b4b535402c23 (plain) (tree)


























































































































































































                                                                                               
/*-
 * $Id$
 *
 * See the file LICENSE for redistribution information. 
 * If you have not received a copy of the license, please contact CodeFactory
 * by email at info@codefactory.se, or on the web at http://www.codefactory.se/
 * You may also write to: CodeFactory AB, SE-903 47, Umeå, Sweden.
 *
 * Copyright (c) 2002 Jonas Borgström <jonas@codefactory.se>
 * Copyright (c) 2002 Daniel Lundin   <daniel@codefactory.se>
 * Copyright (c) 2002 CodeFactory AB.  All rights reserved.
 */

#include <stdio.h>
#include <stdlib.h>

#include <librr/rr.h>

#include "icalcap.h"
#include "icalcap_session.h"

#define CLIENT_CAPABILITY \
"Content-Type: text/html\n\n\
BEGIN:VCALENDAR\n\
VERSION:2.0\n\
PRODIR:rrcap-client\n\
CMD:REPLY\n\
BEGIN:VREPLY\n\
CAP-VERSION:1.0\n\
PRODID:rrcap-client\n\
QUERY-LEVEL:CAL-QL-NONE\n\
CAR-LEVEL:CAR-FULL-NONE\n\
DATE-MAX:99991231T235959Z\n\
DATE-MIN:00000101T000000Z\n\
MAX-COMPONENT-SIZE:0\n\
COMPONENTS:VCALENDAR,VTODO,VJOURNAL,VEVENT,VCAR,\n\
 VALARM,VFREEBUSY,VTIMEZONE,STANDARD,DAYLIGHT,VREPLY\n\
ITIP-VERSION:2447\n\
RECUR-ACCEPTED:TRUE\n\
RECUR-EXPAND:TRUE\n\
RECUR-LIMIT:0\n\
STORES-EXPANDED:FALSE\n\
END:VREPLY\n\
END:VCALENDAR\n"


icalcomponent *
icalcap_send_cmd(const icalcap *cap, const gchar *cmd, const gchar *id, int timeout) {

    icalcap_message*capmsg;
    icalcomponent  *comp, *ret = NULL;
    icalproperty   *prop;

    prop = icalproperty_vanew_cmd(
        icalproperty_string_to_enum(cmd),
        icalparameter_new_id(id),
        0);

    if (timeout > 0) {
        char buf[16];

        snprintf(buf, 16, "%d", timeout);
        icalproperty_add_parameter(prop,
            icalparameter_new_latency(buf));

        icalproperty_add_parameter(prop,
            icalparameter_new_actionparam(ICAL_ACTIONPARAM_ABORT));
    }

    comp = icalcomponent_vanew(
        ICAL_VCALENDAR_COMPONENT,
        icalproperty_new_version("2.0"),
        icalproperty_new_prodid("-//I.Net spa//NONSGML//EN"),
        prop,
        0);

    capmsg = icalcap_message_new(cap, comp);
    ret = icalcap_message_sync_send(capmsg, timeout);
    icalcap_message_free(capmsg);
    icalcomponent_free(comp);

    return ret;
}

icalcomponent *
icalcap_new_reply_component(const char *id, const icalcomponent *comp) {

    if (comp == NULL)
        return NULL;

    return icalcomponent_vanew(
        ICAL_VCALENDAR_COMPONENT,
        icalproperty_new_version("2.0"),
        icalproperty_new_prodid("-//I.Net spa//NONSGML//EN"),
        icalproperty_vanew_cmd(
            ICAL_CMD_REPLY,
/*          icalparameter_new_id(id), */
            0),
        comp,
        0);
}


static int
msg_handler(const icalcap_message *capmsg) {

    icalcomponent *reply;

    g_message("Got: %s", icalcomponent_as_ical_string(capmsg->comp));

    /* FIXME Check it's a GET-CAPABILITY */

    reply = icalcap_new_reply_component(NULL, capmsg->comp);
    if (reply == NULL) {
        return FALSE;
    }

    icalcomponent_add_property(reply,
        icalproperty_new_prodid("client"));

    icalcomponent_free(reply);
    return TRUE;
}

int
main (gint argc, gchar **argv)
{
    icalcap_session*conn;
    icalcap        *cap;
    icalcomponent  *comp;

    int     i, n;
    int     verbose = 0;

    if ((conn = icalcap_session_new()) == NULL) {
        fprintf(stderr, "Init failed\n");
        exit(0);
    }

    if (!icalcap_session_connect(conn, "gundam.inet.it", 0)) {
        fprintf(stderr, "Connect failed\n");
        exit(0);
    }

    if (!icalcap_session_login(conn, "user@example.com", "user@example.com", "password")) {
        fprintf(stderr, "Login failed\n");
        exit(0);
    }

    if ((cap = icalcap_session_start(conn, msg_handler)) == NULL) {
        fprintf(stderr, "Start failed\n");
        exit(0);
    }

    if (argc > 1 && *argv[1] == '1')
        n = 100;
    else
        n = 1;

    for (i=0; i<n; i++) {
        g_print("Test 1: %d\n", i);

        if ((comp = icalcap_send_cmd(cap, "GET-CAPABILITY", "zero",15))
            == NULL) {
            fprintf(stderr, "Send failed\n");
            exit(0);
        }

        if (verbose)
            g_print("Got %s\n", icalcomponent_as_ical_string(comp));

        if (comp)
            icalcomponent_free(comp);
    }

    if (!icalcap_stop(cap)) {
        fprintf(stderr, "Stop failed\n");
        exit(0);
    }

    if (!icalcap_session_disconnect(conn)) {
        fprintf(stderr, "Disconnect failed\n");
        exit(0);
    }

    return 0;
}