Changeset 2146

Show
Ignore:
Timestamp:
06/12/07 14:28:42 (1 year ago)
Author:
mjahn
Message:

revert bad commits 2145:2141 sorry for the noise

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • plugins/gnokii-sync/SConstruct

    r2142 r2146  
    5454install_plugin = '${DESTDIR}$prefix/$libsuffix/opensync/plugins' 
    5555install_format = '${DESTDIR}$prefix/$libsuffix/opensync/formats' 
     56install_config = '${DESTDIR}$prefix/share/opensync/defaults' 
    5657 
    57 Export('env opts testenv install_prefix install_plugin install_format') 
     58Export('env opts testenv install_prefix install_plugin install_format install_config') 
    5859 
    5960SConscript(['src/SConscript']) 
  • plugins/gnokii-sync/build/linux/osync_build.py

    r2143 r2146  
    5050         
    5151        return testenv 
    52  
  • plugins/gnokii-sync/src/SConscript

    r2142 r2146  
    99 
    1010# basic vformat plugins 
    11 gnokii_sync = env.SharedLibrary('gnokii-sync', ['gnokii_sync.c', 'gnokii_calendar.c', 'gnokii_contact.c', 'gnokii_config.c', 'gnokii_comm.c'], LIBS = ['opensync', 'gnokii'], LIBPATH = '$prefix/$libsuffix'
    12 gnokii_event = env.SharedLibrary('gnokii-event', ['gnokii_calendar_format.c'], LIBS = ['opensync'], LIBPATH = '$prefix/$libsuffix'
    13 gnokii_contact = env.SharedLibrary('gnokii-contact', ['gnokii_contact_format.c'], LIBS = ['opensync'], LIBPATH = '$prefix/$libsuffix'
     11gnokii_sync = env.SharedLibrary('gnokii-sync', ['gnokii_sync.c', 'gnokii_calendar.c', 'gnokii_contact.c', 'gnokii_config.c', 'gnokii_comm.c'], LIBS = ['opensync', 'gnokii']
     12gnokii_event = env.SharedLibrary('gnokii-event', ['gnokii_calendar_format.c', 'gnokii_calendar_utils.c'], LIBS = ['opensync']
     13gnokii_contact = env.SharedLibrary('gnokii-contact', ['gnokii_contact_format.c', 'gnokii_contact_utils.c'], LIBS = ['opensync']
    1414 
    1515 
    16 # install synchronization plugin  
     16# install synchronization plugin and config  
    1717env.Install(install_plugin, gnokii_sync) 
    18 # install format plugin 
     18env.Install(install_config, ['gnokii-sync'])     
     19 
     20# install format plugins 
    1921env.Install(install_format, gnokii_event) 
    2022env.Install(install_format, gnokii_contact) 
  • plugins/gnokii-sync/src/gnokii_calendar.c

    r2145 r2146  
    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        } 
     
    367369                        break; 
    368370 
    369                 OSyncChange *change = osync_change_new(&error); 
    370  
    371371                // prepare UID with gnokii-calendar-<memory location> 
    372372                uid = g_strdup_printf ("gnokii-calendar-%i", calnote->location); 
     373                osync_hashtable_report(sinkenv->hashtable, uid); 
     374 
     375                hash = gnokii_calendar_hash(calnote); 
     376                OSyncChangeType type = osync_hashtable_get_changetype(sinkenv->hashtable, uid, hash); 
     377 
     378                if (type == OSYNC_CHANGE_TYPE_UNMODIFIED) { 
     379                        g_free(hash); 
     380                        g_free(uid); 
     381                        g_free(calnote); 
     382                        continue; 
     383                } 
     384 
     385                osync_hashtable_update_hash(sinkenv->hashtable, type, uid, hash); 
     386 
     387                OSyncChange *change = osync_change_new(&error); 
     388 
    373389                osync_change_set_uid(change, uid); 
    374  
    375                 // get hash of calnote 
    376                 hash = gnokii_calendar_hash(calnote); 
    377390                osync_change_set_hash(change, hash);     
     391                osync_change_set_changetype(change, type); 
    378392 
    379393                // set data 
    380                 OSyncData *data = osync_data_new((char *) calnote, sizeof(gn_calnote), sinkenv->objformat, &error); 
    381                 if (!data) { 
     394                osync_trace(TRACE_INTERNAL, "objformat: %p", sinkenv->objformat); 
     395                OSyncData *odata = osync_data_new((char *) calnote, sizeof(gn_calnote), sinkenv->objformat, &error); 
     396                if (!odata) { 
    382397                        osync_change_unref(change); 
    383398                        osync_context_report_osyncwarning(ctx, error); 
     
    385400                        g_free(hash); 
    386401                        g_free(uid); 
     402                        g_free(calnote); 
    387403                        continue; 
    388404                } 
    389405 
    390                 osync_data_set_objtype(data, osync_objtype_sink_get_name(sink)); 
    391                 osync_change_set_data(change, data); 
    392                 osync_data_unref(data); 
    393          
    394                 OSyncChangeType type = osync_hashtable_get_changetype(sinkenv->hashtable, uid, hash); 
    395                 if (type != OSYNC_CHANGE_TYPE_UNMODIFIED) { 
    396                         osync_trace(TRACE_INTERNAL, "Position: %i Needs to be reported (!= hash)", calnote->location); 
    397                         osync_context_report_change(ctx, change); 
    398                         osync_hashtable_update_hash(sinkenv->hashtable, type, uid, hash); 
    399                 }        
     406                osync_data_set_objtype(odata, osync_objtype_sink_get_name(sink)); 
     407                osync_change_set_data(change, odata); 
     408                osync_data_unref(odata); 
     409 
     410                osync_context_report_change(ctx, change); 
     411 
     412                osync_trace(TRACE_INTERNAL, "Change: %p", change); 
     413 
     414                osync_change_unref(change); 
    400415 
    401416                g_free(hash); 
     
    560575        } 
    561576         
    562         // answer the call 
    563577        osync_context_report_success(ctx); 
    564  
    565         // blubb 
    566         /* 
    567         osync_trace(TRACE_INTERNAL, "change->hash: %s change->changetype: %i", osync_change_get_hash(change), 
    568                        osync_change_get_changetype(change)); 
    569         */ 
    570                         
    571         g_free(calnote); 
    572          
     578                                
    573579        // update hashtable 
    574580        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

    r2142 r2146  
    5656 
    5757        // Type 
    58         xmlfield = osync_xmlfield_new(xmlformat, "Category", error); 
     58        xmlfield = osync_xmlfield_new(xmlformat, "Categories", error); 
    5959        switch (cal->type) { 
    6060                case GN_CALNOTE_MEETING: 
     
    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); 
     
    289296} 
    290297 
     298static void _xmlfield_category(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     299{ 
     300        int i; 
     301        int numnodes = osync_xmlfield_get_key_count(xmlfield); 
     302        for (i=0; i < numnodes; i++) { 
     303                const char *category = osync_xmlfield_get_nth_key_value(xmlfield, i); 
     304 
     305                if (!strcasecmp(category, "Meeting")) 
     306                        calnote->type = GN_CALNOTE_MEETING; 
     307                else if (!strcasecmp(category, "Calling")) 
     308                        calnote->type = GN_CALNOTE_CALL; 
     309                else if (!strcasecmp(category, "Birthday")) 
     310                        calnote->type = GN_CALNOTE_BIRTHDAY; 
     311                else if (!strcasecmp(category, "Reminder")) 
     312                        calnote->type = GN_CALNOTE_REMINDER; 
     313                else if (!strcasecmp(category, "Memo")) 
     314                        calnote->type = GN_CALNOTE_MEMO; 
     315 
     316                else 
     317                        // When no known type was found it will check later 
     318                        // for a valid type.  
     319                        calnote->type = 0; 
     320 
     321        } 
     322} 
     323 
     324static void _xmlfield_datestarted(gn_calnote *calnote, OSyncXMLField *xmlfield, int *alldayevent) 
     325{ 
     326 
     327        const char *dtstart = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     328 
     329        struct tm *starttm = osync_time_vtime2tm(dtstart); 
     330        struct tm *tmptm = NULL; 
     331 
     332        if (!osync_time_isdate(dtstart) && osync_time_isutc(dtstart)) { 
     333                tmptm = starttm; 
     334                int offset = osync_time_timezone_diff(tmptm); 
     335                starttm = osync_time_tm2localtime(tmptm, offset); 
     336                g_free(tmptm); 
     337        } 
     338 
     339        calnote->time = gnokii_util_tm2timestamp(starttm); 
     340 
     341        g_free(starttm); 
     342 
     343        // Only 3 matches (=date) means all day event  
     344        if (osync_time_isdate(dtstart)) 
     345                *alldayevent = 1; 
     346 
     347        // Nokia cellphones cannot handle seconds in calendar - so set it to ZERO 
     348        calnote->time.second = 0; 
     349 
     350} 
     351 
     352void static _xmlfield_dateend(gn_calnote *calnote, OSyncXMLField *xmlfield) 
     353{ 
     354 
     355        const char *dtend = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     356 
     357 
     358        struct tm *endtm = osync_time_vtime2tm(dtend); 
     359        struct tm *tmptm = NULL; 
     360        if (!osync_time_isdate(dtend) && osync_time_isutc(dtend)) { 
     361                tmptm = endtm; 
     362                int offset = osync_time_timezone_diff(tmptm); 
     363                endtm = osync_time_tm2localtime(tmptm, offset); 
     364                g_free(tmptm); 
     365        } 
     366 
     367        calnote->end_time = gnokii_util_tm2timestamp(endtm); 
     368        g_free(endtm); 
     369 
     370        // Nokia cellphones cannot handle seconds in calendar so set it to ZERO 
     371        calnote->end_time.second = 0; 
     372 
     373} 
     374 
     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 
    291467/*  
    292468 * Converts from XMLFormat-event to the gnokii event object type (gn_calnote). 
     
    297473                        output, outpsize, config, free_input, error); 
    298474 
    299         osync_trace(TRACE_SENSITIVE, "Input XML is:\n%s", osxml_write_to_string((xmlDoc *)input)); 
    300  
    301         char *tmp; 
    302         struct tm *starttm = NULL, *endtm = NULL, *tmptm = NULL; 
    303         int offset = 0; 
     475        OSyncXMLFormat *xmlformat = (OSyncXMLFormat *)input; 
     476        unsigned int size; 
     477        char *str; 
     478        osync_xmlformat_assemble(xmlformat, &str, &size); 
     479        osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str); 
     480        g_free(str); 
     481 
     482//      struct tm *starttm = NULL, *endtm = NULL, *tmptm = NULL; 
    304483        osync_bool alldayevent = 0; 
    305         xmlNode *cur = NULL; 
    306         xmlNode *root = xmlDocGetRootElement((xmlDoc *)input); 
    307  
    308         if (!root) { 
    309                 osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get xml root element"); 
     484 
     485        if (strcmp("event", osync_xmlformat_get_objtype(xmlformat))) { 
     486                osync_error_set(error, OSYNC_ERROR_GENERIC, "Wrong xmlformat: %s",  osync_xmlformat_get_objtype(xmlformat)); 
    310487                goto error; 
    311488        } 
    312489 
    313         if (xmlStrcmp(root->name, (xmlChar *) "vcal")) { 
    314                 osync_error_set(error, OSYNC_ERROR_GENERIC, "Wrong (event) xml root element"); 
    315                 goto error; 
    316         } 
    317  
    318         // Event child 
    319         root = osxml_get_node(root, "Event"); 
    320  
    321490        // prepare calnote 
    322         gn_calnote *calnote = NULL; 
    323         calnote = (gn_calnote *) malloc(sizeof(gn_calnote)); 
    324  
    325         memset(calnote, 0, sizeof(gn_calnote)); 
    326  
    327         // Type 
    328         // TODO: handle more then one category - not only the first 
    329         cur = osxml_get_node(root, "Categories"); 
    330         if (cur) { 
    331  
    332                 tmp = (char *) xmlNodeGetContent(cur); 
    333  
    334                 if (!strcasecmp(tmp, "Meeting")) 
    335                         calnote->type = GN_CALNOTE_MEETING; 
    336                 else if (!strcasecmp(tmp, "Calling")) 
    337                         calnote->type = GN_CALNOTE_CALL; 
    338                 else if (!strcasecmp(tmp, "Birthday")) 
    339                         calnote->type = GN_CALNOTE_BIRTHDAY; 
    340                 else if (!strcasecmp(tmp, "Reminder")) 
    341                         calnote->type = GN_CALNOTE_REMINDER; 
    342                 else if (!strcasecmp(tmp, "Memo")) 
    343                         calnote->type = GN_CALNOTE_MEMO; 
    344  
    345                 else 
    346                         // When no known type was found it will check later 
    347                         // for a valid type.  
    348                         calnote->type = 0; 
    349  
    350                 g_free(tmp); 
    351         } 
    352  
    353         // DateStarted  
    354         cur = osxml_get_node(root, "DateStarted"); 
    355         if (cur) { 
    356  
    357                 tmp = osxml_find_node(cur, "Content"); 
    358  
    359                 /* 
    360                 ret = sscanf(tmp, "%04u%02u%02uT%02u%02u%02u", 
    361                                 &(calnote->time.year), 
    362                                 &(calnote->time.month), 
    363                                 &(calnote->time.day), 
    364                                 &(calnote->time.hour), 
    365                                 &(calnote->time.minute), 
    366                                 &(calnote->time.second)); 
    367                 */               
    368  
    369                 starttm = osync_time_vtime2tm(tmp); 
    370  
    371                 if (!osync_time_isdate(tmp) && osync_time_isutc(tmp)) { 
    372                         tmptm = starttm; 
    373                         offset = osync_time_timezone_diff(tmptm); 
    374                         starttm = osync_time_tm2localtime(tmptm, offset); 
    375                         g_free(tmptm); 
    376                 } 
    377  
    378                 calnote->time = gnokii_util_tm2timestamp(starttm); 
    379  
    380                 g_free(starttm); 
    381  
    382                 // Only 3 matches (=date) means all day event  
    383                 if (osync_time_isdate(tmp)) 
    384                         alldayevent = 1; 
    385  
    386                 g_free(tmp); 
    387                          
    388  
    389                 // Nokia cellphones cannot handle seconds in calendar - so set it to ZERO 
    390                 calnote->time.second = 0; 
    391         } 
     491        gn_calnote *calnote = osync_try_malloc0(sizeof(gn_calnote), error); 
     492 
     493        OSyncXMLField *xmlfield = osync_xmlformat_get_first_field(xmlformat); 
     494        for (; xmlfield; xmlfield = osync_xmlfield_get_next(xmlfield)) { 
     495                osync_trace(TRACE_INTERNAL, "Field: %s", osync_xmlfield_get_name(xmlfield)); 
     496 
     497                if (!strcmp("Categories", osync_xmlfield_get_name(xmlfield))) 
     498                        _xmlfield_category(calnote, xmlfield); 
     499                else if (!strcmp("DateStarted", osync_xmlfield_get_name(xmlfield))) 
     500                        _xmlfield_datestarted(calnote, xmlfield, &alldayevent); 
     501                else if (!strcmp("DateEnd", osync_xmlfield_get_name(xmlfield))) 
     502                        _xmlfield_dateend(calnote, xmlfield); 
     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); 
     513 
     514        } 
     515 
    392516                 
    393517 
    394         // DateEnd 
    395         cur = osxml_get_node(root, "DateEnd"); 
    396         if (cur) { 
    397  
    398                 tmp = osxml_find_node(cur, "Content"); 
    399  
    400                 endtm = osync_time_vtime2tm(tmp); 
    401                 if (!osync_time_isdate(tmp) && osync_time_isutc(tmp)) { 
    402                         tmptm = endtm; 
    403                         endtm = osync_time_tm2localtime(tmptm, offset); 
    404                         g_free(tmptm); 
    405                 } 
    406  
    407                 g_free(tmp); 
    408  
    409                 calnote->end_time = gnokii_util_tm2timestamp(endtm); 
    410  
    411                 g_free(endtm); 
    412  
    413                 // Nokia cellphones cannot handle seconds in calendar so set it to ZERO 
    414                 calnote->end_time.second = 0; 
    415         } 
    416  
    417         /* Alarm - TODO: is not fully supported 
    418          *              Not supported: 
    419          *              ^^^^^^^^^^^^^^ 
    420          *              # alarm after event 
    421          *              # alarm before event end 
    422          *              # ... 
    423          */ 
    424         cur = osxml_get_node(root, "Alarm"); 
    425         if (cur && calnote->time.year) { 
    426  
    427                 int seconds_before = 0; 
    428                 time_t start_timet, alarm_timet; 
    429  
    430                 calnote->alarm.enabled = 1; 
    431                  
    432                 tmp = osxml_find_node(cur, "AlarmAction"); 
    433                 if (tmp && !strcasecmp(tmp, "DISPLAY")) 
    434                         calnote->alarm.tone = 1; 
    435  
    436                 g_free(tmp); 
    437                  
    438                 // get AlarmTrigger root 
    439                 xmlNode *sub = osxml_get_node(cur, "AlarmTrigger"); 
    440  
    441                 // get node with iCal duration 
    442                 tmp = osxml_find_node(sub, "Content"); 
    443  
    444                 // convert iCal duration string into seconds (before event) 
    445                 seconds_before = gnokii_util_alarmevent2secs(tmp); 
    446  
    447                 g_free(tmp); 
    448                  
    449                 // convert start event in to seconds 
    450                 start_timet = gnokii_util_timestamp2unix(&(calnote->time)); 
    451  
    452                 // timestamp for alarm 
    453                 alarm_timet = start_timet - seconds_before; 
    454  
    455                 // convert timestamp of alarm to gnokii timestamp 
    456                 calnote->alarm.timestamp = gnokii_util_unix2timestamp(alarm_timet); 
    457         } 
    458  
    459         // Summary 
    460         cur = osxml_get_node(root, "Summary"); 
    461         if (cur) { 
    462                 tmp = (char *) xmlNodeGetContent(cur); 
    463                 strncpy(calnote->text, tmp, sizeof(calnote->text));  
    464                 g_free(tmp); 
    465         } 
    466  
    467         // meeting location 
    468         cur = osxml_get_node(root, "Location"); 
    469         if (cur) { 
    470                 tmp = (char *) xmlNodeGetContent(cur); 
    471  
    472                 if (calnote->type == GN_CALNOTE_MEETING && tmp) 
    473                         strncpy(calnote->mlocation, tmp, sizeof(calnote->mlocation)); 
    474  
    475                 g_free(tmp); 
    476         } 
    477  
    478         // PhoneNumber 
    479         cur = osxml_get_node(root, "Description"); 
    480         if (cur) { 
    481                 tmp = (char *) xmlNodeGetContent(cur); 
    482                 if (calnote->type == GN_CALNOTE_CALL || gnokii_util_valid_number(tmp)) 
    483                         strncpy(calnote->phone_number, tmp, sizeof(calnote->phone_number)); 
    484  
    485                 g_free(tmp); 
    486         } 
    487  
    488         // Reccurence 
    489         cur = osxml_get_node(root, "RecurrenceRule"); 
    490         if (cur) { 
    491                 int interval = 0; 
    492  
    493                 for (cur = cur->children; cur; cur = cur->next) { 
    494  
    495                         tmp = (char *) xmlNodeGetContent(cur); 
    496  
    497                         if (strstr(tmp, "DAILY")) 
    498                                 calnote->recurrence = GN_CALNOTE_DAILY; 
    499                         else if (strstr(tmp, "WEEKLY"))  
    500                                 calnote->recurrence = GN_CALNOTE_WEEKLY; 
    501                         else if (strstr(tmp, "MONTHLY")) 
    502                                 calnote->recurrence = GN_CALNOTE_MONTHLY; 
    503                         else if (strstr(tmp, "YEARLY")) 
    504                                 calnote->recurrence = GN_CALNOTE_YEARLY; 
    505  
    506                         else if (strstr(tmp, "INTERVAL")) 
    507                                 sscanf(tmp, "INTERVAL=%u", &interval); 
    508  
    509                         g_free(tmp); 
    510                 } 
    511  
    512                 // Nokia phones only support a interval of 2 for weeks 
    513                 if (calnote->recurrence == GN_CALNOTE_WEEKLY && interval == 2) 
    514                         calnote->recurrence = GN_CALNOTE_2WEEKLY; 
    515         } 
    516518 
    517519        // check for type which fits for given data if no type was set 
     
    519521                calnote->type = gnokii_util_calendar_type(calnote, alldayevent); 
    520522 
    521  
    522523        *free_input = TRUE; 
    523524        *output = (void *)calnote; 
     
    533534 
    534535 
    535 static void destroy_gnokii_event(char *input, size_t inpsize) 
     536static void destroy_gnokii_event(char *input, unsigned int inpsize) 
    536537{ 
    537538        osync_trace(TRACE_ENTRY, "%s(%p, %i)", __func__, input, inpsize); 
  • plugins/gnokii-sync/src/gnokii_calendar_utils.c

    r2142 r2146  
    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

    r2142 r2146  
    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.c

    r2145 r2146  
    158158                        if (error == GN_ERR_EMPTYLOCATION) { 
    159159                                osync_trace(TRACE_EXIT, "%s(): memorty_type: %i location: %i counter: %i", __func__, contact->memory_type, contact->location, i); 
     160                                g_free(data); 
    160161                                return contact; 
    161162                        } 
     
    166167        } 
    167168 
    168         // TODO set error and leave 
     169        g_free(data); 
     170        g_free(contact); 
    169171        osync_trace(TRACE_EXIT, "%s(): NO FREE LOCATION!", __func__); 
    170172        return NULL; 
     
    422424                        // prepare UID with gnokii-contact-<memory type>-<memory location> 
    423425                        uid = gnokii_contact_uid(contact); 
     426                        osync_hashtable_report(sinkenv->hashtable, uid); 
    424427 
    425428                        hash = gnokii_contact_hash(contact); 
     
    473476        g_free(data); 
    474477 
    475  
    476         /* FIXME: this is really really broken :(  
    477478        int i; 
    478  
    479479        char **uids = osync_hashtable_get_deleted(sinkenv->hashtable); 
    480480        for (i = 0; uids[i]; i++) { 
     
    511511        } 
    512512        g_free(uids); 
    513         */ 
    514513 
    515514        osync_context_report_success(ctx); 
     
    528527        OSyncError *error = NULL; 
    529528        gn_phonebook_entry *contact = NULL; 
     529        char *buf; 
    530530        char *uid = NULL; 
    531531        char *hash = NULL; 
     
    536536 
    537537        // Get changed contact note 
    538         contact = (gn_phonebook_entry *) osync_change_get_data(change); 
     538        osync_data_get_data(osync_change_get_data(change), &buf, NULL); 
     539        contact = (gn_phonebook_entry *) buf; 
    539540 
    540541        // Check for type of changes 
  • plugins/gnokii-sync/src/gnokii_contact_format.c

    r2145 r2146  
    5353 
    5454        // Name 
    55         if (contact->name) { 
     55        if (strlen(contact->name)) { 
    5656 
    5757                xmlfield = osync_xmlfield_new(xmlformat, "FormattedName", error); 
     
    5959 
    6060                // FIXME: evo2 workaround - evo2 requires a Name / N filed :( 
     61                /* 
    6162                xmlfield = osync_xmlfield_new(xmlformat, "Name", error); 
    6263                osync_xmlfield_set_key_value(xmlfield, "FirstName", contact->name); 
     64                */ 
    6365        } 
    6466 
     
    216218} 
    217219 
     220static void _xmlfield_formattedname(gn_phonebook_entry *contact, OSyncXMLField *xmlfield) 
     221{ 
     222        const char *name = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     223        strncpy(contact->name, name, GN_PHONEBOOK_NAME_MAX_LENGTH); 
     224} 
     225 
     226static void _xmlfield_telephone(gn_phonebook_entry *contact, OSyncXMLField *xmlfield, int *subcount) 
     227{ 
     228        const char *tele = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     229 
     230        char *number = gnokii_contact_util_cleannumber(tele); 
     231        strncpy(contact->subentries[*subcount].data.number, number, GN_PHONEBOOK_NAME_MAX_LENGTH); 
     232        g_free(number); 
     233 
     234        contact->subentries[*subcount].entry_type = GN_PHONEBOOK_ENTRY_Number; 
     235 
     236        const char *type = osync_xmlfield_get_attr(xmlfield, "Type"); 
     237        const char *location = osync_xmlfield_get_attr(xmlfield, "Location"); 
     238 
     239        if (location && !strcasecmp(location, "Work")) 
     240                contact->subentries[*subcount].number_type = GN_PHONEBOOK_NUMBER_Work;  
     241        else if (location && !strcasecmp(location, "Home")) 
     242                contact->subentries[*subcount].number_type = GN_PHONEBOOK_NUMBER_Home;  
     243        else if (type && !strcasecmp(type, "Fax")) 
     244                contact->subentries[*subcount].number_type = GN_PHONEBOOK_NUMBER_Fax;  
     245        else if (type && !strcasecmp(type, "Cellular")) 
     246                contact->subentries[*subcount].number_type = GN_PHONEBOOK_NUMBER_Mobile;  
     247        else 
     248                contact->subentries[*subcount].number_type = GN_PHONEBOOK_NUMBER_General; 
     249 
     250        (*subcount)++; 
     251} 
     252 
     253static void _xmlfield_url(gn_phonebook_entry *contact, OSyncXMLField *xmlfield, int *subcount) 
     254{ 
     255        const char *url = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     256 
     257        contact->subentries[*subcount].entry_type = GN_PHONEBOOK_ENTRY_URL; 
     258        strncpy(contact->subentries[*subcount].data.number, url, GN_PHONEBOOK_NAME_MAX_LENGTH); 
     259        (*subcount)++; 
     260} 
     261 
     262static void _xmlfield_email(gn_phonebook_entry *contact, OSyncXMLField *xmlfield, int *subcount) 
     263{ 
     264        const char *email = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     265        contact->subentries[*subcount].entry_type = GN_PHONEBOOK_ENTRY_Email; 
     266        strncpy(contact->subentries[*subcount].data.number, email, GN_PHONEBOOK_NAME_MAX_LENGTH); 
     267 
     268        (*subcount)++; 
     269} 
     270 
     271static void _xmlfield_note(gn_phonebook_entry *contact, OSyncXMLField *xmlfield, int *subcount) 
     272{ 
     273        const char *note = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     274 
     275        contact->subentries[*subcount].entry_type = GN_PHONEBOOK_ENTRY_Note; 
     276        strncpy(contact->subentries[*subcount].data.number, note, GN_PHONEBOOK_NAME_MAX_LENGTH); 
     277        (*subcount)++; 
     278} 
     279 
     280static void _xmlfield_addresslabel(gn_phonebook_entry *contact, OSyncXMLField *xmlfield, int *subcount) 
     281{ 
     282        const char *label = osync_xmlfield_get_key_value(xmlfield, "Content"); 
     283        contact->subentries[*subcount].entry_type = GN_PHONEBOOK_ENTRY_Postal; 
     284        strncpy(contact->subentries[*subcount].data.number, label, GN_PHONEBOOK_NAME_MAX_LENGTH);  
     285        (*subcount)++; 
     286} 
     287 
     288static void _xmlfield_category(gn_phonebook_entry *contact, OSyncXMLField *xmlfield) 
     289{ 
     290        contact->caller_group = GN_PHONEBOOK_GROUP_None;  
     291 
     292        int i; 
     293        int numnodes = osync_xmlfield_get_key_count(xmlfield); 
     294        for (i=0; i < numnodes; i++) { 
     295                const char *category = osync_xmlfield_get_nth_key_value(xmlfield, i); 
     296                 
     297                if (!strcasecmp(category, "FAMILY")) { 
     298                        contact->caller_group = GN_PHONEBOOK_GROUP_Family;  
     299                } else if (!strcasecmp(category, "VIPS") || !strcasecmp(category, "VIP")) { // FIXME: evo2-sync workaround fix that in vformat plugin 
     300                        contact->caller_group = GN_PHONEBOOK_GROUP_Vips; 
     301                } else if (!strcasecmp(category, "FRIENDS")) { 
     302                        contact->caller_group = GN_PHONEBOOK_GROUP_Friends; 
     303                } else if (!strcasecmp(category, "WORK")) { 
     304                        contact->caller_group = GN_PHONEBOOK_GROUP_Work; 
     305                } else if (!strcasecmp(category, "OTHERS")) { 
     306                        contact->caller_group = GN_PHONEBOOK_GROUP_Others; 
     307                } 
     308 
     309        } 
     310} 
     311 
     312 
     313 
    218314/*  
    219315 * Converts from XML to the gnokii contact object type (gn_phonebook_entry). 
     
    224320                        output, outpsize, free_input, config, error); 
    225321 
    226         osync_trace(TRACE_SENSITIVE, "Input XML is:\n%s", osxml_write_to_string((xmlDoc *)input)); 
    227  
    228         char *tmp = NULL, *number = NULL; 
    229         xmlNode *cur = NULL; 
    230         xmlNode *sub = NULL; 
    231         xmlNode *root = xmlDocGetRootElement((xmlDoc *)input); 
    232         xmlXPathObject *xobj = NULL;  
    233         xmlNodeSet *nodes = NULL;  
    234         int numnodes = 0; 
     322        OSyncXMLFormat *xmlformat = (OSyncXMLFormat *)input; 
     323        unsigned int size; 
     324        char *str; 
     325        osync_xmlformat_assemble(xmlformat, &str, &size); 
     326        osync_trace(TRACE_INTERNAL, "Input XMLFormat is:\n%s", str); 
     327        g_free(str); 
     328 
    235329        int subcount = 0; 
    236         int i; 
    237  
    238  
    239         if (!root) { 
    240                 osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to get xml root element"); 
     330 
     331        // prepare contact  
     332        gn_phonebook_entry *contact = osync_try_malloc0(sizeof(gn_phonebook_entry), error); 
     333 
     334        if (strcmp("contact", osync_xmlformat_get_objtype(xmlformat))) { 
     335                osync_error_set(error, OSYNC_ERROR_GENERIC, "Wrong xmlformat: %s",  osync_xmlformat_get_objtype(xmlformat)); 
    241336                goto error; 
    242337        } 
    243338 
    244         if (xmlStrcmp(root->name, (const xmlChar *) "contact")) { 
    245                 osync_error_set(error, OSYNC_ERROR_GENERIC, "Wrong (contact) xml root element"); 
    246                 goto error; 
    247         } 
    248  
    249         // prepare contact  
    250         gn_phonebook_entry *contact = NULL; 
    251         contact = (gn_phonebook_entry *) malloc(sizeof(gn_phonebook_entry)); 
    252  
    253         memset(contact, 0, sizeof(gn_phonebook_entry)); 
    254  
    255         // FormattedName - XXX Also Node "Name"? 
    256          cur = osxml_get_node(root, "FormattedName"); 
    257          if (cur) { 
    258                  tmp = (char *) xmlNodeGetContent(cur); 
    259                  strncpy(contact->name, tmp, GN_PHONEBOOK_