aboutsummaryrefslogblamecommitdiffstats
path: root/calendar/calobj.c
blob: 8c5605c68835d078a2b5046947b131c283a4e4f7 (plain) (tree)
1
2
3
4
5
6
7
8
9
10







                                                  

                   
                   
                     
                       





                        
                                     






                                   




















                                                                                           









                                                        
                                             
 




                                                                     


                   
           





                                                  

                       
                                          

                           
 

                                                           


                                     














                                           


                     













                                                            
                                                             


















                                                                     
 







































                                                                   
                                 
                                       
                                                        















                                                         
                                       



























































                                                                                              








                                 
























                                                                   

                                         

                   

                 



                                             



















                                                                                     















































                                                                                   
                 

        
/*
 * Calendar objects implementations.
 * Copyright (C) 1998 the Free Software Foundation
 *
 * Authors:
 *   Miguel de Icaza (miguel@gnu.org)
 *   Federico Mena (federico@gimp.org)
 */
#include <string.h>
#include <glib.h>
#include "calobj.h"
#include "timeutil.h"
#include "versit/vcc.h"

iCalObject *
ical_object_new (void)
{
    iCalObject *ico;

    ico = g_new0 (iCalObject, 1);
    
    ico->seq = -1;
    ico->dtstamp = time (NULL);

    return ico;
}

static void
default_alarm (iCalObject *ical, CalendarAlarm *alarm, char *def_mail, enum AlarmType type)
{
    alarm->enabled = 0;
    alarm->type    = type;

    if (type != ALARM_MAIL){
        alarm->count   = 15;
        alarm->units   = ALARM_MINUTES;
    } else {
        printf ("uno!\n");
        alarm->count   = 1;
        alarm->units   = ALARM_DAYS;
    }

    if (type == ALARM_MAIL)
        alarm->data = g_strdup (def_mail);
    else
        alarm->data = g_strdup ("");
}

iCalObject *
ical_new (char *comment, char *organizer, char *summary)
{
    iCalObject *ico;

    ico = ical_object_new ();

    ico->comment   = g_strdup (comment);
    ico->organizer = g_strdup (organizer);
    ico->summary   = g_strdup (summary);
    ico->class     = g_strdup ("PUBLIC");

    default_alarm  (ico, &ico->dalarm, organizer, ALARM_DISPLAY);
    default_alarm  (ico, &ico->palarm, organizer, ALARM_PROGRAM);
    default_alarm  (ico, &ico->malarm, organizer, ALARM_MAIL);
    default_alarm  (ico, &ico->aalarm, organizer, ALARM_AUDIO);
    
    return ico;
}

static void
my_free (gpointer data, gpointer user_dat_ignored)
{
    g_free (data);
}

static void
list_free (GList *list)
{
    g_list_foreach (list, my_free, 0);
    g_list_free (list);
}

#define free_if_defined(x) if (x){ g_free (x); x = 0; }
#define lfree_if_defined(x) if (x){ list_free (x); x = 0; }
void
ical_object_destroy (iCalObject *ico)
{
    /* Regular strings */
    free_if_defined  (ico->comment);
    free_if_defined  (ico->organizer);
    free_if_defined  (ico->summary);
    free_if_defined  (ico->uid);
    free_if_defined  (ico->status);
    free_if_defined  (ico->class);
    free_if_defined  (ico->url);

    /* Lists */
    lfree_if_defined (ico->exdate);
    lfree_if_defined (ico->categories);
    lfree_if_defined (ico->resources);
    lfree_if_defined (ico->related);
    lfree_if_defined (ico->attach);
    
    g_free (ico);
}

GList *
set_list (char *str, char *sc)
{
    GList *list = 0;
    char *s;
    
    for (s = strtok (str, sc); s; s = strtok (NULL, sc))
        list = g_list_prepend (list, g_strdup (s));
    
    return list;
}

#define is_a_prop_of(obj,prop) isAPropertyOf (obj,prop)
#define str_val(obj) fakeCString (vObjectUStringZValue (obj))
#define has(obj,prop) (vo = isAPropertyOf (obj, prop))

