summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontact.cpp29
-rw-r--r--libopie2/opiepim/ocontact.cpp29
2 files changed, 42 insertions, 16 deletions
diff --git a/libopie/pim/ocontact.cpp b/libopie/pim/ocontact.cpp
index 734f5a2..bf27d0f 100644
--- a/libopie/pim/ocontact.cpp
+++ b/libopie/pim/ocontact.cpp
@@ -382,390 +382,390 @@ OContact::~OContact()
382 382
383/*! \fn QString OContact::nickname() const 383/*! \fn QString OContact::nickname() const
384 Returns the nickname of the contact. 384 Returns the nickname of the contact.
385*/ 385*/
386 386
387/*! \fn QString OContact::children() const 387/*! \fn QString OContact::children() const
388 Returns the children of the contact. 388 Returns the children of the contact.
389*/ 389*/
390 390
391/*! \fn QString OContact::notes() const 391/*! \fn QString OContact::notes() const
392 Returns the notes relating to the the contact. 392 Returns the notes relating to the the contact.
393*/ 393*/
394 394
395/*! \fn QString OContact::groups() const 395/*! \fn QString OContact::groups() const
396 \internal 396 \internal
397 Returns the groups for the contact. 397 Returns the groups for the contact.
398*/ 398*/
399 399
400/*! \fn QStringList OContact::groupList() const 400/*! \fn QStringList OContact::groupList() const
401 \internal 401 \internal
402*/ 402*/
403 403
404/*! \fn QString OContact::field(int) const 404/*! \fn QString OContact::field(int) const
405 \internal 405 \internal
406*/ 406*/
407 407
408/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null ) 408/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null )
409 \internal 409 \internal
410*/ 410*/
411 411
412/*! \fn void OContact::setUid( int id ) 412/*! \fn void OContact::setUid( int id )
413 \internal 413 \internal
414 Sets the uid for this record to \a id. 414 Sets the uid for this record to \a id.
415*/ 415*/
416 416
417/*! \enum OContact::journal_action 417/*! \enum OContact::journal_action
418 \internal 418 \internal
419*/ 419*/
420 420
421/*! 421/*!
422 \internal 422 \internal
423*/ 423*/
424QMap<int, QString> OContact::toMap() const 424QMap<int, QString> OContact::toMap() const
425{ 425{
426 QMap<int, QString> map = mMap; 426 QMap<int, QString> map = mMap;
427 QString cats = idsToString( categories() ); 427 QString cats = idsToString( categories() );
428 if ( !cats.isEmpty() ) 428 if ( !cats.isEmpty() )
429 map.insert( Qtopia::AddressCategory, cats ); 429 map.insert( Qtopia::AddressCategory, cats );
430 return map; 430 return map;
431} 431}
432 432
433/*! 433/*!
434 Returns a rich text formatted QString representing the contents the contact. 434 Returns a rich text formatted QString representing the contents the contact.
435*/ 435*/
436QString OContact::toRichText() const 436QString OContact::toRichText() const
437{ 437{
438 QString text; 438 QString text;
439 QString value, comp, state; 439 QString value, comp, state;
440 440
441 // name, jobtitle and company 441 // name, jobtitle and company
442 if ( !(value = fullName()).isEmpty() ) 442 if ( !(value = fullName()).isEmpty() )
443 text += "<b>" + Qtopia::escapeString(value) + "</b><br>"; 443 text += "<b>" + Qtopia::escapeString(value) + "</b><br>";
444 if ( !(value = jobTitle()).isEmpty() ) 444 if ( !(value = jobTitle()).isEmpty() )
445 text += Qtopia::escapeString(value) + "<br>"; 445 text += Qtopia::escapeString(value) + "<br>";
446 446
447 comp = company(); 447 comp = company();
448 if ( !(value = department()).isEmpty() ) { 448 if ( !(value = department()).isEmpty() ) {
449 text += Qtopia::escapeString(value); 449 text += Qtopia::escapeString(value);
450 if ( comp ) 450 if ( comp )
451 text += ", "; 451 text += ", ";
452 else 452 else
453 text += "<br>"; 453 text += "<br>";
454 } 454 }
455 if ( !comp.isEmpty() ) 455 if ( !comp.isEmpty() )
456 text += Qtopia::escapeString(comp) + "<br>"; 456 text += Qtopia::escapeString(comp) + "<br>";
457 457
458 // business address 458 // business address
459 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 459 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
460 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 460 !businessZip().isEmpty() || !businessCountry().isEmpty() ) {
461 text += "<br>"; 461 text += "<br>";
462 text += QObject::tr( "<b>Work Address:</b>" ); 462 text += QObject::tr( "<b>Work Address:</b>" );
463 text += "<br>"; 463 text += "<br>";
464 } 464 }
465 465
466 if ( !(value = businessStreet()).isEmpty() ) 466 if ( !(value = businessStreet()).isEmpty() )
467 text += Qtopia::escapeString(value) + "<br>"; 467 text += Qtopia::escapeString(value) + "<br>";
468 state = businessState(); 468 state = businessState();
469 if ( !(value = businessCity()).isEmpty() ) { 469 if ( !(value = businessCity()).isEmpty() ) {
470 text += Qtopia::escapeString(value); 470 text += Qtopia::escapeString(value);
471 if ( state ) 471 if ( state )
472 text += ", " + Qtopia::escapeString(state); 472 text += ", " + Qtopia::escapeString(state);
473 text += "<br>"; 473 text += "<br>";
474 } else if ( !state.isEmpty() ) 474 } else if ( !state.isEmpty() )
475 text += Qtopia::escapeString(state) + "<br>"; 475 text += Qtopia::escapeString(state) + "<br>";
476 if ( !(value = businessZip()).isEmpty() ) 476 if ( !(value = businessZip()).isEmpty() )
477 text += Qtopia::escapeString(value) + "<br>"; 477 text += Qtopia::escapeString(value) + "<br>";
478 if ( !(value = businessCountry()).isEmpty() ) 478 if ( !(value = businessCountry()).isEmpty() )
479 text += Qtopia::escapeString(value) + "<br>"; 479 text += Qtopia::escapeString(value) + "<br>";
480 480
481 // home address 481 // home address
482 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 482 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
483 !homeZip().isEmpty() || !homeCountry().isEmpty() ) { 483 !homeZip().isEmpty() || !homeCountry().isEmpty() ) {
484 text += "<br>"; 484 text += "<br>";
485 text += QObject::tr( "<b>Home Address:</b>" ); 485 text += QObject::tr( "<b>Home Address:</b>" );
486 text += "<br>"; 486 text += "<br>";
487 } 487 }
488 488
489 if ( !(value = homeStreet()).isEmpty() ) 489 if ( !(value = homeStreet()).isEmpty() )
490 text += Qtopia::escapeString(value) + "<br>"; 490 text += Qtopia::escapeString(value) + "<br>";
491 state = homeState(); 491 state = homeState();
492 if ( !(value = homeCity()).isEmpty() ) { 492 if ( !(value = homeCity()).isEmpty() ) {
493 text += Qtopia::escapeString(value); 493 text += Qtopia::escapeString(value);
494 if ( !state.isEmpty() ) 494 if ( !state.isEmpty() )
495 text += ", " + Qtopia::escapeString(state); 495 text += ", " + Qtopia::escapeString(state);
496 text += "<br>"; 496 text += "<br>";
497 } else if (!state.isEmpty()) 497 } else if (!state.isEmpty())
498 text += Qtopia::escapeString(state) + "<br>"; 498 text += Qtopia::escapeString(state) + "<br>";
499 if ( !(value = homeZip()).isEmpty() ) 499 if ( !(value = homeZip()).isEmpty() )
500 text += Qtopia::escapeString(value) + "<br>"; 500 text += Qtopia::escapeString(value) + "<br>";
501 if ( !(value = homeCountry()).isEmpty() ) 501 if ( !(value = homeCountry()).isEmpty() )
502 text += Qtopia::escapeString(value) + "<br>"; 502 text += Qtopia::escapeString(value) + "<br>";
503 503
504 // the others... 504 // the others...
505 QString str; 505 QString str;
506 str = emails(); 506 str = emails();
507 if ( !str.isEmpty() ) 507 if ( !str.isEmpty() )
508 text += "<b>" + QObject::tr("Email Addresses: ") + "</b>" 508 text += "<b>" + QObject::tr("Email Addresses: ") + "</b>"
509 + Qtopia::escapeString(str) + "<br>"; 509 + Qtopia::escapeString(str) + "<br>";
510 str = homePhone(); 510 str = homePhone();
511 if ( !str.isEmpty() ) 511 if ( !str.isEmpty() )
512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>"
513 + Qtopia::escapeString(str) + "<br>"; 513 + Qtopia::escapeString(str) + "<br>";
514 str = homeFax(); 514 str = homeFax();
515 if ( !str.isEmpty() ) 515 if ( !str.isEmpty() )
516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>"
517 + Qtopia::escapeString(str) + "<br>"; 517 + Qtopia::escapeString(str) + "<br>";
518 str = homeMobile(); 518 str = homeMobile();
519 if ( !str.isEmpty() ) 519 if ( !str.isEmpty() )
520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>"
521 + Qtopia::escapeString(str) + "<br>"; 521 + Qtopia::escapeString(str) + "<br>";
522 str = homeWebpage(); 522 str = homeWebpage();
523 if ( !str.isEmpty() ) 523 if ( !str.isEmpty() )
524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>"
525 + Qtopia::escapeString(str) + "<br>"; 525 + Qtopia::escapeString(str) + "<br>";
526 str = businessWebpage(); 526 str = businessWebpage();
527 if ( !str.isEmpty() ) 527 if ( !str.isEmpty() )
528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>"
529 + Qtopia::escapeString(str) + "<br>"; 529 + Qtopia::escapeString(str) + "<br>";
530 str = office(); 530 str = office();
531 if ( !str.isEmpty() ) 531 if ( !str.isEmpty() )
532 text += "<b>" + QObject::tr("Office: ") + "</b>" 532 text += "<b>" + QObject::tr("Office: ") + "</b>"
533 + Qtopia::escapeString(str) + "<br>"; 533 + Qtopia::escapeString(str) + "<br>";
534 str = businessPhone(); 534 str = businessPhone();
535 if ( !str.isEmpty() ) 535 if ( !str.isEmpty() )
536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>"
537 + Qtopia::escapeString(str) + "<br>"; 537 + Qtopia::escapeString(str) + "<br>";
538 str = businessFax(); 538 str = businessFax();
539 if ( !str.isEmpty() ) 539 if ( !str.isEmpty() )
540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>"
541 + Qtopia::escapeString(str) + "<br>"; 541 + Qtopia::escapeString(str) + "<br>";
542 str = businessMobile(); 542 str = businessMobile();
543 if ( !str.isEmpty() ) 543 if ( !str.isEmpty() )
544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>"
545 + Qtopia::escapeString(str) + "<br>"; 545 + Qtopia::escapeString(str) + "<br>";
546 str = businessPager(); 546 str = businessPager();
547 if ( !str.isEmpty() ) 547 if ( !str.isEmpty() )
548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
549 + Qtopia::escapeString(str) + "<br>"; 549 + Qtopia::escapeString(str) + "<br>";
550 str = profession(); 550 str = profession();
551 if ( !str.isEmpty() ) 551 if ( !str.isEmpty() )
552 text += "<b>" + QObject::tr("Profession: ") + "</b>" 552 text += "<b>" + QObject::tr("Profession: ") + "</b>"
553 + Qtopia::escapeString(str) + "<br>"; 553 + Qtopia::escapeString(str) + "<br>";
554 str = assistant(); 554 str = assistant();
555 if ( !str.isEmpty() ) 555 if ( !str.isEmpty() )
556 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 556 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
557 + Qtopia::escapeString(str) + "<br>"; 557 + Qtopia::escapeString(str) + "<br>";
558 str = manager(); 558 str = manager();
559 if ( !str.isEmpty() ) 559 if ( !str.isEmpty() )
560 text += "<b>" + QObject::tr("Manager: ") + "</b>" 560 text += "<b>" + QObject::tr("Manager: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 561 + Qtopia::escapeString(str) + "<br>";
562 str = gender(); 562 str = gender();
563 if ( !str.isEmpty() && str.toInt() != 0 ) { 563 if ( !str.isEmpty() && str.toInt() != 0 ) {
564 if ( str.toInt() == 1 ) 564 if ( str.toInt() == 1 )
565 str = QObject::tr( "Male" ); 565 str = QObject::tr( "Male" );
566 else if ( str.toInt() == 2 ) 566 else if ( str.toInt() == 2 )
567 str = QObject::tr( "Female" ); 567 str = QObject::tr( "Female" );
568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
569 } 569 }
570 str = spouse(); 570 str = spouse();
571 if ( !str.isEmpty() ) 571 if ( !str.isEmpty() )
572 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 572 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 573 + Qtopia::escapeString(str) + "<br>";
574 if ( !birthday().isNull() ){ 574 if ( !birthday().isValid() ){
575 str = TimeString::numberDateString( birthday() ); 575 str = TimeString::numberDateString( birthday() );
576 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 576 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
577 + Qtopia::escapeString(str) + "<br>"; 577 + Qtopia::escapeString(str) + "<br>";
578 } 578 }
579 if ( !anniversary().isNull() ){ 579 if ( !anniversary().isValid() ){
580 str = TimeString::numberDateString( anniversary() ); 580 str = TimeString::numberDateString( anniversary() );
581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
582 + Qtopia::escapeString(str) + "<br>"; 582 + Qtopia::escapeString(str) + "<br>";
583 } 583 }
584 str = nickname(); 584 str = nickname();
585 if ( !str.isEmpty() ) 585 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 586 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 587 + Qtopia::escapeString(str) + "<br>";
588 588
589 // notes last 589 // notes last
590 if ( (value = notes()) ) { 590 if ( (value = notes()) ) {
591 QRegExp reg("\n"); 591 QRegExp reg("\n");
592 592
593 //QString tmp = Qtopia::escapeString(value); 593 //QString tmp = Qtopia::escapeString(value);
594 QString tmp = QStyleSheet::convertFromPlainText(value); 594 QString tmp = QStyleSheet::convertFromPlainText(value);
595 //tmp.replace( reg, "<br>" ); 595 //tmp.replace( reg, "<br>" );
596 text += "<br>" + tmp + "<br>"; 596 text += "<br>" + tmp + "<br>";
597 } 597 }
598 return text; 598 return text;
599} 599}
600 600
601/*! 601/*!
602 \internal 602 \internal
603*/ 603*/
604void OContact::insert( int key, const QString &v ) 604void OContact::insert( int key, const QString &v )
605{ 605{
606 QString value = v.stripWhiteSpace(); 606 QString value = v.stripWhiteSpace();
607 if ( value.isEmpty() ) 607 if ( value.isEmpty() )
608 mMap.remove( key ); 608 mMap.remove( key );
609 else 609 else
610 mMap.insert( key, value ); 610 mMap.insert( key, value );
611} 611}
612 612
613/*! 613/*!
614 \internal 614 \internal
615*/ 615*/
616void OContact::replace( int key, const QString & v ) 616void OContact::replace( int key, const QString & v )
617{ 617{
618 QString value = v.stripWhiteSpace(); 618 QString value = v.stripWhiteSpace();
619 if ( value.isEmpty() ) 619 if ( value.isEmpty() )
620 mMap.remove( key ); 620 mMap.remove( key );
621 else 621 else
622 mMap.replace( key, value ); 622 mMap.replace( key, value );
623} 623}
624 624
625/*! 625/*!
626 \internal 626 \internal
627*/ 627*/
628QString OContact::find( int key ) const 628QString OContact::find( int key ) const
629{ 629{
630 return mMap[key]; 630 return mMap[key];
631} 631}
632 632
633/*! 633/*!
634 \internal 634 \internal
635*/ 635*/
636QString OContact::displayAddress( const QString &street, 636QString OContact::displayAddress( const QString &street,
637 const QString &city, 637 const QString &city,
638 const QString &state, 638 const QString &state,
639 const QString &zip, 639 const QString &zip,
640 const QString &country ) const 640 const QString &country ) const
641{ 641{
642 QString s = street; 642 QString s = street;
643 if ( !street.isEmpty() ) 643 if ( !street.isEmpty() )
644 s+= "\n"; 644 s+= "\n";
645 s += city; 645 s += city;
646 if ( !city.isEmpty() && !state.isEmpty() ) 646 if ( !city.isEmpty() && !state.isEmpty() )
647 s += ", "; 647 s += ", ";
648 s += state; 648 s += state;
649 if ( !state.isEmpty() && !zip.isEmpty() ) 649 if ( !state.isEmpty() && !zip.isEmpty() )
650 s += " "; 650 s += " ";
651 s += zip; 651 s += zip;
652 if ( !country.isEmpty() && !s.isEmpty() ) 652 if ( !country.isEmpty() && !s.isEmpty() )
653 s += "\n"; 653 s += "\n";
654 s += country; 654 s += country;
655 return s; 655 return s;
656} 656}
657 657
658/*! 658/*!
659 \internal 659 \internal
660*/ 660*/
661QString OContact::displayBusinessAddress() const 661QString OContact::displayBusinessAddress() const
662{ 662{
663 return displayAddress( businessStreet(), businessCity(), 663 return displayAddress( businessStreet(), businessCity(),
664 businessState(), businessZip(), 664 businessState(), businessZip(),
665 businessCountry() ); 665 businessCountry() );
666} 666}
667 667
668/*! 668/*!
669 \internal 669 \internal
670*/ 670*/
671QString OContact::displayHomeAddress() const 671QString OContact::displayHomeAddress() const
672{ 672{
673 return displayAddress( homeStreet(), homeCity(), 673 return displayAddress( homeStreet(), homeCity(),
674 homeState(), homeZip(), 674 homeState(), homeZip(),
675 homeCountry() ); 675 homeCountry() );
676} 676}
677 677
678/*! 678/*!
679 Returns the full name of the contact 679 Returns the full name of the contact
680*/ 680*/
681QString OContact::fullName() const 681QString OContact::fullName() const
682{ 682{
683 QString title = find( Qtopia::Title ); 683 QString title = find( Qtopia::Title );
684 QString firstName = find( Qtopia::FirstName ); 684 QString firstName = find( Qtopia::FirstName );
685 QString middleName = find( Qtopia::MiddleName ); 685 QString middleName = find( Qtopia::MiddleName );
686 QString lastName = find( Qtopia::LastName ); 686 QString lastName = find( Qtopia::LastName );
687 QString suffix = find( Qtopia::Suffix ); 687 QString suffix = find( Qtopia::Suffix );
688 688
689 QString name = title; 689 QString name = title;
690 if ( !firstName.isEmpty() ) { 690 if ( !firstName.isEmpty() ) {
691 if ( !name.isEmpty() ) 691 if ( !name.isEmpty() )
692 name += " "; 692 name += " ";
693 name += firstName; 693 name += firstName;
694 } 694 }
695 if ( !middleName.isEmpty() ) { 695 if ( !middleName.isEmpty() ) {
696 if ( !name.isEmpty() ) 696 if ( !name.isEmpty() )
697 name += " "; 697 name += " ";
698 name += middleName; 698 name += middleName;
699 } 699 }
700 if ( !lastName.isEmpty() ) { 700 if ( !lastName.isEmpty() ) {
701 if ( !name.isEmpty() ) 701 if ( !name.isEmpty() )
702 name += " "; 702 name += " ";
703 name += lastName; 703 name += lastName;
704 } 704 }
705 if ( !suffix.isEmpty() ) { 705 if ( !suffix.isEmpty() ) {
706 if ( !name.isEmpty() ) 706 if ( !name.isEmpty() )
707 name += " "; 707 name += " ";
708 name += suffix; 708 name += suffix;
709 } 709 }
710 return name.simplifyWhiteSpace(); 710 return name.simplifyWhiteSpace();
711} 711}
712 712
713/*! 713/*!
714 Returns a list of the names of the children of the contact. 714 Returns a list of the names of the children of the contact.
715*/ 715*/
716QStringList OContact::childrenList() const 716QStringList OContact::childrenList() const
717{ 717{
718 return QStringList::split( " ", find( Qtopia::Children ) ); 718 return QStringList::split( " ", find( Qtopia::Children ) );
719} 719}
720 720
721/*! \fn void OContact::insertEmail( const QString &email ) 721/*! \fn void OContact::insertEmail( const QString &email )
722 722
723 Insert \a email into the email list. Ensures \a email can only be added 723 Insert \a email into the email list. Ensures \a email can only be added
724 once. If there is no default email address set, it sets it to the \a email. 724 once. If there is no default email address set, it sets it to the \a email.
725*/ 725*/
726 726
727/*! \fn void OContact::removeEmail( const QString &email ) 727/*! \fn void OContact::removeEmail( const QString &email )
728 728
729 Removes the \a email from the email list. If the default email was \a email, 729 Removes the \a email from the email list. If the default email was \a email,
730 then the default email address is assigned to the first email in the 730 then the default email address is assigned to the first email in the
731 email list 731 email list
732*/ 732*/
733 733
734/*! \fn void OContact::clearEmails() 734/*! \fn void OContact::clearEmails()
735 735
736 Clears the email list. 736 Clears the email list.
737 */ 737 */
738 738
739/*! \fn void OContact::insertEmails( const QStringList &emailList ) 739/*! \fn void OContact::insertEmails( const QStringList &emailList )
740 740
741 Appends the \a emailList to the exiting email list 741 Appends the \a emailList to the exiting email list
742 */ 742 */
743 743
744/*! 744/*!
745 Returns a list of email addresses belonging to the contact, including 745 Returns a list of email addresses belonging to the contact, including
746 the default email address. 746 the default email address.
747*/ 747*/
748QStringList OContact::emailList() const 748QStringList OContact::emailList() const
749{ 749{
750 QString emailStr = emails(); 750 QString emailStr = emails();
751 751
752 QStringList r; 752 QStringList r;
753 if ( !emailStr.isEmpty() ) { 753 if ( !emailStr.isEmpty() ) {
754 qDebug(" emailstr "); 754 qDebug(" emailstr ");
755 QStringList l = QStringList::split( emailSeparator(), emailStr ); 755 QStringList l = QStringList::split( emailSeparator(), emailStr );
756 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) 756 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
757 r += (*it).simplifyWhiteSpace(); 757 r += (*it).simplifyWhiteSpace();
758 } 758 }
759 759
760 return r; 760 return r;
761} 761}
762 762
763/*! 763/*!
764 \overload 764 \overload
765 765
766 Generates the string for the contact to be filed as from the first, 766 Generates the string for the contact to be filed as from the first,
767 middle and last name of the contact. 767 middle and last name of the contact.
768*/ 768*/
769void OContact::setFileAs() 769void OContact::setFileAs()
770{ 770{
771 QString lastName, firstName, middleName, fileas; 771 QString lastName, firstName, middleName, fileas;
@@ -934,428 +934,441 @@ QStringList OContact::trfields()
934 list.append( QObject::tr( "Children" ) ); 934 list.append( QObject::tr( "Children" ) );
935 935
936 list.append( QObject::tr( "Notes" ) ); 936 list.append( QObject::tr( "Notes" ) );
937 list.append( QObject::tr( "Groups" ) ); 937 list.append( QObject::tr( "Groups" ) );
938 938
939 return list; 939 return list;
940} 940}
941 941
942/*! 942/*!
943 \internal 943 \internal
944 Returns an untranslated list of field names for a contact. 944 Returns an untranslated list of field names for a contact.
945*/ 945*/
946QStringList OContact::untrfields() 946QStringList OContact::untrfields()
947{ 947{
948 QStringList list; 948 QStringList list;
949 949
950 list.append( "Name Title" ); 950 list.append( "Name Title" );
951 list.append( "First Name" ); 951 list.append( "First Name" );
952 list.append( "Middle Name" ); 952 list.append( "Middle Name" );
953 list.append( "Last Name" ); 953 list.append( "Last Name" );
954 list.append( "Suffix" ); 954 list.append( "Suffix" );
955 list.append( "File As" ); 955 list.append( "File As" );
956 956
957 list.append( "Job Title" ); 957 list.append( "Job Title" );
958 list.append( "Department" ); 958 list.append( "Department" );
959 list.append( "Company" ); 959 list.append( "Company" );
960 list.append( "Business Phone" ); 960 list.append( "Business Phone" );
961 list.append( "Business Fax" ); 961 list.append( "Business Fax" );
962 list.append( "Business Mobile" ); 962 list.append( "Business Mobile" );
963 963
964 list.append( "Default Email" ); 964 list.append( "Default Email" );
965 list.append( "Emails" ); 965 list.append( "Emails" );
966 966
967 list.append( "Home Phone" ); 967 list.append( "Home Phone" );
968 list.append( "Home Fax" ); 968 list.append( "Home Fax" );
969 list.append( "Home Mobile" ); 969 list.append( "Home Mobile" );
970 970
971 list.append( "Business Street" ); 971 list.append( "Business Street" );
972 list.append( "Business City" ); 972 list.append( "Business City" );
973 list.append( "Business State" ); 973 list.append( "Business State" );
974 list.append( "Business Zip" ); 974 list.append( "Business Zip" );
975 list.append( "Business Country" ); 975 list.append( "Business Country" );
976 list.append( "Business Pager" ); 976 list.append( "Business Pager" );
977 list.append( "Business WebPage" ); 977 list.append( "Business WebPage" );
978 978
979 list.append( "Office" ); 979 list.append( "Office" );
980 list.append( "Profession" ); 980 list.append( "Profession" );
981 list.append( "Assistant" ); 981 list.append( "Assistant" );
982 list.append( "Manager" ); 982 list.append( "Manager" );
983 983
984 list.append( "Home Street" ); 984 list.append( "Home Street" );
985 list.append( "Home City" ); 985 list.append( "Home City" );
986 list.append( "Home State" ); 986 list.append( "Home State" );
987 list.append( "Home Zip" ); 987 list.append( "Home Zip" );
988 list.append( "Home Country" ); 988 list.append( "Home Country" );
989 list.append( "Home Web Page" ); 989 list.append( "Home Web Page" );
990 990
991 list.append( "Spouse" ); 991 list.append( "Spouse" );
992 list.append( "Gender" ); 992 list.append( "Gender" );
993 list.append( "Birthday" ); 993 list.append( "Birthday" );
994 list.append( "Anniversary" ); 994 list.append( "Anniversary" );
995 list.append( "Nickname" ); 995 list.append( "Nickname" );
996 list.append( "Children" ); 996 list.append( "Children" );
997 997
998 list.append( "Notes" ); 998 list.append( "Notes" );
999 list.append( "Groups" ); 999 list.append( "Groups" );
1000 1000
1001 return list; 1001 return list;
1002} 1002}
1003 1003
1004/*! 1004/*!
1005 Sets the list of email address for contact to those contained in \a str. 1005 Sets the list of email address for contact to those contained in \a str.
1006 Email address should be separated by ';'s. 1006 Email address should be separated by ';'s.
1007*/ 1007*/
1008void OContact::setEmails( const QString &str ) 1008void OContact::setEmails( const QString &str )
1009{ 1009{
1010 replace( Qtopia::Emails, str ); 1010 replace( Qtopia::Emails, str );
1011 if ( str.isEmpty() ) 1011 if ( str.isEmpty() )
1012 setDefaultEmail( QString::null ); 1012 setDefaultEmail( QString::null );
1013} 1013}
1014 1014
1015/*! 1015/*!
1016 Sets the list of children for the contact to those contained in \a str. 1016 Sets the list of children for the contact to those contained in \a str.
1017*/ 1017*/
1018void OContact::setChildren( const QString &str ) 1018void OContact::setChildren( const QString &str )
1019{ 1019{
1020 replace( Qtopia::Children, str ); 1020 replace( Qtopia::Children, str );
1021} 1021}
1022 1022
1023// vcard conversion code 1023// vcard conversion code
1024/*! 1024/*!
1025 \internal 1025 \internal
1026*/ 1026*/
1027static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) 1027static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value )
1028{ 1028{
1029 VObject *ret = 0; 1029 VObject *ret = 0;
1030 if ( o && !value.isEmpty() ) 1030 if ( o && !value.isEmpty() )
1031 ret = addPropValue( o, prop, value.latin1() ); 1031 ret = addPropValue( o, prop, value.latin1() );
1032 return ret; 1032 return ret;
1033} 1033}
1034 1034
1035/*! 1035/*!
1036 \internal 1036 \internal
1037*/ 1037*/
1038static inline VObject *safeAddProp( VObject *o, const char *prop) 1038static inline VObject *safeAddProp( VObject *o, const char *prop)
1039{ 1039{
1040 VObject *ret = 0; 1040 VObject *ret = 0;
1041 if ( o ) 1041 if ( o )
1042 ret = addProp( o, prop ); 1042 ret = addProp( o, prop );
1043 return ret; 1043 return ret;
1044} 1044}
1045 1045
1046/*! 1046/*!
1047 \internal 1047 \internal
1048*/ 1048*/
1049static VObject *createVObject( const OContact &c ) 1049static VObject *createVObject( const OContact &c )
1050{ 1050{
1051 VObject *vcard = newVObject( VCCardProp ); 1051 VObject *vcard = newVObject( VCCardProp );
1052 safeAddPropValue( vcard, VCVersionProp, "2.1" ); 1052 safeAddPropValue( vcard, VCVersionProp, "2.1" );
1053 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); 1053 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) );
1054 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); 1054 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) );
1055 1055
1056 // full name 1056 // full name
1057 safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); 1057 safeAddPropValue( vcard, VCFullNameProp, c.fullName() );
1058 1058
1059 // name properties 1059 // name properties
1060 VObject *name = safeAddProp( vcard, VCNameProp ); 1060 VObject *name = safeAddProp( vcard, VCNameProp );
1061 safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); 1061 safeAddPropValue( name, VCFamilyNameProp, c.lastName() );
1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
1066 1066
1067 // home properties 1067 // home properties
1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
1069 safeAddProp( home_adr, VCHomeProp ); 1069 safeAddProp( home_adr, VCHomeProp );
1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
1075 1075
1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
1077 safeAddProp( home_phone, VCHomeProp ); 1077 safeAddProp( home_phone, VCHomeProp );
1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
1079 safeAddProp( home_phone, VCHomeProp ); 1079 safeAddProp( home_phone, VCHomeProp );
1080 safeAddProp( home_phone, VCCellularProp ); 1080 safeAddProp( home_phone, VCCellularProp );
1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
1082 safeAddProp( home_phone, VCHomeProp ); 1082 safeAddProp( home_phone, VCHomeProp );
1083 safeAddProp( home_phone, VCFaxProp ); 1083 safeAddProp( home_phone, VCFaxProp );
1084 1084
1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
1086 safeAddProp( url, VCHomeProp ); 1086 safeAddProp( url, VCHomeProp );
1087 1087
1088 // work properties 1088 // work properties
1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
1090 safeAddProp( work_adr, VCWorkProp ); 1090 safeAddProp( work_adr, VCWorkProp );
1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
1096 1096
1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1098 safeAddProp( work_phone, VCWorkProp ); 1098 safeAddProp( work_phone, VCWorkProp );
1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1100 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1101 safeAddProp( work_phone, VCCellularProp ); 1101 safeAddProp( work_phone, VCCellularProp );
1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1103 safeAddProp( work_phone, VCWorkProp ); 1103 safeAddProp( work_phone, VCWorkProp );
1104 safeAddProp( work_phone, VCFaxProp ); 1104 safeAddProp( work_phone, VCFaxProp );
1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1106 safeAddProp( work_phone, VCWorkProp ); 1106 safeAddProp( work_phone, VCWorkProp );
1107 safeAddProp( work_phone, VCPagerProp ); 1107 safeAddProp( work_phone, VCPagerProp );
1108 1108
1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1110 safeAddProp( url, VCWorkProp ); 1110 safeAddProp( url, VCWorkProp );
1111 1111
1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1113 safeAddProp( title, VCWorkProp ); 1113 safeAddProp( title, VCWorkProp );
1114 1114
1115 1115
1116 QStringList emails = c.emailList(); 1116 QStringList emails = c.emailList();
1117 emails.prepend( c.defaultEmail() ); 1117 emails.prepend( c.defaultEmail() );
1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1120 safeAddProp( email, VCInternetProp ); 1120 safeAddProp( email, VCInternetProp );
1121 } 1121 }
1122 1122
1123 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1123 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1124 1124
1125 // Exporting Birthday regarding RFC 2425 (5.8.4) 1125 // Exporting Birthday regarding RFC 2425 (5.8.4)
1126 if ( !c.birthday().isNull() ){ 1126 if ( !c.birthday().isValid() ){
1127 QString birthd_rfc2425 = c.birthday().year() + QString( "-" ) + c.birthday().month() + QString( "-" ) + c.birthday().day(); 1127 QString birthd_rfc2425 = QString("%1-%2-%3")
1128 .arg( c.birthday().year() )
1129 .arg( c.birthday().month(), 2 )
1130 .arg( c.birthday().day(), 2 );
1131 // Now replace spaces with "0"...
1132 int pos = 0;
1133 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1134 birthd_rfc2425.replace( pos, 1, "0" );
1135
1128 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1136 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1129 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1137 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1130 } 1138 }
1131 1139
1132 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1140 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1133 VObject *org = safeAddProp( vcard, VCOrgProp ); 1141 VObject *org = safeAddProp( vcard, VCOrgProp );
1134 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1142 safeAddPropValue( org, VCOrgNameProp, c.company() );
1135 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1143 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1136 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1144 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1137 } 1145 }
1138 1146
1139 // some values we have to export as custom fields 1147 // some values we have to export as custom fields
1140 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1148 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1141 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1149 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1142 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1143 1151
1144 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1145 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1153 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1146 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1154 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1147 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1148 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1156 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1149 1157
1150 return vcard; 1158 return vcard;
1151} 1159}
1152 1160
1153 1161
1154/*! 1162/*!
1155 \internal 1163 \internal
1156*/ 1164*/
1157static QDate convVCardDateToDate( const QString& datestr ) 1165static QDate convVCardDateToDate( const QString& datestr )
1158{ 1166{
1159 int monthPos = datestr.find('-'); 1167 int monthPos = datestr.find('-');
1160 int dayPos = datestr.find('-', monthPos+1 ); 1168 int dayPos = datestr.find('-', monthPos+1 );
1169 int sep_ignore = 1;
1161 if ( monthPos == -1 || dayPos == -1 ) { 1170 if ( monthPos == -1 || dayPos == -1 ) {
1162 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1171 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1163 return QDate(); 1172 // Ok.. Outlook is violating ISO 8601, therefore we will try to read their format ( YYYYMMDD )
1173 monthPos = 4;
1174 dayPos = 6;
1175 sep_ignore = 0;
1176 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1164 } 1177 }
1165 int y = datestr.left( monthPos ).toInt(); 1178 int y = datestr.left( monthPos ).toInt();
1166 int m = datestr.mid( monthPos+1, dayPos - monthPos - 1 ).toInt(); 1179 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt();
1167 int d = datestr.mid( dayPos+1 ).toInt(); 1180 int d = datestr.mid( dayPos + sep_ignore ).toInt();
1168 QDate date ( y,m,d );
1169 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); 1181 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos);
1182 QDate date ( y,m,d );
1170 return date; 1183 return date;
1171} 1184}
1172 1185
1173static OContact parseVObject( VObject *obj ) 1186static OContact parseVObject( VObject *obj )
1174{ 1187{
1175 OContact c; 1188 OContact c;
1176 1189
1177 VObjectIterator it; 1190 VObjectIterator it;
1178 initPropIterator( &it, obj ); 1191 initPropIterator( &it, obj );
1179 while( moreIteration( &it ) ) { 1192 while( moreIteration( &it ) ) {
1180 VObject *o = nextVObject( &it ); 1193 VObject *o = nextVObject( &it );
1181 QCString name = vObjectName( o ); 1194 QCString name = vObjectName( o );
1182 QCString value = vObjectStringZValue( o ); 1195 QCString value = vObjectStringZValue( o );
1183 if ( name == VCNameProp ) { 1196 if ( name == VCNameProp ) {
1184 VObjectIterator nit; 1197 VObjectIterator nit;
1185 initPropIterator( &nit, o ); 1198 initPropIterator( &nit, o );
1186 while( moreIteration( &nit ) ) { 1199 while( moreIteration( &nit ) ) {
1187 VObject *o = nextVObject( &nit ); 1200 VObject *o = nextVObject( &nit );
1188 QCString name = vObjectTypeInfo( o ); 1201 QCString name = vObjectTypeInfo( o );
1189 QString value = vObjectStringZValue( o ); 1202 QString value = vObjectStringZValue( o );
1190 if ( name == VCNamePrefixesProp ) 1203 if ( name == VCNamePrefixesProp )
1191 c.setTitle( value ); 1204 c.setTitle( value );
1192 else if ( name == VCNameSuffixesProp ) 1205 else if ( name == VCNameSuffixesProp )
1193 c.setSuffix( value ); 1206 c.setSuffix( value );
1194 else if ( name == VCFamilyNameProp ) 1207 else if ( name == VCFamilyNameProp )
1195 c.setLastName( value ); 1208 c.setLastName( value );
1196 else if ( name == VCGivenNameProp ) 1209 else if ( name == VCGivenNameProp )
1197 c.setFirstName( value ); 1210 c.setFirstName( value );
1198 else if ( name == VCAdditionalNamesProp ) 1211 else if ( name == VCAdditionalNamesProp )
1199 c.setMiddleName( value ); 1212 c.setMiddleName( value );
1200 } 1213 }
1201 } 1214 }
1202 else if ( name == VCAdrProp ) { 1215 else if ( name == VCAdrProp ) {
1203 bool work = TRUE; // default address is work address 1216 bool work = TRUE; // default address is work address
1204 QString street; 1217 QString street;
1205 QString city; 1218 QString city;
1206 QString region; 1219 QString region;
1207 QString postal; 1220 QString postal;
1208 QString country; 1221 QString country;
1209 1222
1210 VObjectIterator nit; 1223 VObjectIterator nit;
1211 initPropIterator( &nit, o ); 1224 initPropIterator( &nit, o );
1212 while( moreIteration( &nit ) ) { 1225 while( moreIteration( &nit ) ) {
1213 VObject *o = nextVObject( &nit ); 1226 VObject *o = nextVObject( &nit );
1214 QCString name = vObjectName( o ); 1227 QCString name = vObjectName( o );
1215 QString value = vObjectStringZValue( o ); 1228 QString value = vObjectStringZValue( o );
1216 if ( name == VCHomeProp ) 1229 if ( name == VCHomeProp )
1217 work = FALSE; 1230 work = FALSE;
1218 else if ( name == VCWorkProp ) 1231 else if ( name == VCWorkProp )
1219 work = TRUE; 1232 work = TRUE;
1220 else if ( name == VCStreetAddressProp ) 1233 else if ( name == VCStreetAddressProp )
1221 street = value; 1234 street = value;
1222 else if ( name == VCCityProp ) 1235 else if ( name == VCCityProp )
1223 city = value; 1236 city = value;
1224 else if ( name == VCRegionProp ) 1237 else if ( name == VCRegionProp )
1225 region = value; 1238 region = value;
1226 else if ( name == VCPostalCodeProp ) 1239 else if ( name == VCPostalCodeProp )
1227 postal = value; 1240 postal = value;
1228 else if ( name == VCCountryNameProp ) 1241 else if ( name == VCCountryNameProp )
1229 country = value; 1242 country = value;
1230 } 1243 }
1231 if ( work ) { 1244 if ( work ) {
1232 c.setBusinessStreet( street ); 1245 c.setBusinessStreet( street );
1233 c.setBusinessCity( city ); 1246 c.setBusinessCity( city );
1234 c.setBusinessCountry( country ); 1247 c.setBusinessCountry( country );
1235 c.setBusinessZip( postal ); 1248 c.setBusinessZip( postal );
1236 c.setBusinessState( region ); 1249 c.setBusinessState( region );
1237 } else { 1250 } else {
1238 c.setHomeStreet( street ); 1251 c.setHomeStreet( street );
1239 c.setHomeCity( city ); 1252 c.setHomeCity( city );
1240 c.setHomeCountry( country ); 1253 c.setHomeCountry( country );
1241 c.setHomeZip( postal ); 1254 c.setHomeZip( postal );
1242 c.setHomeState( region ); 1255 c.setHomeState( region );
1243 } 1256 }
1244 } 1257 }
1245 else if ( name == VCTelephoneProp ) { 1258 else if ( name == VCTelephoneProp ) {
1246 enum { 1259 enum {
1247 HOME = 0x01, 1260 HOME = 0x01,
1248 WORK = 0x02, 1261 WORK = 0x02,
1249 VOICE = 0x04, 1262 VOICE = 0x04,
1250 CELL = 0x08, 1263 CELL = 0x08,
1251 FAX = 0x10, 1264 FAX = 0x10,
1252 PAGER = 0x20, 1265 PAGER = 0x20,
1253 UNKNOWN = 0x80 1266 UNKNOWN = 0x80
1254 }; 1267 };
1255 int type = 0; 1268 int type = 0;
1256 1269
1257 VObjectIterator nit; 1270 VObjectIterator nit;
1258 initPropIterator( &nit, o ); 1271 initPropIterator( &nit, o );
1259 while( moreIteration( &nit ) ) { 1272 while( moreIteration( &nit ) ) {
1260 VObject *o = nextVObject( &nit ); 1273 VObject *o = nextVObject( &nit );
1261 QCString name = vObjectTypeInfo( o ); 1274 QCString name = vObjectTypeInfo( o );
1262 if ( name == VCHomeProp ) 1275 if ( name == VCHomeProp )
1263 type |= HOME; 1276 type |= HOME;
1264 else if ( name == VCWorkProp ) 1277 else if ( name == VCWorkProp )
1265 type |= WORK; 1278 type |= WORK;
1266 else if ( name == VCVoiceProp ) 1279 else if ( name == VCVoiceProp )
1267 type |= VOICE; 1280 type |= VOICE;
1268 else if ( name == VCCellularProp ) 1281 else if ( name == VCCellularProp )
1269 type |= CELL; 1282 type |= CELL;
1270 else if ( name == VCFaxProp ) 1283 else if ( name == VCFaxProp )
1271 type |= FAX; 1284 type |= FAX;
1272 else if ( name == VCPagerProp ) 1285 else if ( name == VCPagerProp )
1273 type |= PAGER; 1286 type |= PAGER;
1274 else if ( name == VCPreferredProp ) 1287 else if ( name == VCPreferredProp )
1275 ; 1288 ;
1276 else 1289 else
1277 type |= UNKNOWN; 1290 type |= UNKNOWN;
1278 } 1291 }
1279 if ( (type & UNKNOWN) != UNKNOWN ) { 1292 if ( (type & UNKNOWN) != UNKNOWN ) {
1280 if ( ( type & (HOME|WORK) ) == 0 ) // default 1293 if ( ( type & (HOME|WORK) ) == 0 ) // default
1281 type |= HOME; 1294 type |= HOME;
1282 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 1295 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
1283 type |= VOICE; 1296 type |= VOICE;
1284 1297
1285 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) 1298 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) )
1286 c.setHomePhone( value ); 1299 c.setHomePhone( value );
1287 if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) 1300 if ( ( type & (FAX|HOME) ) == (FAX|HOME) )
1288 c.setHomeFax( value ); 1301 c.setHomeFax( value );
1289 if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) 1302 if ( ( type & (CELL|HOME) ) == (CELL|HOME) )
1290 c.setHomeMobile( value ); 1303 c.setHomeMobile( value );
1291 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) 1304 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) )
1292 c.setBusinessPhone( value ); 1305 c.setBusinessPhone( value );
1293 if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) 1306 if ( ( type & (FAX|WORK) ) == (FAX|WORK) )
1294 c.setBusinessFax( value ); 1307 c.setBusinessFax( value );
1295 if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) 1308 if ( ( type & (CELL|WORK) ) == (CELL|WORK) )
1296 c.setBusinessMobile( value ); 1309 c.setBusinessMobile( value );
1297 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) 1310 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) )
1298 c.setBusinessPager( value ); 1311 c.setBusinessPager( value );
1299 } 1312 }
1300 } 1313 }
1301 else if ( name == VCEmailAddressProp ) { 1314 else if ( name == VCEmailAddressProp ) {
1302 QString email = vObjectStringZValue( o ); 1315 QString email = vObjectStringZValue( o );
1303 bool valid = TRUE; 1316 bool valid = TRUE;
1304 VObjectIterator nit; 1317 VObjectIterator nit;
1305 initPropIterator( &nit, o ); 1318 initPropIterator( &nit, o );
1306 while( moreIteration( &nit ) ) { 1319 while( moreIteration( &nit ) ) {
1307 VObject *o = nextVObject( &nit ); 1320 VObject *o = nextVObject( &nit );
1308 QCString name = vObjectTypeInfo( o ); 1321 QCString name = vObjectTypeInfo( o );
1309 if ( name != VCInternetProp && name != VCHomeProp && 1322 if ( name != VCInternetProp && name != VCHomeProp &&
1310 name != VCWorkProp && 1323 name != VCWorkProp &&
1311 name != VCPreferredProp ) 1324 name != VCPreferredProp )
1312 // ### preffered should map to default email 1325 // ### preffered should map to default email
1313 valid = FALSE; 1326 valid = FALSE;
1314 } 1327 }
1315 if ( valid ) { 1328 if ( valid ) {
1316 c.insertEmail( email ); 1329 c.insertEmail( email );
1317 } 1330 }
1318 } 1331 }
1319 else if ( name == VCURLProp ) { 1332 else if ( name == VCURLProp ) {
1320 VObjectIterator nit; 1333 VObjectIterator nit;
1321 initPropIterator( &nit, o ); 1334 initPropIterator( &nit, o );
1322 while( moreIteration( &nit ) ) { 1335 while( moreIteration( &nit ) ) {
1323 VObject *o = nextVObject( &nit ); 1336 VObject *o = nextVObject( &nit );
1324 QCString name = vObjectTypeInfo( o ); 1337 QCString name = vObjectTypeInfo( o );
1325 if ( name == VCHomeProp ) 1338 if ( name == VCHomeProp )
1326 c.setHomeWebpage( value ); 1339 c.setHomeWebpage( value );
1327 else if ( name == VCWorkProp ) 1340 else if ( name == VCWorkProp )
1328 c.setBusinessWebpage( value ); 1341 c.setBusinessWebpage( value );
1329 } 1342 }
1330 } 1343 }
1331 else if ( name == VCOrgProp ) { 1344 else if ( name == VCOrgProp ) {
1332 VObjectIterator nit; 1345 VObjectIterator nit;
1333 initPropIterator( &nit, o ); 1346 initPropIterator( &nit, o );
1334 while( moreIteration( &nit ) ) { 1347 while( moreIteration( &nit ) ) {
1335 VObject *o = nextVObject( &nit ); 1348 VObject *o = nextVObject( &nit );
1336 QCString name = vObjectName( o ); 1349 QCString name = vObjectName( o );
1337 QString value = vObjectStringZValue( o ); 1350 QString value = vObjectStringZValue( o );
1338 if ( name == VCOrgNameProp ) 1351 if ( name == VCOrgNameProp )
1339 c.setCompany( value ); 1352 c.setCompany( value );
1340 else if ( name == VCOrgUnitProp ) 1353 else if ( name == VCOrgUnitProp )
1341 c.setDepartment( value ); 1354 c.setDepartment( value );
1342 else if ( name == VCOrgUnit2Prop ) 1355 else if ( name == VCOrgUnit2Prop )
1343 c.setOffice( value ); 1356 c.setOffice( value );
1344 } 1357 }
1345 } 1358 }
1346 else if ( name == VCTitleProp ) { 1359 else if ( name == VCTitleProp ) {
1347 c.setJobTitle( value ); 1360 c.setJobTitle( value );
1348 } 1361 }
1349 else if ( name == "X-Qtopia-Profession" ) { 1362 else if ( name == "X-Qtopia-Profession" ) {
1350 c.setProfession( value ); 1363 c.setProfession( value );
1351 } 1364 }
1352 else if ( name == "X-Qtopia-Manager" ) { 1365 else if ( name == "X-Qtopia-Manager" ) {
1353 c.setManager( value ); 1366 c.setManager( value );
1354 } 1367 }
1355 else if ( name == "X-Qtopia-Assistant" ) { 1368 else if ( name == "X-Qtopia-Assistant" ) {
1356 c.setAssistant( value ); 1369 c.setAssistant( value );
1357 } 1370 }
1358 else if ( name == "X-Qtopia-Spouse" ) { 1371 else if ( name == "X-Qtopia-Spouse" ) {
1359 c.setSpouse( value ); 1372 c.setSpouse( value );
1360 } 1373 }
1361 else if ( name == "X-Qtopia-Gender" ) { 1374 else if ( name == "X-Qtopia-Gender" ) {
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index 734f5a2..bf27d0f 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -382,390 +382,390 @@ OContact::~OContact()
382 382
383/*! \fn QString OContact::nickname() const 383/*! \fn QString OContact::nickname() const
384 Returns the nickname of the contact. 384 Returns the nickname of the contact.
385*/ 385*/
386 386
387/*! \fn QString OContact::children() const 387/*! \fn QString OContact::children() const
388 Returns the children of the contact. 388 Returns the children of the contact.
389*/ 389*/
390 390
391/*! \fn QString OContact::notes() const 391/*! \fn QString OContact::notes() const
392 Returns the notes relating to the the contact. 392 Returns the notes relating to the the contact.
393*/ 393*/
394 394
395/*! \fn QString OContact::groups() const 395/*! \fn QString OContact::groups() const
396 \internal 396 \internal
397 Returns the groups for the contact. 397 Returns the groups for the contact.
398*/ 398*/
399 399
400/*! \fn QStringList OContact::groupList() const 400/*! \fn QStringList OContact::groupList() const
401 \internal 401 \internal
402*/ 402*/
403 403
404/*! \fn QString OContact::field(int) const 404/*! \fn QString OContact::field(int) const
405 \internal 405 \internal
406*/ 406*/
407 407
408/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null ) 408/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null )
409 \internal 409 \internal
410*/ 410*/
411 411
412/*! \fn void OContact::setUid( int id ) 412/*! \fn void OContact::setUid( int id )
413 \internal 413 \internal
414 Sets the uid for this record to \a id. 414 Sets the uid for this record to \a id.
415*/ 415*/
416 416
417/*! \enum OContact::journal_action 417/*! \enum OContact::journal_action
418 \internal 418 \internal
419*/ 419*/
420 420
421/*! 421/*!
422 \internal 422 \internal
423*/ 423*/
424QMap<int, QString> OContact::toMap() const 424QMap<int, QString> OContact::toMap() const
425{ 425{
426 QMap<int, QString> map = mMap; 426 QMap<int, QString> map = mMap;
427 QString cats = idsToString( categories() ); 427 QString cats = idsToString( categories() );
428 if ( !cats.isEmpty() ) 428 if ( !cats.isEmpty() )
429 map.insert( Qtopia::AddressCategory, cats ); 429 map.insert( Qtopia::AddressCategory, cats );
430 return map; 430 return map;
431} 431}
432 432
433/*! 433/*!
434 Returns a rich text formatted QString representing the contents the contact. 434 Returns a rich text formatted QString representing the contents the contact.
435*/ 435*/
436QString OContact::toRichText() const 436QString OContact::toRichText() const
437{ 437{
438 QString text; 438 QString text;
439 QString value, comp, state; 439 QString value, comp, state;
440 440
441 // name, jobtitle and company 441 // name, jobtitle and company
442 if ( !(value = fullName()).isEmpty() ) 442 if ( !(value = fullName()).isEmpty() )
443 text += "<b>" + Qtopia::escapeString(value) + "</b><br>"; 443 text += "<b>" + Qtopia::escapeString(value) + "</b><br>";
444 if ( !(value = jobTitle()).isEmpty() ) 444 if ( !(value = jobTitle()).isEmpty() )
445 text += Qtopia::escapeString(value) + "<br>"; 445 text += Qtopia::escapeString(value) + "<br>";
446 446
447 comp = company(); 447 comp = company();
448 if ( !(value = department()).isEmpty() ) { 448 if ( !(value = department()).isEmpty() ) {
449 text += Qtopia::escapeString(value); 449 text += Qtopia::escapeString(value);
450 if ( comp ) 450 if ( comp )
451 text += ", "; 451 text += ", ";
452 else 452 else
453 text += "<br>"; 453 text += "<br>";
454 } 454 }
455 if ( !comp.isEmpty() ) 455 if ( !comp.isEmpty() )
456 text += Qtopia::escapeString(comp) + "<br>"; 456 text += Qtopia::escapeString(comp) + "<br>";
457 457
458 // business address 458 // business address
459 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 459 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
460 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 460 !businessZip().isEmpty() || !businessCountry().isEmpty() ) {
461 text += "<br>"; 461 text += "<br>";
462 text += QObject::tr( "<b>Work Address:</b>" ); 462 text += QObject::tr( "<b>Work Address:</b>" );
463 text += "<br>"; 463 text += "<br>";
464 } 464 }
465 465
466 if ( !(value = businessStreet()).isEmpty() ) 466 if ( !(value = businessStreet()).isEmpty() )
467 text += Qtopia::escapeString(value) + "<br>"; 467 text += Qtopia::escapeString(value) + "<br>";
468 state = businessState(); 468 state = businessState();
469 if ( !(value = businessCity()).isEmpty() ) { 469 if ( !(value = businessCity()).isEmpty() ) {
470 text += Qtopia::escapeString(value); 470 text += Qtopia::escapeString(value);
471 if ( state ) 471 if ( state )
472 text += ", " + Qtopia::escapeString(state); 472 text += ", " + Qtopia::escapeString(state);
473 text += "<br>"; 473 text += "<br>";
474 } else if ( !state.isEmpty() ) 474 } else if ( !state.isEmpty() )
475 text += Qtopia::escapeString(state) + "<br>"; 475 text += Qtopia::escapeString(state) + "<br>";
476 if ( !(value = businessZip()).isEmpty() ) 476 if ( !(value = businessZip()).isEmpty() )
477 text += Qtopia::escapeString(value) + "<br>"; 477 text += Qtopia::escapeString(value) + "<br>";
478 if ( !(value = businessCountry()).isEmpty() ) 478 if ( !(value = businessCountry()).isEmpty() )
479 text += Qtopia::escapeString(value) + "<br>"; 479 text += Qtopia::escapeString(value) + "<br>";
480 480
481 // home address 481 // home address
482 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 482 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
483 !homeZip().isEmpty() || !homeCountry().isEmpty() ) { 483 !homeZip().isEmpty() || !homeCountry().isEmpty() ) {
484 text += "<br>"; 484 text += "<br>";
485 text += QObject::tr( "<b>Home Address:</b>" ); 485 text += QObject::tr( "<b>Home Address:</b>" );
486 text += "<br>"; 486 text += "<br>";
487 } 487 }
488 488
489 if ( !(value = homeStreet()).isEmpty() ) 489 if ( !(value = homeStreet()).isEmpty() )
490 text += Qtopia::escapeString(value) + "<br>"; 490 text += Qtopia::escapeString(value) + "<br>";
491 state = homeState(); 491 state = homeState();
492 if ( !(value = homeCity()).isEmpty() ) { 492 if ( !(value = homeCity()).isEmpty() ) {
493 text += Qtopia::escapeString(value); 493 text += Qtopia::escapeString(value);
494 if ( !state.isEmpty() ) 494 if ( !state.isEmpty() )
495 text += ", " + Qtopia::escapeString(state); 495 text += ", " + Qtopia::escapeString(state);
496 text += "<br>"; 496 text += "<br>";
497 } else if (!state.isEmpty()) 497 } else if (!state.isEmpty())
498 text += Qtopia::escapeString(state) + "<br>"; 498 text += Qtopia::escapeString(state) + "<br>";
499 if ( !(value = homeZip()).isEmpty() ) 499 if ( !(value = homeZip()).isEmpty() )
500 text += Qtopia::escapeString(value) + "<br>"; 500 text += Qtopia::escapeString(value) + "<br>";
501 if ( !(value = homeCountry()).isEmpty() ) 501 if ( !(value = homeCountry()).isEmpty() )
502 text += Qtopia::escapeString(value) + "<br>"; 502 text += Qtopia::escapeString(value) + "<br>";
503 503
504 // the others... 504 // the others...
505 QString str; 505 QString str;
506 str = emails(); 506 str = emails();
507 if ( !str.isEmpty() ) 507 if ( !str.isEmpty() )
508 text += "<b>" + QObject::tr("Email Addresses: ") + "</b>" 508 text += "<b>" + QObject::tr("Email Addresses: ") + "</b>"
509 + Qtopia::escapeString(str) + "<br>"; 509 + Qtopia::escapeString(str) + "<br>";
510 str = homePhone(); 510 str = homePhone();
511 if ( !str.isEmpty() ) 511 if ( !str.isEmpty() )
512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>"
513 + Qtopia::escapeString(str) + "<br>"; 513 + Qtopia::escapeString(str) + "<br>";
514 str = homeFax(); 514 str = homeFax();
515 if ( !str.isEmpty() ) 515 if ( !str.isEmpty() )
516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>"
517 + Qtopia::escapeString(str) + "<br>"; 517 + Qtopia::escapeString(str) + "<br>";
518 str = homeMobile(); 518 str = homeMobile();
519 if ( !str.isEmpty() ) 519 if ( !str.isEmpty() )
520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>"
521 + Qtopia::escapeString(str) + "<br>"; 521 + Qtopia::escapeString(str) + "<br>";
522 str = homeWebpage(); 522 str = homeWebpage();
523 if ( !str.isEmpty() ) 523 if ( !str.isEmpty() )
524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>"
525 + Qtopia::escapeString(str) + "<br>"; 525 + Qtopia::escapeString(str) + "<br>";
526 str = businessWebpage(); 526 str = businessWebpage();
527 if ( !str.isEmpty() ) 527 if ( !str.isEmpty() )
528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>"
529 + Qtopia::escapeString(str) + "<br>"; 529 + Qtopia::escapeString(str) + "<br>";
530 str = office(); 530 str = office();
531 if ( !str.isEmpty() ) 531 if ( !str.isEmpty() )
532 text += "<b>" + QObject::tr("Office: ") + "</b>" 532 text += "<b>" + QObject::tr("Office: ") + "</b>"
533 + Qtopia::escapeString(str) + "<br>"; 533 + Qtopia::escapeString(str) + "<br>";
534 str = businessPhone(); 534 str = businessPhone();
535 if ( !str.isEmpty() ) 535 if ( !str.isEmpty() )
536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>"
537 + Qtopia::escapeString(str) + "<br>"; 537 + Qtopia::escapeString(str) + "<br>";
538 str = businessFax(); 538 str = businessFax();
539 if ( !str.isEmpty() ) 539 if ( !str.isEmpty() )
540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>"
541 + Qtopia::escapeString(str) + "<br>"; 541 + Qtopia::escapeString(str) + "<br>";
542 str = businessMobile(); 542 str = businessMobile();
543 if ( !str.isEmpty() ) 543 if ( !str.isEmpty() )
544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>"
545 + Qtopia::escapeString(str) + "<br>"; 545 + Qtopia::escapeString(str) + "<br>";
546 str = businessPager(); 546 str = businessPager();
547 if ( !str.isEmpty() ) 547 if ( !str.isEmpty() )
548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
549 + Qtopia::escapeString(str) + "<br>"; 549 + Qtopia::escapeString(str) + "<br>";
550 str = profession(); 550 str = profession();
551 if ( !str.isEmpty() ) 551 if ( !str.isEmpty() )
552 text += "<b>" + QObject::tr("Profession: ") + "</b>" 552 text += "<b>" + QObject::tr("Profession: ") + "</b>"
553 + Qtopia::escapeString(str) + "<br>"; 553 + Qtopia::escapeString(str) + "<br>";
554 str = assistant(); 554 str = assistant();
555 if ( !str.isEmpty() ) 555 if ( !str.isEmpty() )
556 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 556 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
557 + Qtopia::escapeString(str) + "<br>"; 557 + Qtopia::escapeString(str) + "<br>";
558 str = manager(); 558 str = manager();
559 if ( !str.isEmpty() ) 559 if ( !str.isEmpty() )
560 text += "<b>" + QObject::tr("Manager: ") + "</b>" 560 text += "<b>" + QObject::tr("Manager: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 561 + Qtopia::escapeString(str) + "<br>";
562 str = gender(); 562 str = gender();
563 if ( !str.isEmpty() && str.toInt() != 0 ) { 563 if ( !str.isEmpty() && str.toInt() != 0 ) {
564 if ( str.toInt() == 1 ) 564 if ( str.toInt() == 1 )
565 str = QObject::tr( "Male" ); 565 str = QObject::tr( "Male" );
566 else if ( str.toInt() == 2 ) 566 else if ( str.toInt() == 2 )
567 str = QObject::tr( "Female" ); 567 str = QObject::tr( "Female" );
568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
569 } 569 }
570 str = spouse(); 570 str = spouse();
571 if ( !str.isEmpty() ) 571 if ( !str.isEmpty() )
572 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 572 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 573 + Qtopia::escapeString(str) + "<br>";
574 if ( !birthday().isNull() ){ 574 if ( !birthday().isValid() ){
575 str = TimeString::numberDateString( birthday() ); 575 str = TimeString::numberDateString( birthday() );
576 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 576 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
577 + Qtopia::escapeString(str) + "<br>"; 577 + Qtopia::escapeString(str) + "<br>";
578 } 578 }
579 if ( !anniversary().isNull() ){ 579 if ( !anniversary().isValid() ){
580 str = TimeString::numberDateString( anniversary() ); 580 str = TimeString::numberDateString( anniversary() );
581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
582 + Qtopia::escapeString(str) + "<br>"; 582 + Qtopia::escapeString(str) + "<br>";
583 } 583 }
584 str = nickname(); 584 str = nickname();
585 if ( !str.isEmpty() ) 585 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 586 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 587 + Qtopia::escapeString(str) + "<br>";
588 588
589 // notes last 589 // notes last
590 if ( (value = notes()) ) { 590 if ( (value = notes()) ) {
591 QRegExp reg("\n"); 591 QRegExp reg("\n");
592 592
593 //QString tmp = Qtopia::escapeString(value); 593 //QString tmp = Qtopia::escapeString(value);
594 QString tmp = QStyleSheet::convertFromPlainText(value); 594 QString tmp = QStyleSheet::convertFromPlainText(value);
595 //tmp.replace( reg, "<br>" ); 595 //tmp.replace( reg, "<br>" );
596 text += "<br>" + tmp + "<br>"; 596 text += "<br>" + tmp + "<br>";
597 } 597 }
598 return text; 598 return text;
599} 599}
600 600
601/*! 601/*!
602 \internal 602 \internal
603*/ 603*/
604void OContact::insert( int key, const QString &v ) 604void OContact::insert( int key, const QString &v )
605{ 605{
606 QString value = v.stripWhiteSpace(); 606 QString value = v.stripWhiteSpace();
607 if ( value.isEmpty() ) 607 if ( value.isEmpty() )
608 mMap.remove( key ); 608 mMap.remove( key );
609 else 609 else
610 mMap.insert( key, value ); 610 mMap.insert( key, value );
611} 611}
612 612
613/*! 613/*!
614 \internal 614 \internal
615*/ 615*/
616void OContact::replace( int key, const QString & v ) 616void OContact::replace( int key, const QString & v )
617{ 617{
618 QString value = v.stripWhiteSpace(); 618 QString value = v.stripWhiteSpace();
619 if ( value.isEmpty() ) 619 if ( value.isEmpty() )
620 mMap.remove( key ); 620 mMap.remove( key );
621 else 621 else
622 mMap.replace( key, value ); 622 mMap.replace( key, value );
623} 623}
624 624
625/*! 625/*!
626 \internal 626 \internal
627*/ 627*/
628QString OContact::find( int key ) const 628QString OContact::find( int key ) const
629{ 629{
630 return mMap[key]; 630 return mMap[key];
631} 631}
632 632
633/*! 633/*!
634 \internal 634 \internal
635*/ 635*/
636QString OContact::displayAddress( const QString &street, 636QString OContact::displayAddress( const QString &street,
637 const QString &city, 637 const QString &city,
638 const QString &state, 638 const QString &state,
639 const QString &zip, 639 const QString &zip,
640 const QString &country ) const 640 const QString &country ) const
641{ 641{
642 QString s = street; 642 QString s = street;
643 if ( !street.isEmpty() ) 643 if ( !street.isEmpty() )
644 s+= "\n"; 644 s+= "\n";
645 s += city; 645 s += city;
646 if ( !city.isEmpty() && !state.isEmpty() ) 646 if ( !city.isEmpty() && !state.isEmpty() )
647 s += ", "; 647 s += ", ";
648 s += state; 648 s += state;
649 if ( !state.isEmpty() && !zip.isEmpty() ) 649 if ( !state.isEmpty() && !zip.isEmpty() )
650 s += " "; 650 s += " ";
651 s += zip; 651 s += zip;
652 if ( !country.isEmpty() && !s.isEmpty() ) 652 if ( !country.isEmpty() && !s.isEmpty() )
653 s += "\n"; 653 s += "\n";
654 s += country; 654 s += country;
655 return s; 655 return s;
656} 656}
657 657
658/*! 658/*!
659 \internal 659 \internal
660*/ 660*/
661QString OContact::displayBusinessAddress() const 661QString OContact::displayBusinessAddress() const
662{ 662{
663 return displayAddress( businessStreet(), businessCity(), 663 return displayAddress( businessStreet(), businessCity(),
664 businessState(), businessZip(), 664 businessState(), businessZip(),
665 businessCountry() ); 665 businessCountry() );
666} 666}
667 667
668/*! 668/*!
669 \internal 669 \internal
670*/ 670*/
671QString OContact::displayHomeAddress() const 671QString OContact::displayHomeAddress() const
672{ 672{
673 return displayAddress( homeStreet(), homeCity(), 673 return displayAddress( homeStreet(), homeCity(),
674 homeState(), homeZip(), 674 homeState(), homeZip(),
675 homeCountry() ); 675 homeCountry() );
676} 676}
677 677
678/*! 678/*!
679 Returns the full name of the contact 679 Returns the full name of the contact
680*/ 680*/
681QString OContact::fullName() const 681QString OContact::fullName() const
682{ 682{
683 QString title = find( Qtopia::Title ); 683 QString title = find( Qtopia::Title );
684 QString firstName = find( Qtopia::FirstName ); 684 QString firstName = find( Qtopia::FirstName );
685 QString middleName = find( Qtopia::MiddleName ); 685 QString middleName = find( Qtopia::MiddleName );
686 QString lastName = find( Qtopia::LastName ); 686 QString lastName = find( Qtopia::LastName );
687 QString suffix = find( Qtopia::Suffix ); 687 QString suffix = find( Qtopia::Suffix );
688 688
689 QString name = title; 689 QString name = title;
690 if ( !firstName.isEmpty() ) { 690 if ( !firstName.isEmpty() ) {
691 if ( !name.isEmpty() ) 691 if ( !name.isEmpty() )
692 name += " "; 692 name += " ";
693 name += firstName; 693 name += firstName;
694 } 694 }
695 if ( !middleName.isEmpty() ) { 695 if ( !middleName.isEmpty() ) {
696 if ( !name.isEmpty() ) 696 if ( !name.isEmpty() )
697 name += " "; 697 name += " ";
698 name += middleName; 698 name += middleName;
699 } 699 }
700 if ( !lastName.isEmpty() ) { 700 if ( !lastName.isEmpty() ) {
701 if ( !name.isEmpty() ) 701 if ( !name.isEmpty() )
702 name += " "; 702 name += " ";
703 name += lastName; 703 name += lastName;
704 } 704 }
705 if ( !suffix.isEmpty() ) { 705 if ( !suffix.isEmpty() ) {
706 if ( !name.isEmpty() ) 706 if ( !name.isEmpty() )
707 name += " "; 707 name += " ";
708 name += suffix; 708 name += suffix;
709 } 709 }
710 return name.simplifyWhiteSpace(); 710 return name.simplifyWhiteSpace();
711} 711}
712 712
713/*! 713/*!
714 Returns a list of the names of the children of the contact. 714 Returns a list of the names of the children of the contact.
715*/ 715*/
716QStringList OContact::childrenList() const 716QStringList OContact::childrenList() const
717{ 717{
718 return QStringList::split( " ", find( Qtopia::Children ) ); 718 return QStringList::split( " ", find( Qtopia::Children ) );
719} 719}
720 720
721/*! \fn void OContact::insertEmail( const QString &email ) 721/*! \fn void OContact::insertEmail( const QString &email )
722 722
723 Insert \a email into the email list. Ensures \a email can only be added 723 Insert \a email into the email list. Ensures \a email can only be added
724 once. If there is no default email address set, it sets it to the \a email. 724 once. If there is no default email address set, it sets it to the \a email.
725*/ 725*/
726 726
727/*! \fn void OContact::removeEmail( const QString &email ) 727/*! \fn void OContact::removeEmail( const QString &email )
728 728
729 Removes the \a email from the email list. If the default email was \a email, 729 Removes the \a email from the email list. If the default email was \a email,
730 then the default email address is assigned to the first email in the 730 then the default email address is assigned to the first email in the
731 email list 731 email list
732*/ 732*/
733 733
734/*! \fn void OContact::clearEmails() 734/*! \fn void OContact::clearEmails()
735 735
736 Clears the email list. 736 Clears the email list.
737 */ 737 */
738 738
739/*! \fn void OContact::insertEmails( const QStringList &emailList ) 739/*! \fn void OContact::insertEmails( const QStringList &emailList )
740 740
741 Appends the \a emailList to the exiting email list 741 Appends the \a emailList to the exiting email list
742 */ 742 */
743 743
744/*! 744/*!
745 Returns a list of email addresses belonging to the contact, including 745 Returns a list of email addresses belonging to the contact, including
746 the default email address. 746 the default email address.
747*/ 747*/
748QStringList OContact::emailList() const 748QStringList OContact::emailList() const
749{ 749{
750 QString emailStr = emails(); 750 QString emailStr = emails();
751 751
752 QStringList r; 752 QStringList r;
753 if ( !emailStr.isEmpty() ) { 753 if ( !emailStr.isEmpty() ) {
754 qDebug(" emailstr "); 754 qDebug(" emailstr ");
755 QStringList l = QStringList::split( emailSeparator(), emailStr ); 755 QStringList l = QStringList::split( emailSeparator(), emailStr );
756 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) 756 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
757 r += (*it).simplifyWhiteSpace(); 757 r += (*it).simplifyWhiteSpace();
758 } 758 }
759 759
760 return r; 760 return r;
761} 761}
762 762
763/*! 763/*!
764 \overload 764 \overload
765 765
766 Generates the string for the contact to be filed as from the first, 766 Generates the string for the contact to be filed as from the first,
767 middle and last name of the contact. 767 middle and last name of the contact.
768*/ 768*/
769void OContact::setFileAs() 769void OContact::setFileAs()
770{ 770{
771 QString lastName, firstName, middleName, fileas; 771 QString lastName, firstName, middleName, fileas;
@@ -934,428 +934,441 @@ QStringList OContact::trfields()
934 list.append( QObject::tr( "Children" ) ); 934 list.append( QObject::tr( "Children" ) );
935 935
936 list.append( QObject::tr( "Notes" ) ); 936 list.append( QObject::tr( "Notes" ) );
937 list.append( QObject::tr( "Groups" ) ); 937 list.append( QObject::tr( "Groups" ) );
938 938
939 return list; 939 return list;
940} 940}
941 941
942/*! 942/*!
943 \internal 943 \internal
944 Returns an untranslated list of field names for a contact. 944 Returns an untranslated list of field names for a contact.
945*/ 945*/
946QStringList OContact::untrfields() 946QStringList OContact::untrfields()
947{ 947{
948 QStringList list; 948 QStringList list;
949 949
950 list.append( "Name Title" ); 950 list.append( "Name Title" );
951 list.append( "First Name" ); 951 list.append( "First Name" );
952 list.append( "Middle Name" ); 952 list.append( "Middle Name" );
953 list.append( "Last Name" ); 953 list.append( "Last Name" );
954 list.append( "Suffix" ); 954 list.append( "Suffix" );
955 list.append( "File As" ); 955 list.append( "File As" );
956 956
957 list.append( "Job Title" ); 957 list.append( "Job Title" );
958 list.append( "Department" ); 958 list.append( "Department" );
959 list.append( "Company" ); 959 list.append( "Company" );
960 list.append( "Business Phone" ); 960 list.append( "Business Phone" );
961 list.append( "Business Fax" ); 961 list.append( "Business Fax" );
962 list.append( "Business Mobile" ); 962 list.append( "Business Mobile" );
963 963
964 list.append( "Default Email" ); 964 list.append( "Default Email" );
965 list.append( "Emails" ); 965 list.append( "Emails" );
966 966
967 list.append( "Home Phone" ); 967 list.append( "Home Phone" );
968 list.append( "Home Fax" ); 968 list.append( "Home Fax" );
969 list.append( "Home Mobile" ); 969 list.append( "Home Mobile" );
970 970
971 list.append( "Business Street" ); 971 list.append( "Business Street" );
972 list.append( "Business City" ); 972 list.append( "Business City" );
973 list.append( "Business State" ); 973 list.append( "Business State" );
974 list.append( "Business Zip" ); 974 list.append( "Business Zip" );
975 list.append( "Business Country" ); 975 list.append( "Business Country" );
976 list.append( "Business Pager" ); 976 list.append( "Business Pager" );
977 list.append( "Business WebPage" ); 977 list.append( "Business WebPage" );
978 978
979 list.append( "Office" ); 979 list.append( "Office" );
980 list.append( "Profession" ); 980 list.append( "Profession" );
981 list.append( "Assistant" ); 981 list.append( "Assistant" );
982 list.append( "Manager" ); 982 list.append( "Manager" );
983 983
984 list.append( "Home Street" ); 984 list.append( "Home Street" );
985 list.append( "Home City" ); 985 list.append( "Home City" );
986 list.append( "Home State" ); 986 list.append( "Home State" );
987 list.append( "Home Zip" ); 987 list.append( "Home Zip" );
988 list.append( "Home Country" ); 988 list.append( "Home Country" );
989 list.append( "Home Web Page" ); 989 list.append( "Home Web Page" );
990 990
991 list.append( "Spouse" ); 991 list.append( "Spouse" );
992 list.append( "Gender" ); 992 list.append( "Gender" );
993 list.append( "Birthday" ); 993 list.append( "Birthday" );
994 list.append( "Anniversary" ); 994 list.append( "Anniversary" );
995 list.append( "Nickname" ); 995 list.append( "Nickname" );
996 list.append( "Children" ); 996 list.append( "Children" );
997 997
998 list.append( "Notes" ); 998 list.append( "Notes" );
999 list.append( "Groups" ); 999 list.append( "Groups" );
1000 1000
1001 return list; 1001 return list;
1002} 1002}
1003 1003
1004/*! 1004/*!
1005 Sets the list of email address for contact to those contained in \a str. 1005 Sets the list of email address for contact to those contained in \a str.
1006 Email address should be separated by ';'s. 1006 Email address should be separated by ';'s.
1007*/ 1007*/
1008void OContact::setEmails( const QString &str ) 1008void OContact::setEmails( const QString &str )
1009{ 1009{
1010 replace( Qtopia::Emails, str ); 1010 replace( Qtopia::Emails, str );
1011 if ( str.isEmpty() ) 1011 if ( str.isEmpty() )
1012 setDefaultEmail( QString::null ); 1012 setDefaultEmail( QString::null );
1013} 1013}
1014 1014
1015/*! 1015/*!
1016 Sets the list of children for the contact to those contained in \a str. 1016 Sets the list of children for the contact to those contained in \a str.
1017*/ 1017*/
1018void OContact::setChildren( const QString &str ) 1018void OContact::setChildren( const QString &str )
1019{ 1019{
1020 replace( Qtopia::Children, str ); 1020 replace( Qtopia::Children, str );
1021} 1021}
1022 1022
1023// vcard conversion code 1023// vcard conversion code
1024/*! 1024/*!
1025 \internal 1025 \internal
1026*/ 1026*/
1027static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) 1027static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value )
1028{ 1028{
1029 VObject *ret = 0; 1029 VObject *ret = 0;
1030 if ( o && !value.isEmpty() ) 1030 if ( o && !value.isEmpty() )
1031 ret = addPropValue( o, prop, value.latin1() ); 1031 ret = addPropValue( o, prop, value.latin1() );
1032 return ret; 1032 return ret;
1033} 1033}
1034 1034
1035/*! 1035/*!
1036 \internal 1036 \internal
1037*/ 1037*/
1038static inline VObject *safeAddProp( VObject *o, const char *prop) 1038static inline VObject *safeAddProp( VObject *o, const char *prop)
1039{ 1039{
1040 VObject *ret = 0; 1040 VObject *ret = 0;
1041 if ( o ) 1041 if ( o )
1042 ret = addProp( o, prop ); 1042 ret = addProp( o, prop );
1043 return ret; 1043 return ret;
1044} 1044}
1045 1045
1046/*! 1046/*!
1047 \internal 1047 \internal
1048*/ 1048*/
1049static VObject *createVObject( const OContact &c ) 1049static VObject *createVObject( const OContact &c )
1050{ 1050{
1051 VObject *vcard = newVObject( VCCardProp ); 1051 VObject *vcard = newVObject( VCCardProp );
1052 safeAddPropValue( vcard, VCVersionProp, "2.1" ); 1052 safeAddPropValue( vcard, VCVersionProp, "2.1" );
1053 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); 1053 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) );
1054 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); 1054 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) );
1055 1055
1056 // full name 1056 // full name
1057 safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); 1057 safeAddPropValue( vcard, VCFullNameProp, c.fullName() );
1058 1058
1059 // name properties 1059 // name properties
1060 VObject *name = safeAddProp( vcard, VCNameProp ); 1060 VObject *name = safeAddProp( vcard, VCNameProp );
1061 safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); 1061 safeAddPropValue( name, VCFamilyNameProp, c.lastName() );
1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
1066 1066
1067 // home properties 1067 // home properties
1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
1069 safeAddProp( home_adr, VCHomeProp ); 1069 safeAddProp( home_adr, VCHomeProp );
1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
1075 1075
1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
1077 safeAddProp( home_phone, VCHomeProp ); 1077 safeAddProp( home_phone, VCHomeProp );
1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
1079 safeAddProp( home_phone, VCHomeProp ); 1079 safeAddProp( home_phone, VCHomeProp );
1080 safeAddProp( home_phone, VCCellularProp ); 1080 safeAddProp( home_phone, VCCellularProp );
1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
1082 safeAddProp( home_phone, VCHomeProp ); 1082 safeAddProp( home_phone, VCHomeProp );
1083 safeAddProp( home_phone, VCFaxProp ); 1083 safeAddProp( home_phone, VCFaxProp );
1084 1084
1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
1086 safeAddProp( url, VCHomeProp ); 1086 safeAddProp( url, VCHomeProp );
1087 1087
1088 // work properties 1088 // work properties
1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
1090 safeAddProp( work_adr, VCWorkProp ); 1090 safeAddProp( work_adr, VCWorkProp );
1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
1096 1096
1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1098 safeAddProp( work_phone, VCWorkProp ); 1098 safeAddProp( work_phone, VCWorkProp );
1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1100 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1101 safeAddProp( work_phone, VCCellularProp ); 1101 safeAddProp( work_phone, VCCellularProp );
1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1103 safeAddProp( work_phone, VCWorkProp ); 1103 safeAddProp( work_phone, VCWorkProp );
1104 safeAddProp( work_phone, VCFaxProp ); 1104 safeAddProp( work_phone, VCFaxProp );
1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1106 safeAddProp( work_phone, VCWorkProp ); 1106 safeAddProp( work_phone, VCWorkProp );
1107 safeAddProp( work_phone, VCPagerProp ); 1107 safeAddProp( work_phone, VCPagerProp );
1108 1108
1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1110 safeAddProp( url, VCWorkProp ); 1110 safeAddProp( url, VCWorkProp );
1111 1111
1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1113 safeAddProp( title, VCWorkProp ); 1113 safeAddProp( title, VCWorkProp );
1114 1114
1115 1115
1116 QStringList emails = c.emailList(); 1116 QStringList emails = c.emailList();
1117 emails.prepend( c.defaultEmail() ); 1117 emails.prepend( c.defaultEmail() );
1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1120 safeAddProp( email, VCInternetProp ); 1120 safeAddProp( email, VCInternetProp );
1121 } 1121 }
1122 1122
1123 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1123 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1124 1124
1125 // Exporting Birthday regarding RFC 2425 (5.8.4) 1125 // Exporting Birthday regarding RFC 2425 (5.8.4)
1126 if ( !c.birthday().isNull() ){ 1126 if ( !c.birthday().isValid() ){
1127 QString birthd_rfc2425 = c.birthday().year() + QString( "-" ) + c.birthday().month() + QString( "-" ) + c.birthday().day(); 1127 QString birthd_rfc2425 = QString("%1-%2-%3")
1128 .arg( c.birthday().year() )
1129 .arg( c.birthday().month(), 2 )
1130 .arg( c.birthday().day(), 2 );
1131 // Now replace spaces with "0"...
1132 int pos = 0;
1133 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1134 birthd_rfc2425.replace( pos, 1, "0" );
1135
1128 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1136 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1129 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1137 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1130 } 1138 }
1131 1139
1132 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1140 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1133 VObject *org = safeAddProp( vcard, VCOrgProp ); 1141 VObject *org = safeAddProp( vcard, VCOrgProp );
1134 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1142 safeAddPropValue( org, VCOrgNameProp, c.company() );
1135 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1143 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1136 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1144 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1137 } 1145 }
1138 1146
1139 // some values we have to export as custom fields 1147 // some values we have to export as custom fields
1140 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1148 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1141 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1149 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1142 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1143 1151
1144 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1145 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1153 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1146 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1154 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1147 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1148 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1156 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1149 1157
1150 return vcard; 1158 return vcard;
1151} 1159}
1152 1160
1153 1161
1154/*! 1162/*!
1155 \internal 1163 \internal
1156*/ 1164*/
1157static QDate convVCardDateToDate( const QString& datestr ) 1165static QDate convVCardDateToDate( const QString& datestr )
1158{ 1166{
1159 int monthPos = datestr.find('-'); 1167 int monthPos = datestr.find('-');
1160 int dayPos = datestr.find('-', monthPos+1 ); 1168 int dayPos = datestr.find('-', monthPos+1 );
1169 int sep_ignore = 1;
1161 if ( monthPos == -1 || dayPos == -1 ) { 1170 if ( monthPos == -1 || dayPos == -1 ) {
1162 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1171 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1163 return QDate(); 1172 // Ok.. Outlook is violating ISO 8601, therefore we will try to read their format ( YYYYMMDD )
1173 monthPos = 4;
1174 dayPos = 6;
1175 sep_ignore = 0;
1176 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1164 } 1177 }
1165 int y = datestr.left( monthPos ).toInt(); 1178 int y = datestr.left( monthPos ).toInt();
1166 int m = datestr.mid( monthPos+1, dayPos - monthPos - 1 ).toInt(); 1179 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt();
1167 int d = datestr.mid( dayPos+1 ).toInt(); 1180 int d = datestr.mid( dayPos + sep_ignore ).toInt();
1168 QDate date ( y,m,d );
1169 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); 1181 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos);
1182 QDate date ( y,m,d );
1170 return date; 1183 return date;
1171} 1184}
1172 1185
1173static OContact parseVObject( VObject *obj ) 1186static OContact parseVObject( VObject *obj )
1174{ 1187{
1175 OContact c; 1188 OContact c;
1176 1189
1177 VObjectIterator it; 1190 VObjectIterator it;
1178 initPropIterator( &it, obj ); 1191 initPropIterator( &it, obj );
1179 while( moreIteration( &it ) ) { 1192 while( moreIteration( &it ) ) {
1180 VObject *o = nextVObject( &it ); 1193 VObject *o = nextVObject( &it );
1181 QCString name = vObjectName( o ); 1194 QCString name = vObjectName( o );
1182 QCString value = vObjectStringZValue( o ); 1195 QCString value = vObjectStringZValue( o );
1183 if ( name == VCNameProp ) { 1196 if ( name == VCNameProp ) {
1184 VObjectIterator nit; 1197 VObjectIterator nit;
1185 initPropIterator( &nit, o ); 1198 initPropIterator( &nit, o );
1186 while( moreIteration( &nit ) ) { 1199 while( moreIteration( &nit ) ) {
1187 VObject *o = nextVObject( &nit ); 1200 VObject *o = nextVObject( &nit );
1188 QCString name = vObjectTypeInfo( o ); 1201 QCString name = vObjectTypeInfo( o );
1189 QString value = vObjectStringZValue( o ); 1202 QString value = vObjectStringZValue( o );
1190 if ( name == VCNamePrefixesProp ) 1203 if ( name == VCNamePrefixesProp )
1191 c.setTitle( value ); 1204 c.setTitle( value );
1192 else if ( name == VCNameSuffixesProp ) 1205 else if ( name == VCNameSuffixesProp )
1193 c.setSuffix( value ); 1206 c.setSuffix( value );
1194 else if ( name == VCFamilyNameProp ) 1207 else if ( name == VCFamilyNameProp )
1195 c.setLastName( value ); 1208 c.setLastName( value );
1196 else if ( name == VCGivenNameProp ) 1209 else if ( name == VCGivenNameProp )
1197 c.setFirstName( value ); 1210 c.setFirstName( value );
1198 else if ( name == VCAdditionalNamesProp ) 1211 else if ( name == VCAdditionalNamesProp )
1199 c.setMiddleName( value ); 1212 c.setMiddleName( value );
1200 } 1213 }
1201 } 1214 }
1202 else if ( name == VCAdrProp ) { 1215 else if ( name == VCAdrProp ) {
1203 bool work = TRUE; // default address is work address 1216 bool work = TRUE; // default address is work address
1204 QString street; 1217 QString street;
1205 QString city; 1218 QString city;
1206 QString region; 1219 QString region;
1207 QString postal; 1220 QString postal;
1208 QString country; 1221 QString country;
1209 1222
1210 VObjectIterator nit; 1223 VObjectIterator nit;
1211 initPropIterator( &nit, o ); 1224 initPropIterator( &nit, o );
1212 while( moreIteration( &nit ) ) { 1225 while( moreIteration( &nit ) ) {
1213 VObject *o = nextVObject( &nit ); 1226 VObject *o = nextVObject( &nit );
1214 QCString name = vObjectName( o ); 1227 QCString name = vObjectName( o );
1215 QString value = vObjectStringZValue( o ); 1228 QString value = vObjectStringZValue( o );
1216 if ( name == VCHomeProp ) 1229 if ( name == VCHomeProp )
1217 work = FALSE; 1230 work = FALSE;
1218 else if ( name == VCWorkProp ) 1231 else if ( name == VCWorkProp )
1219 work = TRUE; 1232 work = TRUE;
1220 else if ( name == VCStreetAddressProp ) 1233 else if ( name == VCStreetAddressProp )
1221 street = value; 1234 street = value;
1222 else if ( name == VCCityProp ) 1235 else if ( name == VCCityProp )
1223 city = value; 1236 city = value;
1224 else if ( name == VCRegionProp ) 1237 else if ( name == VCRegionProp )
1225 region = value; 1238 region = value;
1226 else if ( name == VCPostalCodeProp ) 1239 else if ( name == VCPostalCodeProp )
1227 postal = value; 1240 postal = value;
1228 else if ( name == VCCountryNameProp ) 1241 else if ( name == VCCountryNameProp )
1229 country = value; 1242 country = value;
1230 } 1243 }
1231 if ( work ) { 1244 if ( work ) {
1232 c.setBusinessStreet( street ); 1245 c.setBusinessStreet( street );
1233 c.setBusinessCity( city ); 1246 c.setBusinessCity( city );
1234 c.setBusinessCountry( country ); 1247 c.setBusinessCountry( country );
1235 c.setBusinessZip( postal ); 1248 c.setBusinessZip( postal );
1236 c.setBusinessState( region ); 1249 c.setBusinessState( region );
1237 } else { 1250 } else {
1238 c.setHomeStreet( street ); 1251 c.setHomeStreet( street );
1239 c.setHomeCity( city ); 1252 c.setHomeCity( city );
1240 c.setHomeCountry( country ); 1253 c.setHomeCountry( country );
1241 c.setHomeZip( postal ); 1254 c.setHomeZip( postal );
1242 c.setHomeState( region ); 1255 c.setHomeState( region );
1243 } 1256 }
1244 } 1257 }
1245 else if ( name == VCTelephoneProp ) { 1258 else if ( name == VCTelephoneProp ) {
1246 enum { 1259 enum {
1247 HOME = 0x01, 1260 HOME = 0x01,
1248 WORK = 0x02, 1261 WORK = 0x02,
1249 VOICE = 0x04, 1262 VOICE = 0x04,
1250 CELL = 0x08, 1263 CELL = 0x08,
1251 FAX = 0x10, 1264 FAX = 0x10,
1252 PAGER = 0x20, 1265 PAGER = 0x20,
1253 UNKNOWN = 0x80 1266 UNKNOWN = 0x80
1254 }; 1267 };
1255 int type = 0; 1268 int type = 0;
1256 1269
1257 VObjectIterator nit; 1270 VObjectIterator nit;
1258 initPropIterator( &nit, o ); 1271 initPropIterator( &nit, o );
1259 while( moreIteration( &nit ) ) { 1272 while( moreIteration( &nit ) ) {
1260 VObject *o = nextVObject( &nit ); 1273 VObject *o = nextVObject( &nit );
1261 QCString name = vObjectTypeInfo( o ); 1274 QCString name = vObjectTypeInfo( o );
1262 if ( name == VCHomeProp ) 1275 if ( name == VCHomeProp )
1263 type |= HOME; 1276 type |= HOME;
1264 else if ( name == VCWorkProp ) 1277 else if ( name == VCWorkProp )
1265 type |= WORK; 1278 type |= WORK;
1266 else if ( name == VCVoiceProp ) 1279 else if ( name == VCVoiceProp )
1267 type |= VOICE; 1280 type |= VOICE;
1268 else if ( name == VCCellularProp ) 1281 else if ( name == VCCellularProp )
1269 type |= CELL; 1282 type |= CELL;
1270 else if ( name == VCFaxProp ) 1283 else if ( name == VCFaxProp )
1271 type |= FAX; 1284 type |= FAX;
1272 else if ( name == VCPagerProp ) 1285 else if ( name == VCPagerProp )
1273 type |= PAGER; 1286 type |= PAGER;
1274 else if ( name == VCPreferredProp ) 1287 else if ( name == VCPreferredProp )
1275 ; 1288 ;
1276 else 1289 else
1277 type |= UNKNOWN; 1290 type |= UNKNOWN;
1278 } 1291 }
1279 if ( (type & UNKNOWN) != UNKNOWN ) { 1292 if ( (type & UNKNOWN) != UNKNOWN ) {
1280 if ( ( type & (HOME|WORK) ) == 0 ) // default 1293 if ( ( type & (HOME|WORK) ) == 0 ) // default
1281 type |= HOME; 1294 type |= HOME;
1282 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 1295 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
1283 type |= VOICE; 1296 type |= VOICE;
1284 1297
1285 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) 1298 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) )
1286 c.setHomePhone( value ); 1299 c.setHomePhone( value );
1287 if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) 1300 if ( ( type & (FAX|HOME) ) == (FAX|HOME) )
1288 c.setHomeFax( value ); 1301 c.setHomeFax( value );
1289 if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) 1302 if ( ( type & (CELL|HOME) ) == (CELL|HOME) )
1290 c.setHomeMobile( value ); 1303 c.setHomeMobile( value );
1291 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) 1304 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) )
1292 c.setBusinessPhone( value ); 1305 c.setBusinessPhone( value );
1293 if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) 1306 if ( ( type & (FAX|WORK) ) == (FAX|WORK) )
1294 c.setBusinessFax( value ); 1307 c.setBusinessFax( value );
1295 if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) 1308 if ( ( type & (CELL|WORK) ) == (CELL|WORK) )
1296 c.setBusinessMobile( value ); 1309 c.setBusinessMobile( value );
1297 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) 1310 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) )
1298 c.setBusinessPager( value ); 1311 c.setBusinessPager( value );
1299 } 1312 }
1300 } 1313 }
1301 else if ( name == VCEmailAddressProp ) { 1314 else if ( name == VCEmailAddressProp ) {
1302 QString email = vObjectStringZValue( o ); 1315 QString email = vObjectStringZValue( o );
1303 bool valid = TRUE; 1316 bool valid = TRUE;
1304 VObjectIterator nit; 1317 VObjectIterator nit;
1305 initPropIterator( &nit, o ); 1318 initPropIterator( &nit, o );
1306 while( moreIteration( &nit ) ) { 1319 while( moreIteration( &nit ) ) {
1307 VObject *o = nextVObject( &nit ); 1320 VObject *o = nextVObject( &nit );
1308 QCString name = vObjectTypeInfo( o ); 1321 QCString name = vObjectTypeInfo( o );
1309 if ( name != VCInternetProp && name != VCHomeProp && 1322 if ( name != VCInternetProp && name != VCHomeProp &&
1310 name != VCWorkProp && 1323 name != VCWorkProp &&
1311 name != VCPreferredProp ) 1324 name != VCPreferredProp )
1312 // ### preffered should map to default email 1325 // ### preffered should map to default email
1313 valid = FALSE; 1326 valid = FALSE;
1314 } 1327 }
1315 if ( valid ) { 1328 if ( valid ) {
1316 c.insertEmail( email ); 1329 c.insertEmail( email );
1317 } 1330 }
1318 } 1331 }
1319 else if ( name == VCURLProp ) { 1332 else if ( name == VCURLProp ) {
1320 VObjectIterator nit; 1333 VObjectIterator nit;
1321 initPropIterator( &nit, o ); 1334 initPropIterator( &nit, o );
1322 while( moreIteration( &nit ) ) { 1335 while( moreIteration( &nit ) ) {
1323 VObject *o = nextVObject( &nit ); 1336 VObject *o = nextVObject( &nit );
1324 QCString name = vObjectTypeInfo( o ); 1337 QCString name = vObjectTypeInfo( o );
1325 if ( name == VCHomeProp ) 1338 if ( name == VCHomeProp )
1326 c.setHomeWebpage( value ); 1339 c.setHomeWebpage( value );
1327 else if ( name == VCWorkProp ) 1340 else if ( name == VCWorkProp )
1328 c.setBusinessWebpage( value ); 1341 c.setBusinessWebpage( value );
1329 } 1342 }
1330 } 1343 }
1331 else if ( name == VCOrgProp ) { 1344 else if ( name == VCOrgProp ) {
1332 VObjectIterator nit; 1345 VObjectIterator nit;
1333 initPropIterator( &nit, o ); 1346 initPropIterator( &nit, o );
1334 while( moreIteration( &nit ) ) { 1347 while( moreIteration( &nit ) ) {
1335 VObject *o = nextVObject( &nit ); 1348 VObject *o = nextVObject( &nit );
1336 QCString name = vObjectName( o ); 1349 QCString name = vObjectName( o );
1337 QString value = vObjectStringZValue( o ); 1350 QString value = vObjectStringZValue( o );
1338 if ( name == VCOrgNameProp ) 1351 if ( name == VCOrgNameProp )
1339 c.setCompany( value ); 1352 c.setCompany( value );
1340 else if ( name == VCOrgUnitProp ) 1353 else if ( name == VCOrgUnitProp )
1341 c.setDepartment( value ); 1354 c.setDepartment( value );
1342 else if ( name == VCOrgUnit2Prop ) 1355 else if ( name == VCOrgUnit2Prop )
1343 c.setOffice( value ); 1356 c.setOffice( value );
1344 } 1357 }
1345 } 1358 }
1346 else if ( name == VCTitleProp ) { 1359 else if ( name == VCTitleProp ) {
1347 c.setJobTitle( value ); 1360 c.setJobTitle( value );
1348 } 1361 }
1349 else if ( name == "X-Qtopia-Profession" ) { 1362 else if ( name == "X-Qtopia-Profession" ) {
1350 c.setProfession( value ); 1363 c.setProfession( value );
1351 } 1364 }
1352 else if ( name == "X-Qtopia-Manager" ) { 1365 else if ( name == "X-Qtopia-Manager" ) {
1353 c.setManager( value ); 1366 c.setManager( value );
1354 } 1367 }
1355 else if ( name == "X-Qtopia-Assistant" ) { 1368 else if ( name == "X-Qtopia-Assistant" ) {
1356 c.setAssistant( value ); 1369 c.setAssistant( value );
1357 } 1370 }
1358 else if ( name == "X-Qtopia-Spouse" ) { 1371 else if ( name == "X-Qtopia-Spouse" ) {
1359 c.setSpouse( value ); 1372 c.setSpouse( value );
1360 } 1373 }
1361 else if ( name == "X-Qtopia-Gender" ) { 1374 else if ( name == "X-Qtopia-Gender" ) {