| | 375 | void 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 | |
|---|
| | 419 | void 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 | |
|---|
| | 425 | void 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 | |
|---|
| | 432 | void 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 | |
|---|
| | 440 | void 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 | |
|---|
| 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); |
|---|
| 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 | | */ |
|---|