/* FIXME: we need to load the recurrence properties */
iCalObject *
ical_object_create_from_vobject (VObject *o, const char *object_name)
{
    time_t  now = time (NULL);
    iCalObject *ical;
    VObject *vo;
    VObjectIterator i;

    ical = g_new0 (iCalObject, 1);
    
    if (strcmp (object_name, VCEventProp) == 0)
        ical->type = ICAL_EVENT;
    else if (strcmp (object_name, VCTodoProp) == 0)
        ical->type = ICAL_TODO;
    else
        return 0;

    /* uid */
    if (has (o, VCUniqueStringProp))
        ical->uid = g_strdup (str_val (vo));

    /* seq */
    if (has (o, VCSequenceProp))
        ical->seq = atoi (str_val (vo));
    else
        ical->seq = 0;
    
    /* dtstart */
    if (has (o, VCDTstartProp))
        ical->dtstart = time_from_isodate (str_val (vo));
    else
        ical->dtstart = 0;

    /* dtend */
    if (has (o, VCDTendProp))
        ical->dtend = time_from_isodate (str_val (vo));
    else
        ical->dtend = 0;

    /* dcreated */
    if (has (o, VCDCreatedProp))
        ical->created = time_from_isodate (str_val (vo));
    
    /* completed */
    if (has (o, VCCompletedProp))
        ical->completed = time_from_isodate (str_val (vo));
    
    /* last_mod */
    if (has (o, VCLastModifiedProp))
        ical->last_mod = time_from_isodate (str_val (vo));
    else
        ical->last_mod = now;

    /* exdate */
    if (has (o, VCExpDateProp))
        ical->exdate = set_list (str_val (vo), ",");

    /* description/comment */
    if (has (o, VCDescriptionProp))
        ical->comment = g_strdup (str_val (vo));
    
    /* summary */
    if (has (o, VCSummaryProp))
        ical->summary = g_strdup (str_val (vo));
    else
        ical->summary = g_strdup ("");

    /* status */
    if (has (o, VCStatusProp))
        ical->status = g_strdup (str_val (vo));
    else
        ical->status = g_strdup ("NEEDS ACTION");

    if (has (o, VCClassProp))
        ical->class = g_strdup (str_val (vo));
    else
        ical->class = "PUBLIC";

    /* categories */
    if (has (o, VCCategoriesProp))
        ical->categories = set_list (str_val (vo), ",");

    /* resources */
    if (has (o, VCResourcesProp))
        ical->resources = set_list (str_val (vo), ";");
    
    /* priority */
    if (has (o, VCPriorityProp))
        ical->priority = atoi (str_val (vo));

    /* tranparency */
    if (has (o, VCTranspProp))
        ical->transp = atoi (str_val (vo)) ? ICAL_TRANSPARENT : ICAL_OPAQUE;

    /* related */
    if (has (o, VCRelatedToProp))
        ical->related = set_list (str_val (vo), ";");

    /* attach */
    initPropIterator (&i, o);
    while (moreIteration (&i)){
        vo = nextVObject (&i);
        if (strcmp (vObjectName (vo), VCAttachProp) == 0)
            ical->attach = g_list_prepend (ical->attach, g_strdup (str_val (vo)));
    }

    /* url */
    if (has (o, VCURLProp))
        ical->url = g_strdup (str_val (vo));
    
    /* FIXME: dalarm */
    if (has (o, VCDAlarmProp))
        ;
    
    /* FIXME: aalarm */
    if (has (o, VCAAlarmProp))
        ;

    /* FIXME: palarm */
    if (has (o, VCPAlarmProp))
        ;

    /* FIXME: malarm */
    if (has (o, VCMAlarmProp))
        ;

    /* FIXME: rdate */
    if (has (o, VCRDateProp))
        ;

    /* FIXME: rrule */
    if (has (o, VCRRuleProp))
        ;
        
    return ical;
}

static char *
to_str (int num)
{
    static char buf [40];

    sprintf (buf, "%d", num);
    return buf;
}

/*
 * stores a GList in the property, using SEP as the value separator
 */
static void
store_list (VObject *o, char *prop, GList *values, char sep)
{
    GList *l;
    int len;
    char *result, *p;
    
    for (len = 0, l = values; l; l = l->next)
        len += strlen (l->data) + 1;

    result = g_malloc (len);
    for (p = result, l = values; l; l = l->next){
        int len = strlen (l->data);
        
        strcpy (p, l->data);
        p [len] = sep;
        p += len+1;
    }
    addPropValue (o, prop, result);
    g_free (p);
}

VObject *
ical_object_to_vobject (iCalObject *ical)
{
    VObject *o;
    GList *l;
    
    if (ical->type == ICAL_EVENT)
        o = newVObject (VCEventProp);
    else
        o = newVObject (VCTodoProp);

    /* uid */
    if (ical->uid)
        addPropValue (o, VCUniqueStringProp, ical->uid);

    /* seq */
    addPropValue (o, VCSequenceProp, to_str (ical->seq));

    /* dtstart */
    addPropValue (o, VCDTstartProp, isodate_from_time_t (ical->dtstart));

    /* dtend */
    addPropValue (o, VCDTendProp, isodate_from_time_t (ical->dtend));

    /* dcreated */
    addPropValue (o, VCDTendProp, isodate_from_time_t (ical->created));

    /* completed */
    if (ical->completed)
        addPropValue (o, VCDTendProp, isodate_from_time_t (ical->completed));

    /* last_mod */
    addPropValue (o, VCLastModifiedProp, isodate_from_time_t (ical->last_mod));

    /* exdate */
    if (ical->exdate)
        store_list (o, VCExpDateProp, ical->exdate, ',');

    /* description/comment */
    if (ical->comment)
        addPropValue (o, VCDescriptionProp, ical->comment);

    /* summary */
    if (ical->summary)
        addPropValue (o, VCSummaryProp, ical->summary);
    
    /* status */
    addPropValue (o, VCStatusProp, ical->status);

    /* class */
    addPropValue (o, VCClassProp, ical->class);

    /* categories */
    if (ical->categories)
        store_list (o, VCCategoriesProp, ical->categories, ',');

    /* resources */
    if (ical->categories)
        store_list (o, VCCategoriesProp, ical->resources, ";");

    /* priority */
    addPropValue (o, VCPriorityProp, to_str (ical->priority));

    /* transparency */
    addPropValue (o, VCTranspProp, to_str (ical->transp));

    /* related */
    store_list (o, VCRelatedToProp, ical->related, ";");

    /* attach */
    for (l = ical->attach; l; l = l->next)
        addPropValue (o, VCAttachProp, l->data);

    /* url */
    if (ical->url)
        addPropValue (o, VCURLProp, ical->url);

    /* FIXME: alarms */
    return o;
}