Changeset 2133

Show
Ignore:
Timestamp:
06/10/07 14:44:09 (1 year ago)
Author:
dgollub
Message:

Finished porting of gnokii-event format plugin.
Fixed some memory leaks...

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plugins/gnokii-sync/src/gnokii_calendar.c

    r2118 r2133  
    202202        if (error == GN_ERR_EMPTYLOCATION) { 
    203203                osync_trace(TRACE_EXIT, "%s: no calendar note left.", __func__); 
     204                g_free(calnote); 
    204205                return NULL; 
    205206        } 
     
    208209        if (error != GN_ERR_NONE) { 
    209210                osync_trace(TRACE_EXIT_ERROR, "%s(): error while query the phone - gnokii: %s", __func__, gn_error_print(error)); 
     211                g_free(calnote); 
    210212                return NULL; 
    211213        } 
     
    573575        } 
    574576         
    575         // answer the call 
    576577        osync_context_report_success(ctx); 
    577  
    578         // blubb 
    579         /* 
    580         osync_trace(TRACE_INTERNAL, "change->hash: %s change->changetype: %i", osync_change_get_hash(change), 
    581                        osync_change_get_changetype(change)); 
    582         */ 
    583                         
    584         g_free(calnote); 
    585          
     578                                
    586579        // update hashtable 
    587580        osync_hashtable_update_hash(sinkenv->hashtable, osync_change_get_changetype(change), osync_change_get_uid(change), osync_change_get_hash(change)); 
  • plugins/gnokii-sync/src/gnokii_calendar_format.c

    r2118 r2133  
    193193                xmlfield = osync_xmlfield_new(xmlformat, "Alarm", error); 
    194194 
     195                // TODO: How to handle AlarmAction? 
     196                // AUDIO by tone?  
     197                // DISPLAY by silent?    
     198                // EMAIL and PRODECDURE isn't supported by libgnokii 
    195199                if (cal->alarm.tone) 
     200                        osync_xmlfield_set_key_value(xmlfield, "AlarmAction", "AUDIO"); 
     201                else 
    196202                        osync_xmlfield_set_key_value(xmlfield, "AlarmAction", "DISPLAY"); 
     203 
    197204 
    198205 
     
    204211 
    205212        // Summary 
    206         if (cal->text) { 
     213        if (strlen(cal->text)) { 
    207214                xmlfield = osync_xmlfield_new(xmlformat, "Summary", error); 
    208215                osync_xmlfield_set_key_value(xmlfield, "Content", cal->text); 
     
    210217 
    211218        // Phone Number 
    212         if (cal->phone_number && cal->type == GN_CALNOTE_CALL) { 
     219        if (strlen(cal->phone_number) && cal->type == GN_CALNOTE_CALL) { 
    213220                xmlfield = osync_xmlfield_new(xmlformat, "Description", error); 
    214221                osync_xmlfield_set_key_value(xmlfield, "Content", cal->phone_number); 
     
    216223 
    217224        // mlocation 
    218         if (cal->mlocation && cal->type == GN_CALNOTE_MEETING) { 
     225        if (strlen(cal->mlocation) && cal->type == GN_CALNOTE_MEETING) { 
    219226                xmlfield = osync_xmlfield_new(xmlformat, "Location", error); 
    220227                osync_xmlfield_set_key_value(xmlfield, "Content", cal->mlocation); 
     
    366373} 
    367374 
     375void static _xmlfield_alarm(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     376{ 
     377        int seconds_before = 0; 
     378        time_t start_timet, alarm_timet; 
     379 
     380        calnote->alarm.enabled = 1; 
     381         
     382        const char *action = osync_xmlfield_get_key_value(xmlfield, "AlarmAction"); 
     383 
     384        if (!action) 
     385                osync_trace(TRACE_INTERNAL, "AlarmAction wasn't set!"); 
     386 
     387        if (action && (!strcasecmp(action, "DISPLAY") || !strcasecmp(action, "AUDIO"))) 
     388                calnote->alarm.tone = 1; 
     389 
     390 
     391         
     392        const char *trigger = osync_xmlfield_get_key_value(xmlfield, "AlarmTrigger"); 
     393 
     394        if (!trigger)  
     395                osync_trace(TRACE_INTERNAL, "AlarmTrigger wasn't set!"); 
     396 
     397        const char *triggertype = osync_xmlfield_get_attr(xmlfield, "Value");            
     398 
     399        if (triggertype && !strcasecmp("DURATION", triggertype)) { 
     400                seconds_before = gnokii_util_alarmevent2secs(trigger); 
     401 
     402                // convert start event in to seconds 
     403                start_timet = gnokii_util_timestamp2unix(&(calnote->time)); 
     404 
     405                // timestamp for alarm 
     406                alarm_timet = start_timet - seconds_before; 
     407        } else if (triggertype && ! strcasecmp("DATE-TIME", triggertype)) { 
     408                // TODO: untested! - check UTC offeset issues 
     409                alarm_timet = osync_time_vtime2unix(trigger, 0); 
     410        } else { 
     411                osync_trace(TRACE_INTERNAL, "Unkown TRIGGERVALUE - skip Alarm."); 
     412                return; 
     413        } 
     414 
     415        // convert timestamp of alarm to gnokii timestamp 
     416        calnote->alarm.timestamp = gnokii_util_unix2timestamp(alarm_timet); 
     417} 
     418 
     419void static _xmlfield_summary(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     420{ 
     421        const char *summary = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     422        strncpy(calnote->text, summary, GN_CALNOTE_MAX_LENGTH);  
     423} 
     424 
     425void static _xmlfield_location(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     426{ 
     427        const char *location = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     428//      if (calnote->type == GN_CALNOTE_MEETING && location) 
     429        strncpy(calnote->mlocation, location, GN_CALNOTE_MAX_LENGTH); 
     430} 
     431 
     432void static _xmlfield_description(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     433{ 
     434 
     435        const char *description = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     436//      if (calnote->type == GN_CALNOTE_CALL || gnokii_util_valid_number(tmp)) 
     437        strncpy(calnote->phone_number, description, GN_CALNOTE_NUMBER_MAX_LENGTH); 
     438} 
     439 
     440void static _xmlfield_recurrencerule(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     441{ 
     442        int interval = 0; 
     443 
     444        const char *freq = osync_xmlfield_get_key_value(xmlfield, "Frequency"); 
     445 
     446        if (!strcasecmp(freq, "DAILY")) 
     447                calnote->recurrence = GN_CALNOTE_DAILY; 
     448        else if (!strcasecmp(freq, "WEEKLY"))  
     449                calnote->recurrence = GN_CALNOTE_WEEKLY; 
     450        else if (!strcasecmp(freq, "MONTHLY")) 
     451                calnote->recurrence = GN_CALNOTE_MONTHLY; 
     452        else if (!strcasecmp(freq, "YEARLY")) 
     453                calnote->recurrence = GN_CALNOTE_YEARLY; 
     454 
     455        const char *ival = osync_xmlfield_get_key_value(xmlfield, "Interval"); 
     456 
     457        if (ival) 
     458                sscanf(ival, "%u", &interval); 
     459 
     460        // TODO: Get this merged by demerger.... 
     461        // Nokia phones only support a interval of 2 for weeks 
     462        if (calnote->recurrence == GN_CALNOTE_WEEKLY && interval == 2) 
     463                calnote->recurrence = GN_CALNOTE_2WEEKLY; 
     464} 
     465 
     466 
    368467/*  
    369468 * Converts from XMLFormat-event to the gnokii event object type (gn_calnote). 
     
    402501                else if (!strcmp("DateEnd", osync_xmlfield_get_name(xmlfield))) 
    403502                        _xmlfield_dateend(calnote, xmlfield); 
    404  
     503                else if (!strcmp("Alarm", osync_xmlfield_get_name(xmlfield))) 
     504                        _xmlfield_alarm(calnote, xmlfield); 
     505                else if (!strcmp("Summary", osync_xmlfield_get_name(xmlfield))) 
     506                        _xmlfield_summary(calnote, xmlfield); 
     507                else if (!strcmp("Location", osync_xmlfield_get_name(xmlfield))) 
     508                        _xmlfield_location(calnote, xmlfield); 
     509                else if (!strcmp("Description", osync_xmlfield_get_name(xmlfield))) 
     510                        _xmlfield_description(calnote, xmlfield); 
     511                else if (!strcmp("RecurrenceRule", osync_xmlfield_get_name(xmlfield))) 
     512                        _xmlfield_recurrencerule(calnote, xmlfield); 
    405513 
    406514        } 
     
    408516                 
    409517 
    410         /* Alarm - TODO: is not fully supported 
    411          *              Not supported: 
    412          *              ^^^^^^^^^^^^^^ 
    413          *              # alarm after event 
    414          *              # alarm before event end 
    415          *              # ... 
    416          */ 
    417  
    418         /* TODO porting to new XMLFormat-even layout */ 
    419         /* 
    420         cur = osxml_get_node(root, "Alarm"); 
    421         if (cur && calnote->time.year) { 
    422  
    423                 int seconds_before = 0; 
    424                 time_t start_timet, alarm_timet; 
    425  
    426                 calnote->alarm.enabled = 1; 
    427                  
    428                 tmp = osxml_find_node(cur, "AlarmAction"); 
    429                 if (tmp && !strcasecmp(tmp, "DISPLAY")) 
    430                         calnote->alarm.tone = 1; 
    431  
    432                 g_free(tmp); 
    433                  
    434                 // get AlarmTrigger root 
    435                 xmlNode *sub = osxml_get_node(cur, "AlarmTrigger"); 
    436  
    437                 // get node with iCal duration 
    438                 tmp = osxml_find_node(sub, "Content"); 
    439  
    440                 // convert iCal duration string into seconds (before event) 
    441                 seconds_before = gnokii_util_alarmevent2secs(tmp); 
    442  
    443                 g_free(tmp); 
    444                  
    445                 // convert start event in to seconds 
    446                 start_timet = gnokii_util_timestamp2unix(&(calnote->time)); 
    447  
    448                 // timestamp for alarm 
    449                 alarm_timet = start_timet - seconds_before; 
    450  
    451                 // convert timestamp of alarm to gnokii timestamp 
    452                 calnote->alarm.timestamp = gnokii_util_unix2timestamp(alarm_timet); 
    453         } 
    454  
    455         // Summary 
    456         cur = osxml_get_node(root, "Summary"); 
    457         if (cur) { 
    458                 tmp = (char *) xmlNodeGetContent(cur); 
    459                 strncpy(calnote->text, tmp, sizeof(calnote->text));  
    460                 g_free(tmp); 
    461         } 
    462  
    463         // meeting location 
    464         cur = osxml_get_node(root, "Location"); 
    465         if (cur) { 
    466                 tmp = (char *) xmlNodeGetContent(cur); 
    467  
    468                 if (calnote->type == GN_CALNOTE_MEETING && tmp) 
    469                         strncpy(calnote->mlocation, tmp, sizeof(calnote->mlocation)); 
    470  
    471                 g_free(tmp); 
    472         } 
    473  
    474         // PhoneNumber 
    475         cur = osxml_get_node(root, "Description"); 
    476         if (cur) { 
    477                 tmp = (char *) xmlNodeGetContent(cur); 
    478                 if (calnote->type == GN_CALNOTE_CALL || gnokii_util_valid_number(tmp)) 
    479                         strncpy(calnote->phone_number, tmp, sizeof(calnote->phone_number)); 
    480  
    481                 g_free(tmp); 
    482         } 
    483  
    484         // Reccurence 
    485         cur = osxml_get_node(root, "RecurrenceRule"); 
    486         if (cur) { 
    487                 int interval = 0; 
    488  
    489                 for (cur = cur->children; cur; cur = cur->next) { 
    490  
    491                         tmp = (char *) xmlNodeGetContent(cur); 
    492  
    493                         if (strstr(tmp, "DAILY")) 
    494                                 calnote->recurrence = GN_CALNOTE_DAILY; 
    495                         else if (strstr(tmp, "WEEKLY"))  
    496                                 calnote->recurrence = GN_CALNOTE_WEEKLY; 
    497                         else if (strstr(tmp, "MONTHLY")) 
    498                                 calnote->recurrence = GN_CALNOTE_MONTHLY; 
    499                         else if (strstr(tmp, "YEARLY")) 
    500                                 calnote->recurrence = GN_CALNOTE_YEARLY; 
    501  
    502                         else if (strstr(tmp, "INTERVAL")) 
    503                                 sscanf(tmp, "INTERVAL=%u", &interval); 
    504  
    505                         g_free(tmp); 
    506                 } 
    507  
    508                 // Nokia phones only support a interval of 2 for weeks 
    509                 if (calnote->recurrence == GN_CALNOTE_WEEKLY && interval == 2) 
    510                         calnote->recurrence = GN_CALNOTE_2WEEKLY; 
    511         } 
    512         */ 
    513518 
    514519        // check for type which fits for given data if no type was set 
     
    516521                calnote->type = gnokii_util_calendar_type(calnote, alldayevent); 
    517522 
    518  
    519523        *free_input = TRUE; 
    520524        *output = (void *)calnote; 
     
    530534 
    531535 
    532 static void destroy_gnokii_event(char *input, size_t inpsize) 
     536static void destroy_gnokii_event(char *input, unsigned int inpsize) 
    533537{ 
    534538        osync_trace(TRACE_ENTRY, "%s(%p, %i)", __func__, input, inpsize); 
  • plugins/gnokii-sync/src/gnokii_calendar_utils.c

    r1171 r2133  
    3030 * Returns: seconds before event 
    3131 */ 
    32 int gnokii_util_alarmevent2secs(char *alarm) { 
     32int gnokii_util_alarmevent2secs(const char *alarm) { 
    3333 
    3434        osync_trace(TRACE_ENTRY, "%s(%s)", __func__, alarm); 
     
    240240        date = gnokii_util_timestamp2tm(timestamp); 
    241241        timet = mktime(date); 
     242        g_free(date); 
    242243 
    243244        osync_trace(TRACE_EXIT, "%s: %ul", __func__, timet); 
  • plugins/gnokii-sync/src/gnokii_calendar_utils.h

    r1171 r2133  
    2626gn_timestamp gnokii_util_tm2timestamp(const struct tm *timetm); 
    2727time_t gnokii_util_timestamp2unix(gn_timestamp *timestamp); 
    28 int gnokii_util_alarmevent2secs(char *alarm); 
     28int gnokii_util_alarmevent2secs(const char *alarm); 
    2929char *gnokii_util_secs2alarmevent(int secs_before_event);  
    30 osync_bool gnokii_util_valid_number(char *number);  
     30osync_bool gnokii_util_valid_number(const char *number);  
    3131gn_calnote_type gnokii_util_calendar_type(gn_calnote *calnote, osync_bool alldayevent); 
    3232 
  • plugins/gnokii-sync/src/gnokii_contact_format.c

    r2116 r2133  
    5353 
    5454        // Name 
    55         if (contact->name) { 
     55        if (strlen(contact->name)) { 
    5656 
    5757                xmlfield = osync_xmlfield_new(xmlformat, "FormattedName", error); 
     
    377377 
    378378 
    379 static void destroy_gnokii_contact(char *input, size_t inpsize) 
     379static void destroy_gnokii_contact(char *input, unsigned int inpsize) 
    380380{ 
    381381        osync_trace(TRACE_ENTRY, "%s(%p, %i)", __func__, input, inpsize);