Solved

Adding a calendar event to Evolution programatically (Linux)

Posted on 2008-10-26
2
341 Views
Last Modified: 2008-10-26
I'm trying to develop a small application that updates the Evolution calendar every few minutes. I know that there is a set of APIs (libecal) for managing, adding, etc.
I found the snippet attached to this question as an example to add a new object and set an alarm to it, however after trying endless times i can't seem to be able to change the code to allow me to add a new event on the date and time desired by my users. the format is not very clear.
i tried converting a struct tm into a format that libcal can understand but no luck.

anyone has a working snippet to add a calendar event at a specific date/time (and set its duration)?

thanks
void NewObj(ECal *ecal)

{

       time_t t1, t2;

       ECalComponent *ec;                   //ECAL component

       ECalComponentText tx;                //the text for the new component

       ECalComponentDateTime st, et;        //date/time info for the component

       struct icaltimetype x1, x2, temp;

       struct icalcomponent *ic;

       gboolean rv;

       char *uid;

       GError *ge;

 

       st.value = malloc(sizeof(struct icaltimetype));

       et.value = malloc(sizeof(struct icaltimetype));

   

       time(&t1);  //get current time

       time(&t2);

       t1 += (time_t) (60 * 60);   //initial time (in this case from current time)

       t2 += (time_t) (120 * 60);  //duration (in this case 2hs)

 

       ec = e_cal_component_new(); //create a new cal component

       e_cal_component_set_new_vtype(ec, E_CAL_COMPONENT_EVENT); //set the type to "event"

 

       tx.value = g_strdup("New event"); //set the text of the object to be added

       tx.altrep = NULL;  //set the Alternate representation URI to NULL (we don't use it now)

       e_cal_component_set_summary(ec, &tx); //set the object with the information we just entered

 

       st.tzid = (char *) strdup(tzid);

       temp = icaltime_from_timet(t1, FALSE);

 

       x1 = icaltime_convert_to_zone(temp, tzone);

              

       st.value = &x1;

       e_cal_component_set_dtstart(ec, &st);  //Sets the date/time start property of the component

 

       et.tzid = (char *) strdup(tzid);

       temp = icaltime_from_timet(t2, FALSE);

       x2 = icaltime_convert_to_zone(temp, tzone);

       et.value = &x2;

       e_cal_component_set_dtend(ec, &et); //Sets the date/time end property of a calendar component

 

       ic = e_cal_component_get_icalcomponent(ec);  //get the structure where all the cal info resides

       

       //add alarm

       add_alarm(ec);  

       

       //create the object

       rv = e_cal_create_object(ecal, ic, &uid, &ge);

       if (!rv)

       {

          printf ("Error: Event not created\n");

       }

}

Open in new window

0
Comment
Question by:urif
  • 2
2 Comments
 

Accepted Solution

by:
urif earned 0 total points
ID: 22806540
ok, i found this snippet. now i am passing 2 time_t as follow to set the start and end date/time to Nov 9, 2008 12:00 pm and Nov 9, 2008 14:00 (for start and end times respectively):

       struct tm timestart;
       struct tm timeend;
       time_t res1, res2;

       timestart.tm_year = 2008 - 1900;
       timestart.tm_mon = 11 - 1;
       timestart.tm_mday = 9;
       timestart.tm_hour = 12;
       timestart.tm_min = 00;
       timestart.tm_sec = 00;
       timestart.tm_isdst = -1;
       res1 = mktime ( &timestart );

       timeend.tm_year = 2008 - 1900;
       timeend.tm_mon = 11 - 1;
       timeend.tm_mday = 9;
       timeend.tm_hour = 14;
       timeend.tm_min = 00;
       timeend.tm_sec = 00;
       timeend.tm_isdst = -1;
       res2 = mktime ( &timeend );


the snippet adds the object to the calendar but it always adds it with 2 hrs difference, so in this case if i wanted to start at 12 pm it adds it as 10 pm. if i set it with daylight time saving then it's 3 hrs....

is this an evolution problem? or the OS clock? if yes, then is this constant? can i just add a +2 to the value?

thanks
void addobj(time_t start, time_t end, char *summary)

{

    ECalComponent *ec;

    ECalComponentText tx;

    ECalComponentDateTime st, et;

    struct icaltimetype x1, x2, temp;

    struct icalcomponent *ic;

    gboolean rv;

    GError *ge;

    char *uid;
 

    st.value = malloc(sizeof(struct icaltimetype));

    et.value = malloc(sizeof(struct icaltimetype));
 

    ec = e_cal_component_new();

    e_cal_component_set_new_vtype(ec, E_CAL_COMPONENT_EVENT);

    

    tx.value = g_strdup(summary ? summary : "Unknown description");

    tx.altrep = NULL;

    e_cal_component_set_summary(ec, &tx);

    

    st.tzid = (char *) strdup(tzid);

    temp = icaltime_from_timet(start, FALSE);

    

    x1 = icaltime_convert_to_zone(temp, tzone);

    st.value = &x1;

    e_cal_component_set_dtstart(ec, &st);

    

    et.tzid = (char *) strdup(tzid);

    temp = icaltime_from_timet(end, FALSE);

    

    x2 = icaltime_convert_to_zone(temp, tzone);

    et.value = &x2;

    e_cal_component_set_dtend(ec, &et);

    

    ic = (icalcomponent *) e_cal_component_get_icalcomponent(ec);

    rv = e_cal_create_object(ecal, (icalcomponent*)ic, &uid, &ge);

    

    if (rv) 

    {

       printf ("yes on rv\n");

    } 

    else 

    {

       printf ("no on rv\n");

    }

}

Open in new window

0
 

Author Comment

by:urif
ID: 22806586
oh, never mind it's because of the UTC that i was setting...
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Have you ever been frustrated by having to click seven times in order to retrieve a small bit of information from the web, always the same seven clicks, scrolling down and down until you reach your target? When you know the benefits of the command l…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

947 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now