summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontact.cpp33
-rw-r--r--libopie2/opiepim/ocontact.cpp33
2 files changed, 38 insertions, 28 deletions
diff --git a/libopie/pim/ocontact.cpp b/libopie/pim/ocontact.cpp
index bf27d0f..acd65c4 100644
--- a/libopie/pim/ocontact.cpp
+++ b/libopie/pim/ocontact.cpp
@@ -8,137 +8,139 @@
8** GNU General Public License version 2 as published by the Free Software 8** GNU General Public License version 2 as published by the Free Software
9** Foundation and appearing in the file LICENSE.GPL included in the 9** Foundation and appearing in the file LICENSE.GPL included in the
10** packaging of this file. 10** packaging of this file.
11** 11**
12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14** 14**
15** See http://www.trolltech.com/gpl/ for GPL licensing information. 15** See http://www.trolltech.com/gpl/ for GPL licensing information.
16** 16**
17** Contact info@trolltech.com if any conditions of this licensing are 17** Contact info@trolltech.com if any conditions of this licensing are
18** not clear to you. 18** not clear to you.
19** 19**
20**********************************************************************/ 20**********************************************************************/
21 21
22#define QTOPIA_INTERNAL_CONTACT_MRE 22#define QTOPIA_INTERNAL_CONTACT_MRE
23 23
24#include "ocontact.h" 24#include "ocontact.h"
25#include "../../library/backend/vobject_p.h" 25#include "../../library/backend/vobject_p.h"
26#include "../../library/backend/qfiledirect_p.h" 26#include "../../library/backend/qfiledirect_p.h"
27 27
28#include <qpe/stringutil.h> 28#include <qpe/stringutil.h>
29#include <qpe/timeconversion.h> 29#include <qpe/timeconversion.h>
30#include <qpe/timestring.h> 30#include <qpe/timestring.h>
31 31
32#include <qobject.h> 32#include <qobject.h>
33#include <qregexp.h> 33#include <qregexp.h>
34#include <qstylesheet.h> 34#include <qstylesheet.h>
35#include <qfileinfo.h> 35#include <qfileinfo.h>
36#include <qmap.h> 36#include <qmap.h>
37 37
38#include <stdio.h> 38#include <stdio.h>
39 39
40/*! 40/*!
41 \class Contact contact.h 41 \class Contact contact.h
42 \brief The Contact class holds the data of an address book entry. 42 \brief The Contact class holds the data of an address book entry.
43 43
44 This data includes information the name of the person, contact 44 This data includes information the name of the person, contact
45 information, and business information such as deparment and job title. 45 information, and business information such as deparment and job title.
46 46
47 \ingroup qtopiaemb 47 \ingroup qtopiaemb
48 \ingroup qtopiadesktop 48 \ingroup qtopiadesktop
49*/ 49*/
50 50
51Qtopia::UidGen OContact::sUidGen( Qtopia::UidGen::Qtopia ); 51Qtopia::UidGen OContact::sUidGen( Qtopia::UidGen::Qtopia );
52 52
53/*! 53/*!
54 Creates a new, empty contact. 54 Creates a new, empty contact.
55*/ 55*/
56OContact::OContact() 56OContact::OContact()
57 : OPimRecord(), mMap(), d( 0 ) 57 : OPimRecord(), mMap(), d( 0 )
58{ 58{
59} 59}
60 60
61/*! 61/*!
62 \internal 62 \internal
63 Creates a new contact. The properties of the contact are 63 Creates a new contact. The properties of the contact are
64 set from \a fromMap. 64 set from \a fromMap.
65*/ 65*/
66OContact::OContact( const QMap<int, QString> &fromMap ) : 66OContact::OContact( const QMap<int, QString> &fromMap ) :
67 OPimRecord(), mMap( fromMap ), d( 0 ) 67 OPimRecord(), mMap( fromMap ), d( 0 )
68{ 68{
69 QString cats = mMap[ Qtopia::AddressCategory ]; 69 QString cats = mMap[ Qtopia::AddressCategory ];
70 if ( !cats.isEmpty() ) 70 if ( !cats.isEmpty() )
71 setCategories( idsFromString( cats ) ); 71 setCategories( idsFromString( cats ) );
72
72 QString uidStr = find( Qtopia::AddressUid ); 73 QString uidStr = find( Qtopia::AddressUid );
73 74
74 if ( uidStr.isEmpty() ) 75 if ( uidStr.isEmpty() || (uidStr.toInt() == 0) ){
76 qWarning( "Invalid UID found. Generate new one.." );
75 setUid( uidGen().generate() ); 77 setUid( uidGen().generate() );
76 else 78 }else
77 setUid( uidStr.toInt() ); 79 setUid( uidStr.toInt() );
78 80
79 if ( !uidStr.isEmpty() ) 81// if ( !uidStr.isEmpty() )
80 setUid( uidStr.toInt() ); 82 // setUid( uidStr.toInt() );
81} 83}
82 84
83/*! 85/*!
84 Destroys a contact. 86 Destroys a contact.
85*/ 87*/
86OContact::~OContact() 88OContact::~OContact()
87{ 89{
88} 90}
89 91
90/*! \fn void OContact::setTitle( const QString &str ) 92/*! \fn void OContact::setTitle( const QString &str )
91 Sets the title of the contact to \a str. 93 Sets the title of the contact to \a str.
92*/ 94*/
93 95
94/*! \fn void OContact::setFirstName( const QString &str ) 96/*! \fn void OContact::setFirstName( const QString &str )
95 Sets the first name of the contact to \a str. 97 Sets the first name of the contact to \a str.
96*/ 98*/
97 99
98/*! \fn void OContact::setMiddleName( const QString &str ) 100/*! \fn void OContact::setMiddleName( const QString &str )
99 Sets the middle name of the contact to \a str. 101 Sets the middle name of the contact to \a str.
100*/ 102*/
101 103
102/*! \fn void OContact::setLastName( const QString &str ) 104/*! \fn void OContact::setLastName( const QString &str )
103 Sets the last name of the contact to \a str. 105 Sets the last name of the contact to \a str.
104*/ 106*/
105 107
106/*! \fn void OContact::setSuffix( const QString &str ) 108/*! \fn void OContact::setSuffix( const QString &str )
107 Sets the suffix of the contact to \a str. 109 Sets the suffix of the contact to \a str.
108*/ 110*/
109 111
110/*! \fn void OContact::setFileAs( const QString &str ) 112/*! \fn void OContact::setFileAs( const QString &str )
111 Sets the contact to filed as \a str. 113 Sets the contact to filed as \a str.
112*/ 114*/
113 115
114/*! \fn void OContact::setDefaultEmail( const QString &str ) 116/*! \fn void OContact::setDefaultEmail( const QString &str )
115 Sets the default email of the contact to \a str. 117 Sets the default email of the contact to \a str.
116*/ 118*/
117 119
118/*! \fn void OContact::setHomeStreet( const QString &str ) 120/*! \fn void OContact::setHomeStreet( const QString &str )
119 Sets the home street address of the contact to \a str. 121 Sets the home street address of the contact to \a str.
120*/ 122*/
121 123
122/*! \fn void OContact::setHomeCity( const QString &str ) 124/*! \fn void OContact::setHomeCity( const QString &str )
123 Sets the home city of the contact to \a str. 125 Sets the home city of the contact to \a str.
124*/ 126*/
125 127
126/*! \fn void OContact::setHomeState( const QString &str ) 128/*! \fn void OContact::setHomeState( const QString &str )
127 Sets the home state of the contact to \a str. 129 Sets the home state of the contact to \a str.
128*/ 130*/
129 131
130/*! \fn void OContact::setHomeZip( const QString &str ) 132/*! \fn void OContact::setHomeZip( const QString &str )
131 Sets the home zip code of the contact to \a str. 133 Sets the home zip code of the contact to \a str.
132*/ 134*/
133 135
134/*! \fn void OContact::setHomeCountry( const QString &str ) 136/*! \fn void OContact::setHomeCountry( const QString &str )
135 Sets the home country of the contact to \a str. 137 Sets the home country of the contact to \a str.
136*/ 138*/
137 139
138/*! \fn void OContact::setHomePhone( const QString &str ) 140/*! \fn void OContact::setHomePhone( const QString &str )
139 Sets the home phone number of the contact to \a str. 141 Sets the home phone number of the contact to \a str.
140*/ 142*/
141 143
142/*! \fn void OContact::setHomeFax( const QString &str ) 144/*! \fn void OContact::setHomeFax( const QString &str )
143 Sets the home fax number of the contact to \a str. 145 Sets the home fax number of the contact to \a str.
144*/ 146*/
@@ -510,134 +512,134 @@ QString OContact::toRichText() const
510 str = homePhone(); 512 str = homePhone();
511 if ( !str.isEmpty() ) 513 if ( !str.isEmpty() )
512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 514 text += "<b>" + QObject::tr("Home Phone: ") + "</b>"
513 + Qtopia::escapeString(str) + "<br>"; 515 + Qtopia::escapeString(str) + "<br>";
514 str = homeFax(); 516 str = homeFax();
515 if ( !str.isEmpty() ) 517 if ( !str.isEmpty() )
516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 518 text += "<b>" + QObject::tr("Home Fax: ") + "</b>"
517 + Qtopia::escapeString(str) + "<br>"; 519 + Qtopia::escapeString(str) + "<br>";
518 str = homeMobile(); 520 str = homeMobile();
519 if ( !str.isEmpty() ) 521 if ( !str.isEmpty() )
520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 522 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>"
521 + Qtopia::escapeString(str) + "<br>"; 523 + Qtopia::escapeString(str) + "<br>";
522 str = homeWebpage(); 524 str = homeWebpage();
523 if ( !str.isEmpty() ) 525 if ( !str.isEmpty() )
524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 526 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>"
525 + Qtopia::escapeString(str) + "<br>"; 527 + Qtopia::escapeString(str) + "<br>";
526 str = businessWebpage(); 528 str = businessWebpage();
527 if ( !str.isEmpty() ) 529 if ( !str.isEmpty() )
528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 530 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>"
529 + Qtopia::escapeString(str) + "<br>"; 531 + Qtopia::escapeString(str) + "<br>";
530 str = office(); 532 str = office();
531 if ( !str.isEmpty() ) 533 if ( !str.isEmpty() )
532 text += "<b>" + QObject::tr("Office: ") + "</b>" 534 text += "<b>" + QObject::tr("Office: ") + "</b>"
533 + Qtopia::escapeString(str) + "<br>"; 535 + Qtopia::escapeString(str) + "<br>";
534 str = businessPhone(); 536 str = businessPhone();
535 if ( !str.isEmpty() ) 537 if ( !str.isEmpty() )
536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 538 text += "<b>" + QObject::tr("Business Phone: ") + "</b>"
537 + Qtopia::escapeString(str) + "<br>"; 539 + Qtopia::escapeString(str) + "<br>";
538 str = businessFax(); 540 str = businessFax();
539 if ( !str.isEmpty() ) 541 if ( !str.isEmpty() )
540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 542 text += "<b>" + QObject::tr("Business Fax: ") + "</b>"
541 + Qtopia::escapeString(str) + "<br>"; 543 + Qtopia::escapeString(str) + "<br>";
542 str = businessMobile(); 544 str = businessMobile();
543 if ( !str.isEmpty() ) 545 if ( !str.isEmpty() )
544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 546 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>"
545 + Qtopia::escapeString(str) + "<br>"; 547 + Qtopia::escapeString(str) + "<br>";
546 str = businessPager(); 548 str = businessPager();
547 if ( !str.isEmpty() ) 549 if ( !str.isEmpty() )
548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 550 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
549 + Qtopia::escapeString(str) + "<br>"; 551 + Qtopia::escapeString(str) + "<br>";
550 str = profession(); 552 str = profession();
551 if ( !str.isEmpty() ) 553 if ( !str.isEmpty() )
552 text += "<b>" + QObject::tr("Profession: ") + "</b>" 554 text += "<b>" + QObject::tr("Profession: ") + "</b>"
553 + Qtopia::escapeString(str) + "<br>"; 555 + Qtopia::escapeString(str) + "<br>";
554 str = assistant(); 556 str = assistant();
555 if ( !str.isEmpty() ) 557 if ( !str.isEmpty() )
556 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 558 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
557 + Qtopia::escapeString(str) + "<br>"; 559 + Qtopia::escapeString(str) + "<br>";
558 str = manager(); 560 str = manager();
559 if ( !str.isEmpty() ) 561 if ( !str.isEmpty() )
560 text += "<b>" + QObject::tr("Manager: ") + "</b>" 562 text += "<b>" + QObject::tr("Manager: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 563 + Qtopia::escapeString(str) + "<br>";
562 str = gender(); 564 str = gender();
563 if ( !str.isEmpty() && str.toInt() != 0 ) { 565 if ( !str.isEmpty() && str.toInt() != 0 ) {
564 if ( str.toInt() == 1 ) 566 if ( str.toInt() == 1 )
565 str = QObject::tr( "Male" ); 567 str = QObject::tr( "Male" );
566 else if ( str.toInt() == 2 ) 568 else if ( str.toInt() == 2 )
567 str = QObject::tr( "Female" ); 569 str = QObject::tr( "Female" );
568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 570 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
569 } 571 }
570 str = spouse(); 572 str = spouse();
571 if ( !str.isEmpty() ) 573 if ( !str.isEmpty() )
572 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 574 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 575 + Qtopia::escapeString(str) + "<br>";
574 if ( !birthday().isValid() ){ 576 if ( birthday().isValid() ){
575 str = TimeString::numberDateString( birthday() ); 577 str = TimeString::numberDateString( birthday() );
576 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 578 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
577 + Qtopia::escapeString(str) + "<br>"; 579 + Qtopia::escapeString(str) + "<br>";
578 } 580 }
579 if ( !anniversary().isValid() ){ 581 if ( anniversary().isValid() ){
580 str = TimeString::numberDateString( anniversary() ); 582 str = TimeString::numberDateString( anniversary() );
581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 583 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
582 + Qtopia::escapeString(str) + "<br>"; 584 + Qtopia::escapeString(str) + "<br>";
583 } 585 }
584 str = nickname(); 586 str = nickname();
585 if ( !str.isEmpty() ) 587 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 588 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 589 + Qtopia::escapeString(str) + "<br>";
588 590
589 // notes last 591 // notes last
590 if ( (value = notes()) ) { 592 if ( (value = notes()) ) {
591 QRegExp reg("\n"); 593 QRegExp reg("\n");
592 594
593 //QString tmp = Qtopia::escapeString(value); 595 //QString tmp = Qtopia::escapeString(value);
594 QString tmp = QStyleSheet::convertFromPlainText(value); 596 QString tmp = QStyleSheet::convertFromPlainText(value);
595 //tmp.replace( reg, "<br>" ); 597 //tmp.replace( reg, "<br>" );
596 text += "<br>" + tmp + "<br>"; 598 text += "<br>" + tmp + "<br>";
597 } 599 }
598 return text; 600 return text;
599} 601}
600 602
601/*! 603/*!
602 \internal 604 \internal
603*/ 605*/
604void OContact::insert( int key, const QString &v ) 606void OContact::insert( int key, const QString &v )
605{ 607{
606 QString value = v.stripWhiteSpace(); 608 QString value = v.stripWhiteSpace();
607 if ( value.isEmpty() ) 609 if ( value.isEmpty() )
608 mMap.remove( key ); 610 mMap.remove( key );
609 else 611 else
610 mMap.insert( key, value ); 612 mMap.insert( key, value );
611} 613}
612 614
613/*! 615/*!
614 \internal 616 \internal
615*/ 617*/
616void OContact::replace( int key, const QString & v ) 618void OContact::replace( int key, const QString & v )
617{ 619{
618 QString value = v.stripWhiteSpace(); 620 QString value = v.stripWhiteSpace();
619 if ( value.isEmpty() ) 621 if ( value.isEmpty() )
620 mMap.remove( key ); 622 mMap.remove( key );
621 else 623 else
622 mMap.replace( key, value ); 624 mMap.replace( key, value );
623} 625}
624 626
625/*! 627/*!
626 \internal 628 \internal
627*/ 629*/
628QString OContact::find( int key ) const 630QString OContact::find( int key ) const
629{ 631{
630 return mMap[key]; 632 return mMap[key];
631} 633}
632 634
633/*! 635/*!
634 \internal 636 \internal
635*/ 637*/
636QString OContact::displayAddress( const QString &street, 638QString OContact::displayAddress( const QString &street,
637 const QString &city, 639 const QString &city,
638 const QString &state, 640 const QString &state,
639 const QString &zip, 641 const QString &zip,
640 const QString &country ) const 642 const QString &country ) const
641{ 643{
642 QString s = street; 644 QString s = street;
643 if ( !street.isEmpty() ) 645 if ( !street.isEmpty() )
@@ -1062,179 +1064,183 @@ static VObject *createVObject( const OContact &c )
1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 1064 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 1065 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 1066 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 1067 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
1066 1068
1067 // home properties 1069 // home properties
1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 1070 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
1069 safeAddProp( home_adr, VCHomeProp ); 1071 safeAddProp( home_adr, VCHomeProp );
1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 1072 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 1073 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 1074 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 1075 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 1076 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
1075 1077
1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 1078 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
1077 safeAddProp( home_phone, VCHomeProp ); 1079 safeAddProp( home_phone, VCHomeProp );
1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 1080 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
1079 safeAddProp( home_phone, VCHomeProp ); 1081 safeAddProp( home_phone, VCHomeProp );
1080 safeAddProp( home_phone, VCCellularProp ); 1082 safeAddProp( home_phone, VCCellularProp );
1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 1083 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
1082 safeAddProp( home_phone, VCHomeProp ); 1084 safeAddProp( home_phone, VCHomeProp );
1083 safeAddProp( home_phone, VCFaxProp ); 1085 safeAddProp( home_phone, VCFaxProp );
1084 1086
1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 1087 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
1086 safeAddProp( url, VCHomeProp ); 1088 safeAddProp( url, VCHomeProp );
1087 1089
1088 // work properties 1090 // work properties
1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 1091 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
1090 safeAddProp( work_adr, VCWorkProp ); 1092 safeAddProp( work_adr, VCWorkProp );
1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 1093 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 1094 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 1095 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 1096 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 1097 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
1096 1098
1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1098 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1100 safeAddProp( work_phone, VCWorkProp ); 1102 safeAddProp( work_phone, VCWorkProp );
1101 safeAddProp( work_phone, VCCellularProp ); 1103 safeAddProp( work_phone, VCCellularProp );
1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1103 safeAddProp( work_phone, VCWorkProp ); 1105 safeAddProp( work_phone, VCWorkProp );
1104 safeAddProp( work_phone, VCFaxProp ); 1106 safeAddProp( work_phone, VCFaxProp );
1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1106 safeAddProp( work_phone, VCWorkProp ); 1108 safeAddProp( work_phone, VCWorkProp );
1107 safeAddProp( work_phone, VCPagerProp ); 1109 safeAddProp( work_phone, VCPagerProp );
1108 1110
1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1110 safeAddProp( url, VCWorkProp ); 1112 safeAddProp( url, VCWorkProp );
1111 1113
1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1113 safeAddProp( title, VCWorkProp ); 1115 safeAddProp( title, VCWorkProp );
1114 1116
1115 1117
1116 QStringList emails = c.emailList(); 1118 QStringList emails = c.emailList();
1117 emails.prepend( c.defaultEmail() ); 1119 emails.prepend( c.defaultEmail() );
1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1120 safeAddProp( email, VCInternetProp ); 1122 safeAddProp( email, VCInternetProp );
1121 } 1123 }
1122 1124
1123 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1125 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1124 1126
1125 // Exporting Birthday regarding RFC 2425 (5.8.4) 1127 // Exporting Birthday regarding RFC 2425 (5.8.4)
1126 if ( !c.birthday().isValid() ){ 1128 if ( c.birthday().isValid() ){
1127 QString birthd_rfc2425 = QString("%1-%2-%3") 1129 QString birthd_rfc2425 = QString("%1-%2-%3")
1128 .arg( c.birthday().year() ) 1130 .arg( c.birthday().year() )
1129 .arg( c.birthday().month(), 2 ) 1131 .arg( c.birthday().month(), 2 )
1130 .arg( c.birthday().day(), 2 ); 1132 .arg( c.birthday().day(), 2 );
1131 // Now replace spaces with "0"... 1133 // Now replace spaces with "0"...
1132 int pos = 0; 1134 int pos = 0;
1133 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 ) 1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1134 birthd_rfc2425.replace( pos, 1, "0" ); 1136 birthd_rfc2425.replace( pos, 1, "0" );
1135 1137
1136 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1137 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1138 } 1140 }
1139 1141
1140 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1141 VObject *org = safeAddProp( vcard, VCOrgProp ); 1143 VObject *org = safeAddProp( vcard, VCOrgProp );
1142 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1144 safeAddPropValue( org, VCOrgNameProp, c.company() );
1143 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1145 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1144 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1145 } 1147 }
1146 1148
1147 // some values we have to export as custom fields 1149 // some values we have to export as custom fields
1148 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1149 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1150 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1151 1153
1152 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1153 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1154 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1155 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1156 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1157 1159
1158 return vcard; 1160 return vcard;
1159} 1161}
1160 1162
1161 1163
1162/*! 1164/*!
1163 \internal 1165 \internal
1164*/ 1166*/
1165static QDate convVCardDateToDate( const QString& datestr ) 1167static QDate convVCardDateToDate( const QString& datestr )
1166{ 1168{
1167 int monthPos = datestr.find('-'); 1169 int monthPos = datestr.find('-');
1168 int dayPos = datestr.find('-', monthPos+1 ); 1170 int dayPos = datestr.find('-', monthPos+1 );
1169 int sep_ignore = 1; 1171 int sep_ignore = 1;
1170 if ( monthPos == -1 || dayPos == -1 ) { 1172 if ( monthPos == -1 || dayPos == -1 ) {
1171 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1173 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1172 // Ok.. Outlook is violating ISO 8601, therefore we will try to read their format ( YYYYMMDD ) 1174 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD )
1173 monthPos = 4; 1175 if ( datestr.length() == 8 ){
1174 dayPos = 6; 1176 monthPos = 4;
1175 sep_ignore = 0; 1177 dayPos = 6;
1176 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1178 sep_ignore = 0;
1179 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1180 } else {
1181 return QDate();
1182 }
1177 } 1183 }
1178 int y = datestr.left( monthPos ).toInt(); 1184 int y = datestr.left( monthPos ).toInt();
1179 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); 1185 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt();
1180 int d = datestr.mid( dayPos + sep_ignore ).toInt(); 1186 int d = datestr.mid( dayPos + sep_ignore ).toInt();
1181 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); 1187 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 ); 1188 QDate date ( y,m,d );
1183 return date; 1189 return date;
1184} 1190}
1185 1191
1186static OContact parseVObject( VObject *obj ) 1192static OContact parseVObject( VObject *obj )
1187{ 1193{
1188 OContact c; 1194 OContact c;
1189 1195
1190 VObjectIterator it; 1196 VObjectIterator it;
1191 initPropIterator( &it, obj ); 1197 initPropIterator( &it, obj );
1192 while( moreIteration( &it ) ) { 1198 while( moreIteration( &it ) ) {
1193 VObject *o = nextVObject( &it ); 1199 VObject *o = nextVObject( &it );
1194 QCString name = vObjectName( o ); 1200 QCString name = vObjectName( o );
1195 QCString value = vObjectStringZValue( o ); 1201 QCString value = vObjectStringZValue( o );
1196 if ( name == VCNameProp ) { 1202 if ( name == VCNameProp ) {
1197 VObjectIterator nit; 1203 VObjectIterator nit;
1198 initPropIterator( &nit, o ); 1204 initPropIterator( &nit, o );
1199 while( moreIteration( &nit ) ) { 1205 while( moreIteration( &nit ) ) {
1200 VObject *o = nextVObject( &nit ); 1206 VObject *o = nextVObject( &nit );
1201 QCString name = vObjectTypeInfo( o ); 1207 QCString name = vObjectTypeInfo( o );
1202 QString value = vObjectStringZValue( o ); 1208 QString value = vObjectStringZValue( o );
1203 if ( name == VCNamePrefixesProp ) 1209 if ( name == VCNamePrefixesProp )
1204 c.setTitle( value ); 1210 c.setTitle( value );
1205 else if ( name == VCNameSuffixesProp ) 1211 else if ( name == VCNameSuffixesProp )
1206 c.setSuffix( value ); 1212 c.setSuffix( value );
1207 else if ( name == VCFamilyNameProp ) 1213 else if ( name == VCFamilyNameProp )
1208 c.setLastName( value ); 1214 c.setLastName( value );
1209 else if ( name == VCGivenNameProp ) 1215 else if ( name == VCGivenNameProp )
1210 c.setFirstName( value ); 1216 c.setFirstName( value );
1211 else if ( name == VCAdditionalNamesProp ) 1217 else if ( name == VCAdditionalNamesProp )
1212 c.setMiddleName( value ); 1218 c.setMiddleName( value );
1213 } 1219 }
1214 } 1220 }
1215 else if ( name == VCAdrProp ) { 1221 else if ( name == VCAdrProp ) {
1216 bool work = TRUE; // default address is work address 1222 bool work = TRUE; // default address is work address
1217 QString street; 1223 QString street;
1218 QString city; 1224 QString city;
1219 QString region; 1225 QString region;
1220 QString postal; 1226 QString postal;
1221 QString country; 1227 QString country;
1222 1228
1223 VObjectIterator nit; 1229 VObjectIterator nit;
1224 initPropIterator( &nit, o ); 1230 initPropIterator( &nit, o );
1225 while( moreIteration( &nit ) ) { 1231 while( moreIteration( &nit ) ) {
1226 VObject *o = nextVObject( &nit ); 1232 VObject *o = nextVObject( &nit );
1227 QCString name = vObjectName( o ); 1233 QCString name = vObjectName( o );
1228 QString value = vObjectStringZValue( o ); 1234 QString value = vObjectStringZValue( o );
1229 if ( name == VCHomeProp ) 1235 if ( name == VCHomeProp )
1230 work = FALSE; 1236 work = FALSE;
1231 else if ( name == VCWorkProp ) 1237 else if ( name == VCWorkProp )
1232 work = TRUE; 1238 work = TRUE;
1233 else if ( name == VCStreetAddressProp ) 1239 else if ( name == VCStreetAddressProp )
1234 street = value; 1240 street = value;
1235 else if ( name == VCCityProp ) 1241 else if ( name == VCCityProp )
1236 city = value; 1242 city = value;
1237 else if ( name == VCRegionProp ) 1243 else if ( name == VCRegionProp )
1238 region = value; 1244 region = value;
1239 else if ( name == VCPostalCodeProp ) 1245 else if ( name == VCPostalCodeProp )
1240 postal = value; 1246 postal = value;
@@ -1488,135 +1494,134 @@ bool OContact::match( const QRegExp &r ) const
1488 match = false; 1494 match = false;
1489 QMap<int, QString>::ConstIterator it; 1495 QMap<int, QString>::ConstIterator it;
1490 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1496 for ( it = mMap.begin(); it != mMap.end(); ++it ) {
1491 if ( (*it).find( r ) > -1 ) { 1497 if ( (*it).find( r ) > -1 ) {
1492 match = true; 1498 match = true;
1493 break; 1499 break;
1494 } 1500 }
1495 } 1501 }
1496 return match; 1502 return match;
1497} 1503}
1498 1504
1499 1505
1500QString OContact::toShortText() const 1506QString OContact::toShortText() const
1501{ 1507{
1502 return ( fullName() ); 1508 return ( fullName() );
1503} 1509}
1504QString OContact::type() const 1510QString OContact::type() const
1505{ 1511{
1506 return QString::fromLatin1( "OContact" ); 1512 return QString::fromLatin1( "OContact" );
1507} 1513}
1508 1514
1509// Definition is missing ! (se) 1515// Definition is missing ! (se)
1510QMap<QString,QString> OContact::toExtraMap() const 1516QMap<QString,QString> OContact::toExtraMap() const
1511{ 1517{
1512 qWarning ("Function not implemented: OContact::toExtraMap()"); 1518 qWarning ("Function not implemented: OContact::toExtraMap()");
1513 QMap <QString,QString> useless; 1519 QMap <QString,QString> useless;
1514 return useless; 1520 return useless;
1515} 1521}
1516 1522
1517class QString OContact::recordField( int pos ) const 1523class QString OContact::recordField( int pos ) const
1518{ 1524{
1519 QStringList SLFIELDS = fields(); // ?? why this ? (se) 1525 QStringList SLFIELDS = fields(); // ?? why this ? (se)
1520 return SLFIELDS[pos]; 1526 return SLFIELDS[pos];
1521} 1527}
1522 1528
1523// In future releases, we should store birthday and anniversary 1529// In future releases, we should store birthday and anniversary
1524// internally as QDate instead of QString ! 1530// internally as QDate instead of QString !
1525// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) 1531// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se)
1526 1532
1527/*! \fn void OContact::setBirthday( const QDate& date ) 1533/*! \fn void OContact::setBirthday( const QDate& date )
1528 Sets the birthday for the contact to \a date. 1534 Sets the birthday for the contact to \a date.
1529*/ 1535*/
1530void OContact::setBirthday( const QDate &v ) 1536void OContact::setBirthday( const QDate &v )
1531{ 1537{
1532 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1538 if ( ( !v.isNull() ) && ( v.isValid() ) )
1533 replace( Qtopia::Birthday, TimeConversion::toString( v ) ); 1539 replace( Qtopia::Birthday, TimeConversion::toString( v ) );
1534 1540
1535} 1541}
1536 1542
1537 1543
1538/*! \fn void OContact::setAnniversary( const QDate &date ) 1544/*! \fn void OContact::setAnniversary( const QDate &date )
1539 Sets the anniversary of the contact to \a date. 1545 Sets the anniversary of the contact to \a date.
1540*/ 1546*/
1541void OContact::setAnniversary( const QDate &v ) 1547void OContact::setAnniversary( const QDate &v )
1542{ 1548{
1543 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1549 if ( ( !v.isNull() ) && ( v.isValid() ) )
1544 replace( Qtopia::Anniversary, TimeConversion::toString( v ) ); 1550 replace( Qtopia::Anniversary, TimeConversion::toString( v ) );
1545} 1551}
1546 1552
1547/*! \fn QDate OContact::birthday() const 1553/*! \fn QDate OContact::birthday() const
1548 Returns the birthday of the contact. 1554 Returns the birthday of the contact.
1549*/ 1555*/
1550QDate OContact::birthday() const 1556QDate OContact::birthday() const
1551{ 1557{
1552 QDate empty;
1553 QString str = find( Qtopia::Birthday ); 1558 QString str = find( Qtopia::Birthday );
1554 qWarning ("Birthday %s", str.latin1() ); 1559 qWarning ("Birthday %s", str.latin1() );
1555 if ( !str.isEmpty() ) 1560 if ( !str.isEmpty() )
1556 return TimeConversion::fromString ( str ); 1561 return TimeConversion::fromString ( str );
1557 else 1562 else
1558 return empty; 1563 return QDate();
1559} 1564}
1560 1565
1561 1566
1562/*! \fn QDate OContact::anniversary() const 1567/*! \fn QDate OContact::anniversary() const
1563 Returns the anniversary of the contact. 1568 Returns the anniversary of the contact.
1564*/ 1569*/
1565QDate OContact::anniversary() const 1570QDate OContact::anniversary() const
1566{ 1571{
1567 QDate empty; 1572 QDate empty;
1568 QString str = find( Qtopia::Anniversary ); 1573 QString str = find( Qtopia::Anniversary );
1569 qWarning ("Anniversary %s", str.latin1() ); 1574 qWarning ("Anniversary %s", str.latin1() );
1570 if ( !str.isEmpty() ) 1575 if ( !str.isEmpty() )
1571 return TimeConversion::fromString ( str ); 1576 return TimeConversion::fromString ( str );
1572 else 1577 else
1573 return empty; 1578 return empty;
1574} 1579}
1575 1580
1576 1581
1577void OContact::insertEmail( const QString &v ) 1582void OContact::insertEmail( const QString &v )
1578{ 1583{
1579 //qDebug("insertEmail %s", v.latin1()); 1584 //qDebug("insertEmail %s", v.latin1());
1580 QString e = v.simplifyWhiteSpace(); 1585 QString e = v.simplifyWhiteSpace();
1581 QString def = defaultEmail(); 1586 QString def = defaultEmail();
1582 1587
1583 // if no default, set it as the default email and don't insert 1588 // if no default, set it as the default email and don't insert
1584 if ( def.isEmpty() ) { 1589 if ( def.isEmpty() ) {
1585 setDefaultEmail( e ); // will insert into the list for us 1590 setDefaultEmail( e ); // will insert into the list for us
1586 return; 1591 return;
1587 } 1592 }
1588 1593
1589 // otherwise, insert assuming doesn't already exist 1594 // otherwise, insert assuming doesn't already exist
1590 QString emailsStr = find( Qtopia::Emails ); 1595 QString emailsStr = find( Qtopia::Emails );
1591 if ( emailsStr.contains( e )) 1596 if ( emailsStr.contains( e ))
1592 return; 1597 return;
1593 if ( !emailsStr.isEmpty() ) 1598 if ( !emailsStr.isEmpty() )
1594 emailsStr += emailSeparator(); 1599 emailsStr += emailSeparator();
1595 emailsStr += e; 1600 emailsStr += e;
1596 replace( Qtopia::Emails, emailsStr ); 1601 replace( Qtopia::Emails, emailsStr );
1597} 1602}
1598 1603
1599void OContact::removeEmail( const QString &v ) 1604void OContact::removeEmail( const QString &v )
1600{ 1605{
1601 QString e = v.simplifyWhiteSpace(); 1606 QString e = v.simplifyWhiteSpace();
1602 QString def = defaultEmail(); 1607 QString def = defaultEmail();
1603 QString emailsStr = find( Qtopia::Emails ); 1608 QString emailsStr = find( Qtopia::Emails );
1604 QStringList emails = emailList(); 1609 QStringList emails = emailList();
1605 1610
1606 // otherwise, must first contain it 1611 // otherwise, must first contain it
1607 if ( !emailsStr.contains( e ) ) 1612 if ( !emailsStr.contains( e ) )
1608 return; 1613 return;
1609 1614
1610 // remove it 1615 // remove it
1611 //qDebug(" removing email from list %s", e.latin1()); 1616 //qDebug(" removing email from list %s", e.latin1());
1612 emails.remove( e ); 1617 emails.remove( e );
1613 // reset the string 1618 // reset the string
1614 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator 1619 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator
1615 replace( Qtopia::Emails, emailsStr ); 1620 replace( Qtopia::Emails, emailsStr );
1616 1621
1617 // if default, then replace the default email with the first one 1622 // if default, then replace the default email with the first one
1618 if ( def == e ) { 1623 if ( def == e ) {
1619 //qDebug("removeEmail is default; setting new default"); 1624 //qDebug("removeEmail is default; setting new default");
1620 if ( !emails.count() ) 1625 if ( !emails.count() )
1621 clearEmails(); 1626 clearEmails();
1622 else // setDefaultEmail will remove e from the list 1627 else // setDefaultEmail will remove e from the list
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index bf27d0f..acd65c4 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -8,137 +8,139 @@
8** GNU General Public License version 2 as published by the Free Software 8** GNU General Public License version 2 as published by the Free Software
9** Foundation and appearing in the file LICENSE.GPL included in the 9** Foundation and appearing in the file LICENSE.GPL included in the
10** packaging of this file. 10** packaging of this file.
11** 11**
12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 12** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 13** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14** 14**
15** See http://www.trolltech.com/gpl/ for GPL licensing information. 15** See http://www.trolltech.com/gpl/ for GPL licensing information.
16** 16**
17** Contact info@trolltech.com if any conditions of this licensing are 17** Contact info@trolltech.com if any conditions of this licensing are
18** not clear to you. 18** not clear to you.
19** 19**
20**********************************************************************/ 20**********************************************************************/
21 21
22#define QTOPIA_INTERNAL_CONTACT_MRE 22#define QTOPIA_INTERNAL_CONTACT_MRE
23 23
24#include "ocontact.h" 24#include "ocontact.h"
25#include "../../library/backend/vobject_p.h" 25#include "../../library/backend/vobject_p.h"
26#include "../../library/backend/qfiledirect_p.h" 26#include "../../library/backend/qfiledirect_p.h"
27 27
28#include <qpe/stringutil.h> 28#include <qpe/stringutil.h>
29#include <qpe/timeconversion.h> 29#include <qpe/timeconversion.h>
30#include <qpe/timestring.h> 30#include <qpe/timestring.h>
31 31
32#include <qobject.h> 32#include <qobject.h>
33#include <qregexp.h> 33#include <qregexp.h>
34#include <qstylesheet.h> 34#include <qstylesheet.h>
35#include <qfileinfo.h> 35#include <qfileinfo.h>
36#include <qmap.h> 36#include <qmap.h>
37 37
38#include <stdio.h> 38#include <stdio.h>
39 39
40/*! 40/*!
41 \class Contact contact.h 41 \class Contact contact.h
42 \brief The Contact class holds the data of an address book entry. 42 \brief The Contact class holds the data of an address book entry.
43 43
44 This data includes information the name of the person, contact 44 This data includes information the name of the person, contact
45 information, and business information such as deparment and job title. 45 information, and business information such as deparment and job title.
46 46
47 \ingroup qtopiaemb 47 \ingroup qtopiaemb
48 \ingroup qtopiadesktop 48 \ingroup qtopiadesktop
49*/ 49*/
50 50
51Qtopia::UidGen OContact::sUidGen( Qtopia::UidGen::Qtopia ); 51Qtopia::UidGen OContact::sUidGen( Qtopia::UidGen::Qtopia );
52 52
53/*! 53/*!
54 Creates a new, empty contact. 54 Creates a new, empty contact.
55*/ 55*/
56OContact::OContact() 56OContact::OContact()
57 : OPimRecord(), mMap(), d( 0 ) 57 : OPimRecord(), mMap(), d( 0 )
58{ 58{
59} 59}
60 60
61/*! 61/*!
62 \internal 62 \internal
63 Creates a new contact. The properties of the contact are 63 Creates a new contact. The properties of the contact are
64 set from \a fromMap. 64 set from \a fromMap.
65*/ 65*/
66OContact::OContact( const QMap<int, QString> &fromMap ) : 66OContact::OContact( const QMap<int, QString> &fromMap ) :
67 OPimRecord(), mMap( fromMap ), d( 0 ) 67 OPimRecord(), mMap( fromMap ), d( 0 )
68{ 68{
69 QString cats = mMap[ Qtopia::AddressCategory ]; 69 QString cats = mMap[ Qtopia::AddressCategory ];
70 if ( !cats.isEmpty() ) 70 if ( !cats.isEmpty() )
71 setCategories( idsFromString( cats ) ); 71 setCategories( idsFromString( cats ) );
72
72 QString uidStr = find( Qtopia::AddressUid ); 73 QString uidStr = find( Qtopia::AddressUid );
73 74
74 if ( uidStr.isEmpty() ) 75 if ( uidStr.isEmpty() || (uidStr.toInt() == 0) ){
76 qWarning( "Invalid UID found. Generate new one.." );
75 setUid( uidGen().generate() ); 77 setUid( uidGen().generate() );
76 else 78 }else
77 setUid( uidStr.toInt() ); 79 setUid( uidStr.toInt() );
78 80
79 if ( !uidStr.isEmpty() ) 81// if ( !uidStr.isEmpty() )
80 setUid( uidStr.toInt() ); 82 // setUid( uidStr.toInt() );
81} 83}
82 84
83/*! 85/*!
84 Destroys a contact. 86 Destroys a contact.
85*/ 87*/
86OContact::~OContact() 88OContact::~OContact()
87{ 89{
88} 90}
89 91
90/*! \fn void OContact::setTitle( const QString &str ) 92/*! \fn void OContact::setTitle( const QString &str )
91 Sets the title of the contact to \a str. 93 Sets the title of the contact to \a str.
92*/ 94*/
93 95
94/*! \fn void OContact::setFirstName( const QString &str ) 96/*! \fn void OContact::setFirstName( const QString &str )
95 Sets the first name of the contact to \a str. 97 Sets the first name of the contact to \a str.
96*/ 98*/
97 99
98/*! \fn void OContact::setMiddleName( const QString &str ) 100/*! \fn void OContact::setMiddleName( const QString &str )
99 Sets the middle name of the contact to \a str. 101 Sets the middle name of the contact to \a str.
100*/ 102*/
101 103
102/*! \fn void OContact::setLastName( const QString &str ) 104/*! \fn void OContact::setLastName( const QString &str )
103 Sets the last name of the contact to \a str. 105 Sets the last name of the contact to \a str.
104*/ 106*/
105 107
106/*! \fn void OContact::setSuffix( const QString &str ) 108/*! \fn void OContact::setSuffix( const QString &str )
107 Sets the suffix of the contact to \a str. 109 Sets the suffix of the contact to \a str.
108*/ 110*/
109 111
110/*! \fn void OContact::setFileAs( const QString &str ) 112/*! \fn void OContact::setFileAs( const QString &str )
111 Sets the contact to filed as \a str. 113 Sets the contact to filed as \a str.
112*/ 114*/
113 115
114/*! \fn void OContact::setDefaultEmail( const QString &str ) 116/*! \fn void OContact::setDefaultEmail( const QString &str )
115 Sets the default email of the contact to \a str. 117 Sets the default email of the contact to \a str.
116*/ 118*/
117 119
118/*! \fn void OContact::setHomeStreet( const QString &str ) 120/*! \fn void OContact::setHomeStreet( const QString &str )
119 Sets the home street address of the contact to \a str. 121 Sets the home street address of the contact to \a str.
120*/ 122*/
121 123
122/*! \fn void OContact::setHomeCity( const QString &str ) 124/*! \fn void OContact::setHomeCity( const QString &str )
123 Sets the home city of the contact to \a str. 125 Sets the home city of the contact to \a str.
124*/ 126*/
125 127
126/*! \fn void OContact::setHomeState( const QString &str ) 128/*! \fn void OContact::setHomeState( const QString &str )
127 Sets the home state of the contact to \a str. 129 Sets the home state of the contact to \a str.
128*/ 130*/
129 131
130/*! \fn void OContact::setHomeZip( const QString &str ) 132/*! \fn void OContact::setHomeZip( const QString &str )
131 Sets the home zip code of the contact to \a str. 133 Sets the home zip code of the contact to \a str.
132*/ 134*/
133 135
134/*! \fn void OContact::setHomeCountry( const QString &str ) 136/*! \fn void OContact::setHomeCountry( const QString &str )
135 Sets the home country of the contact to \a str. 137 Sets the home country of the contact to \a str.
136*/ 138*/
137 139
138/*! \fn void OContact::setHomePhone( const QString &str ) 140/*! \fn void OContact::setHomePhone( const QString &str )
139 Sets the home phone number of the contact to \a str. 141 Sets the home phone number of the contact to \a str.
140*/ 142*/
141 143
142/*! \fn void OContact::setHomeFax( const QString &str ) 144/*! \fn void OContact::setHomeFax( const QString &str )
143 Sets the home fax number of the contact to \a str. 145 Sets the home fax number of the contact to \a str.
144*/ 146*/
@@ -510,134 +512,134 @@ QString OContact::toRichText() const
510 str = homePhone(); 512 str = homePhone();
511 if ( !str.isEmpty() ) 513 if ( !str.isEmpty() )
512 text += "<b>" + QObject::tr("Home Phone: ") + "</b>" 514 text += "<b>" + QObject::tr("Home Phone: ") + "</b>"
513 + Qtopia::escapeString(str) + "<br>"; 515 + Qtopia::escapeString(str) + "<br>";
514 str = homeFax(); 516 str = homeFax();
515 if ( !str.isEmpty() ) 517 if ( !str.isEmpty() )
516 text += "<b>" + QObject::tr("Home Fax: ") + "</b>" 518 text += "<b>" + QObject::tr("Home Fax: ") + "</b>"
517 + Qtopia::escapeString(str) + "<br>"; 519 + Qtopia::escapeString(str) + "<br>";
518 str = homeMobile(); 520 str = homeMobile();
519 if ( !str.isEmpty() ) 521 if ( !str.isEmpty() )
520 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>" 522 text += "<b>" + QObject::tr("Home Mobile: ") + "</b>"
521 + Qtopia::escapeString(str) + "<br>"; 523 + Qtopia::escapeString(str) + "<br>";
522 str = homeWebpage(); 524 str = homeWebpage();
523 if ( !str.isEmpty() ) 525 if ( !str.isEmpty() )
524 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>" 526 text += "<b>" + QObject::tr("Home Web Page: ") + "</b>"
525 + Qtopia::escapeString(str) + "<br>"; 527 + Qtopia::escapeString(str) + "<br>";
526 str = businessWebpage(); 528 str = businessWebpage();
527 if ( !str.isEmpty() ) 529 if ( !str.isEmpty() )
528 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>" 530 text += "<b>" + QObject::tr("Business Web Page: ") + "</b>"
529 + Qtopia::escapeString(str) + "<br>"; 531 + Qtopia::escapeString(str) + "<br>";
530 str = office(); 532 str = office();
531 if ( !str.isEmpty() ) 533 if ( !str.isEmpty() )
532 text += "<b>" + QObject::tr("Office: ") + "</b>" 534 text += "<b>" + QObject::tr("Office: ") + "</b>"
533 + Qtopia::escapeString(str) + "<br>"; 535 + Qtopia::escapeString(str) + "<br>";
534 str = businessPhone(); 536 str = businessPhone();
535 if ( !str.isEmpty() ) 537 if ( !str.isEmpty() )
536 text += "<b>" + QObject::tr("Business Phone: ") + "</b>" 538 text += "<b>" + QObject::tr("Business Phone: ") + "</b>"
537 + Qtopia::escapeString(str) + "<br>"; 539 + Qtopia::escapeString(str) + "<br>";
538 str = businessFax(); 540 str = businessFax();
539 if ( !str.isEmpty() ) 541 if ( !str.isEmpty() )
540 text += "<b>" + QObject::tr("Business Fax: ") + "</b>" 542 text += "<b>" + QObject::tr("Business Fax: ") + "</b>"
541 + Qtopia::escapeString(str) + "<br>"; 543 + Qtopia::escapeString(str) + "<br>";
542 str = businessMobile(); 544 str = businessMobile();
543 if ( !str.isEmpty() ) 545 if ( !str.isEmpty() )
544 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>" 546 text += "<b>" + QObject::tr("Business Mobile: ") + "</b>"
545 + Qtopia::escapeString(str) + "<br>"; 547 + Qtopia::escapeString(str) + "<br>";
546 str = businessPager(); 548 str = businessPager();
547 if ( !str.isEmpty() ) 549 if ( !str.isEmpty() )
548 text += "<b>" + QObject::tr("Business Pager: ") + "</b>" 550 text += "<b>" + QObject::tr("Business Pager: ") + "</b>"
549 + Qtopia::escapeString(str) + "<br>"; 551 + Qtopia::escapeString(str) + "<br>";
550 str = profession(); 552 str = profession();
551 if ( !str.isEmpty() ) 553 if ( !str.isEmpty() )
552 text += "<b>" + QObject::tr("Profession: ") + "</b>" 554 text += "<b>" + QObject::tr("Profession: ") + "</b>"
553 + Qtopia::escapeString(str) + "<br>"; 555 + Qtopia::escapeString(str) + "<br>";
554 str = assistant(); 556 str = assistant();
555 if ( !str.isEmpty() ) 557 if ( !str.isEmpty() )
556 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 558 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
557 + Qtopia::escapeString(str) + "<br>"; 559 + Qtopia::escapeString(str) + "<br>";
558 str = manager(); 560 str = manager();
559 if ( !str.isEmpty() ) 561 if ( !str.isEmpty() )
560 text += "<b>" + QObject::tr("Manager: ") + "</b>" 562 text += "<b>" + QObject::tr("Manager: ") + "</b>"
561 + Qtopia::escapeString(str) + "<br>"; 563 + Qtopia::escapeString(str) + "<br>";
562 str = gender(); 564 str = gender();
563 if ( !str.isEmpty() && str.toInt() != 0 ) { 565 if ( !str.isEmpty() && str.toInt() != 0 ) {
564 if ( str.toInt() == 1 ) 566 if ( str.toInt() == 1 )
565 str = QObject::tr( "Male" ); 567 str = QObject::tr( "Male" );
566 else if ( str.toInt() == 2 ) 568 else if ( str.toInt() == 2 )
567 str = QObject::tr( "Female" ); 569 str = QObject::tr( "Female" );
568 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 570 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
569 } 571 }
570 str = spouse(); 572 str = spouse();
571 if ( !str.isEmpty() ) 573 if ( !str.isEmpty() )
572 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 574 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
573 + Qtopia::escapeString(str) + "<br>"; 575 + Qtopia::escapeString(str) + "<br>";
574 if ( !birthday().isValid() ){ 576 if ( birthday().isValid() ){
575 str = TimeString::numberDateString( birthday() ); 577 str = TimeString::numberDateString( birthday() );
576 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 578 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
577 + Qtopia::escapeString(str) + "<br>"; 579 + Qtopia::escapeString(str) + "<br>";
578 } 580 }
579 if ( !anniversary().isValid() ){ 581 if ( anniversary().isValid() ){
580 str = TimeString::numberDateString( anniversary() ); 582 str = TimeString::numberDateString( anniversary() );
581 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 583 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
582 + Qtopia::escapeString(str) + "<br>"; 584 + Qtopia::escapeString(str) + "<br>";
583 } 585 }
584 str = nickname(); 586 str = nickname();
585 if ( !str.isEmpty() ) 587 if ( !str.isEmpty() )
586 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 588 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
587 + Qtopia::escapeString(str) + "<br>"; 589 + Qtopia::escapeString(str) + "<br>";
588 590
589 // notes last 591 // notes last
590 if ( (value = notes()) ) { 592 if ( (value = notes()) ) {
591 QRegExp reg("\n"); 593 QRegExp reg("\n");
592 594
593 //QString tmp = Qtopia::escapeString(value); 595 //QString tmp = Qtopia::escapeString(value);
594 QString tmp = QStyleSheet::convertFromPlainText(value); 596 QString tmp = QStyleSheet::convertFromPlainText(value);
595 //tmp.replace( reg, "<br>" ); 597 //tmp.replace( reg, "<br>" );
596 text += "<br>" + tmp + "<br>"; 598 text += "<br>" + tmp + "<br>";
597 } 599 }
598 return text; 600 return text;
599} 601}
600 602
601/*! 603/*!
602 \internal 604 \internal
603*/ 605*/
604void OContact::insert( int key, const QString &v ) 606void OContact::insert( int key, const QString &v )
605{ 607{
606 QString value = v.stripWhiteSpace(); 608 QString value = v.stripWhiteSpace();
607 if ( value.isEmpty() ) 609 if ( value.isEmpty() )
608 mMap.remove( key ); 610 mMap.remove( key );
609 else 611 else
610 mMap.insert( key, value ); 612 mMap.insert( key, value );
611} 613}
612 614
613/*! 615/*!
614 \internal 616 \internal
615*/ 617*/
616void OContact::replace( int key, const QString & v ) 618void OContact::replace( int key, const QString & v )
617{ 619{
618 QString value = v.stripWhiteSpace(); 620 QString value = v.stripWhiteSpace();
619 if ( value.isEmpty() ) 621 if ( value.isEmpty() )
620 mMap.remove( key ); 622 mMap.remove( key );
621 else 623 else
622 mMap.replace( key, value ); 624 mMap.replace( key, value );
623} 625}
624 626
625/*! 627/*!
626 \internal 628 \internal
627*/ 629*/
628QString OContact::find( int key ) const 630QString OContact::find( int key ) const
629{ 631{
630 return mMap[key]; 632 return mMap[key];
631} 633}
632 634
633/*! 635/*!
634 \internal 636 \internal
635*/ 637*/
636QString OContact::displayAddress( const QString &street, 638QString OContact::displayAddress( const QString &street,
637 const QString &city, 639 const QString &city,
638 const QString &state, 640 const QString &state,
639 const QString &zip, 641 const QString &zip,
640 const QString &country ) const 642 const QString &country ) const
641{ 643{
642 QString s = street; 644 QString s = street;
643 if ( !street.isEmpty() ) 645 if ( !street.isEmpty() )
@@ -1062,179 +1064,183 @@ static VObject *createVObject( const OContact &c )
1062 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 1064 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
1063 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 1065 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
1064 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 1066 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
1065 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 1067 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
1066 1068
1067 // home properties 1069 // home properties
1068 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 1070 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
1069 safeAddProp( home_adr, VCHomeProp ); 1071 safeAddProp( home_adr, VCHomeProp );
1070 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 1072 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
1071 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 1073 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
1072 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 1074 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
1073 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 1075 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
1074 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 1076 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
1075 1077
1076 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 1078 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
1077 safeAddProp( home_phone, VCHomeProp ); 1079 safeAddProp( home_phone, VCHomeProp );
1078 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 1080 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
1079 safeAddProp( home_phone, VCHomeProp ); 1081 safeAddProp( home_phone, VCHomeProp );
1080 safeAddProp( home_phone, VCCellularProp ); 1082 safeAddProp( home_phone, VCCellularProp );
1081 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 1083 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
1082 safeAddProp( home_phone, VCHomeProp ); 1084 safeAddProp( home_phone, VCHomeProp );
1083 safeAddProp( home_phone, VCFaxProp ); 1085 safeAddProp( home_phone, VCFaxProp );
1084 1086
1085 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 1087 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
1086 safeAddProp( url, VCHomeProp ); 1088 safeAddProp( url, VCHomeProp );
1087 1089
1088 // work properties 1090 // work properties
1089 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 1091 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
1090 safeAddProp( work_adr, VCWorkProp ); 1092 safeAddProp( work_adr, VCWorkProp );
1091 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 1093 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
1092 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 1094 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
1093 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 1095 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
1094 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 1096 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
1095 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 1097 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
1096 1098
1097 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 1099 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
1098 safeAddProp( work_phone, VCWorkProp ); 1100 safeAddProp( work_phone, VCWorkProp );
1099 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 1101 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
1100 safeAddProp( work_phone, VCWorkProp ); 1102 safeAddProp( work_phone, VCWorkProp );
1101 safeAddProp( work_phone, VCCellularProp ); 1103 safeAddProp( work_phone, VCCellularProp );
1102 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1104 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
1103 safeAddProp( work_phone, VCWorkProp ); 1105 safeAddProp( work_phone, VCWorkProp );
1104 safeAddProp( work_phone, VCFaxProp ); 1106 safeAddProp( work_phone, VCFaxProp );
1105 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1107 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
1106 safeAddProp( work_phone, VCWorkProp ); 1108 safeAddProp( work_phone, VCWorkProp );
1107 safeAddProp( work_phone, VCPagerProp ); 1109 safeAddProp( work_phone, VCPagerProp );
1108 1110
1109 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1111 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
1110 safeAddProp( url, VCWorkProp ); 1112 safeAddProp( url, VCWorkProp );
1111 1113
1112 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1114 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
1113 safeAddProp( title, VCWorkProp ); 1115 safeAddProp( title, VCWorkProp );
1114 1116
1115 1117
1116 QStringList emails = c.emailList(); 1118 QStringList emails = c.emailList();
1117 emails.prepend( c.defaultEmail() ); 1119 emails.prepend( c.defaultEmail() );
1118 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1120 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
1119 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1121 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
1120 safeAddProp( email, VCInternetProp ); 1122 safeAddProp( email, VCInternetProp );
1121 } 1123 }
1122 1124
1123 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1125 safeAddPropValue( vcard, VCNoteProp, c.notes() );
1124 1126
1125 // Exporting Birthday regarding RFC 2425 (5.8.4) 1127 // Exporting Birthday regarding RFC 2425 (5.8.4)
1126 if ( !c.birthday().isValid() ){ 1128 if ( c.birthday().isValid() ){
1127 QString birthd_rfc2425 = QString("%1-%2-%3") 1129 QString birthd_rfc2425 = QString("%1-%2-%3")
1128 .arg( c.birthday().year() ) 1130 .arg( c.birthday().year() )
1129 .arg( c.birthday().month(), 2 ) 1131 .arg( c.birthday().month(), 2 )
1130 .arg( c.birthday().day(), 2 ); 1132 .arg( c.birthday().day(), 2 );
1131 // Now replace spaces with "0"... 1133 // Now replace spaces with "0"...
1132 int pos = 0; 1134 int pos = 0;
1133 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 ) 1135 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
1134 birthd_rfc2425.replace( pos, 1, "0" ); 1136 birthd_rfc2425.replace( pos, 1, "0" );
1135 1137
1136 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1()); 1138 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
1137 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() ); 1139 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
1138 } 1140 }
1139 1141
1140 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1142 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
1141 VObject *org = safeAddProp( vcard, VCOrgProp ); 1143 VObject *org = safeAddProp( vcard, VCOrgProp );
1142 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1144 safeAddPropValue( org, VCOrgNameProp, c.company() );
1143 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1145 safeAddPropValue( org, VCOrgUnitProp, c.department() );
1144 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1146 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
1145 } 1147 }
1146 1148
1147 // some values we have to export as custom fields 1149 // some values we have to export as custom fields
1148 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1150 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
1149 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1151 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
1150 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1152 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
1151 1153
1152 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1154 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
1153 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1155 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
1154 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 1156 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) );
1155 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1157 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
1156 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1158 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
1157 1159
1158 return vcard; 1160 return vcard;
1159} 1161}
1160 1162
1161 1163
1162/*! 1164/*!
1163 \internal 1165 \internal
1164*/ 1166*/
1165static QDate convVCardDateToDate( const QString& datestr ) 1167static QDate convVCardDateToDate( const QString& datestr )
1166{ 1168{
1167 int monthPos = datestr.find('-'); 1169 int monthPos = datestr.find('-');
1168 int dayPos = datestr.find('-', monthPos+1 ); 1170 int dayPos = datestr.find('-', monthPos+1 );
1169 int sep_ignore = 1; 1171 int sep_ignore = 1;
1170 if ( monthPos == -1 || dayPos == -1 ) { 1172 if ( monthPos == -1 || dayPos == -1 ) {
1171 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1173 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1172 // Ok.. Outlook is violating ISO 8601, therefore we will try to read their format ( YYYYMMDD ) 1174 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD )
1173 monthPos = 4; 1175 if ( datestr.length() == 8 ){
1174 dayPos = 6; 1176 monthPos = 4;
1175 sep_ignore = 0; 1177 dayPos = 6;
1176 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 1178 sep_ignore = 0;
1179 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
1180 } else {
1181 return QDate();
1182 }
1177 } 1183 }
1178 int y = datestr.left( monthPos ).toInt(); 1184 int y = datestr.left( monthPos ).toInt();
1179 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); 1185 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt();
1180 int d = datestr.mid( dayPos + sep_ignore ).toInt(); 1186 int d = datestr.mid( dayPos + sep_ignore ).toInt();
1181 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); 1187 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 ); 1188 QDate date ( y,m,d );
1183 return date; 1189 return date;
1184} 1190}
1185 1191
1186static OContact parseVObject( VObject *obj ) 1192static OContact parseVObject( VObject *obj )
1187{ 1193{
1188 OContact c; 1194 OContact c;
1189 1195
1190 VObjectIterator it; 1196 VObjectIterator it;
1191 initPropIterator( &it, obj ); 1197 initPropIterator( &it, obj );
1192 while( moreIteration( &it ) ) { 1198 while( moreIteration( &it ) ) {
1193 VObject *o = nextVObject( &it ); 1199 VObject *o = nextVObject( &it );
1194 QCString name = vObjectName( o ); 1200 QCString name = vObjectName( o );
1195 QCString value = vObjectStringZValue( o ); 1201 QCString value = vObjectStringZValue( o );
1196 if ( name == VCNameProp ) { 1202 if ( name == VCNameProp ) {
1197 VObjectIterator nit; 1203 VObjectIterator nit;
1198 initPropIterator( &nit, o ); 1204 initPropIterator( &nit, o );
1199 while( moreIteration( &nit ) ) { 1205 while( moreIteration( &nit ) ) {
1200 VObject *o = nextVObject( &nit ); 1206 VObject *o = nextVObject( &nit );
1201 QCString name = vObjectTypeInfo( o ); 1207 QCString name = vObjectTypeInfo( o );
1202 QString value = vObjectStringZValue( o ); 1208 QString value = vObjectStringZValue( o );
1203 if ( name == VCNamePrefixesProp ) 1209 if ( name == VCNamePrefixesProp )
1204 c.setTitle( value ); 1210 c.setTitle( value );
1205 else if ( name == VCNameSuffixesProp ) 1211 else if ( name == VCNameSuffixesProp )
1206 c.setSuffix( value ); 1212 c.setSuffix( value );
1207 else if ( name == VCFamilyNameProp ) 1213 else if ( name == VCFamilyNameProp )
1208 c.setLastName( value ); 1214 c.setLastName( value );
1209 else if ( name == VCGivenNameProp ) 1215 else if ( name == VCGivenNameProp )
1210 c.setFirstName( value ); 1216 c.setFirstName( value );
1211 else if ( name == VCAdditionalNamesProp ) 1217 else if ( name == VCAdditionalNamesProp )
1212 c.setMiddleName( value ); 1218 c.setMiddleName( value );
1213 } 1219 }
1214 } 1220 }
1215 else if ( name == VCAdrProp ) { 1221 else if ( name == VCAdrProp ) {
1216 bool work = TRUE; // default address is work address 1222 bool work = TRUE; // default address is work address
1217 QString street; 1223 QString street;
1218 QString city; 1224 QString city;
1219 QString region; 1225 QString region;
1220 QString postal; 1226 QString postal;
1221 QString country; 1227 QString country;
1222 1228
1223 VObjectIterator nit; 1229 VObjectIterator nit;
1224 initPropIterator( &nit, o ); 1230 initPropIterator( &nit, o );
1225 while( moreIteration( &nit ) ) { 1231 while( moreIteration( &nit ) ) {
1226 VObject *o = nextVObject( &nit ); 1232 VObject *o = nextVObject( &nit );
1227 QCString name = vObjectName( o ); 1233 QCString name = vObjectName( o );
1228 QString value = vObjectStringZValue( o ); 1234 QString value = vObjectStringZValue( o );
1229 if ( name == VCHomeProp ) 1235 if ( name == VCHomeProp )
1230 work = FALSE; 1236 work = FALSE;
1231 else if ( name == VCWorkProp ) 1237 else if ( name == VCWorkProp )
1232 work = TRUE; 1238 work = TRUE;
1233 else if ( name == VCStreetAddressProp ) 1239 else if ( name == VCStreetAddressProp )
1234 street = value; 1240 street = value;
1235 else if ( name == VCCityProp ) 1241 else if ( name == VCCityProp )
1236 city = value; 1242 city = value;
1237 else if ( name == VCRegionProp ) 1243 else if ( name == VCRegionProp )
1238 region = value; 1244 region = value;
1239 else if ( name == VCPostalCodeProp ) 1245 else if ( name == VCPostalCodeProp )
1240 postal = value; 1246 postal = value;
@@ -1488,135 +1494,134 @@ bool OContact::match( const QRegExp &r ) const
1488 match = false; 1494 match = false;
1489 QMap<int, QString>::ConstIterator it; 1495 QMap<int, QString>::ConstIterator it;
1490 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1496 for ( it = mMap.begin(); it != mMap.end(); ++it ) {
1491 if ( (*it).find( r ) > -1 ) { 1497 if ( (*it).find( r ) > -1 ) {
1492 match = true; 1498 match = true;
1493 break; 1499 break;
1494 } 1500 }
1495 } 1501 }
1496 return match; 1502 return match;
1497} 1503}
1498 1504
1499 1505
1500QString OContact::toShortText() const 1506QString OContact::toShortText() const
1501{ 1507{
1502 return ( fullName() ); 1508 return ( fullName() );
1503} 1509}
1504QString OContact::type() const 1510QString OContact::type() const
1505{ 1511{
1506 return QString::fromLatin1( "OContact" ); 1512 return QString::fromLatin1( "OContact" );
1507} 1513}
1508 1514
1509// Definition is missing ! (se) 1515// Definition is missing ! (se)
1510QMap<QString,QString> OContact::toExtraMap() const 1516QMap<QString,QString> OContact::toExtraMap() const
1511{ 1517{
1512 qWarning ("Function not implemented: OContact::toExtraMap()"); 1518 qWarning ("Function not implemented: OContact::toExtraMap()");
1513 QMap <QString,QString> useless; 1519 QMap <QString,QString> useless;
1514 return useless; 1520 return useless;
1515} 1521}
1516 1522
1517class QString OContact::recordField( int pos ) const 1523class QString OContact::recordField( int pos ) const
1518{ 1524{
1519 QStringList SLFIELDS = fields(); // ?? why this ? (se) 1525 QStringList SLFIELDS = fields(); // ?? why this ? (se)
1520 return SLFIELDS[pos]; 1526 return SLFIELDS[pos];
1521} 1527}
1522 1528
1523// In future releases, we should store birthday and anniversary 1529// In future releases, we should store birthday and anniversary
1524// internally as QDate instead of QString ! 1530// internally as QDate instead of QString !
1525// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) 1531// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se)
1526 1532
1527/*! \fn void OContact::setBirthday( const QDate& date ) 1533/*! \fn void OContact::setBirthday( const QDate& date )
1528 Sets the birthday for the contact to \a date. 1534 Sets the birthday for the contact to \a date.
1529*/ 1535*/
1530void OContact::setBirthday( const QDate &v ) 1536void OContact::setBirthday( const QDate &v )
1531{ 1537{
1532 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1538 if ( ( !v.isNull() ) && ( v.isValid() ) )
1533 replace( Qtopia::Birthday, TimeConversion::toString( v ) ); 1539 replace( Qtopia::Birthday, TimeConversion::toString( v ) );
1534 1540
1535} 1541}
1536 1542
1537 1543
1538/*! \fn void OContact::setAnniversary( const QDate &date ) 1544/*! \fn void OContact::setAnniversary( const QDate &date )
1539 Sets the anniversary of the contact to \a date. 1545 Sets the anniversary of the contact to \a date.
1540*/ 1546*/
1541void OContact::setAnniversary( const QDate &v ) 1547void OContact::setAnniversary( const QDate &v )
1542{ 1548{
1543 if ( ( !v.isNull() ) && ( v.isValid() ) ) 1549 if ( ( !v.isNull() ) && ( v.isValid() ) )
1544 replace( Qtopia::Anniversary, TimeConversion::toString( v ) ); 1550 replace( Qtopia::Anniversary, TimeConversion::toString( v ) );
1545} 1551}
1546 1552
1547/*! \fn QDate OContact::birthday() const 1553/*! \fn QDate OContact::birthday() const
1548 Returns the birthday of the contact. 1554 Returns the birthday of the contact.
1549*/ 1555*/
1550QDate OContact::birthday() const 1556QDate OContact::birthday() const
1551{ 1557{
1552 QDate empty;
1553 QString str = find( Qtopia::Birthday ); 1558 QString str = find( Qtopia::Birthday );
1554 qWarning ("Birthday %s", str.latin1() ); 1559 qWarning ("Birthday %s", str.latin1() );
1555 if ( !str.isEmpty() ) 1560 if ( !str.isEmpty() )
1556 return TimeConversion::fromString ( str ); 1561 return TimeConversion::fromString ( str );
1557 else 1562 else
1558 return empty; 1563 return QDate();
1559} 1564}
1560 1565
1561 1566
1562/*! \fn QDate OContact::anniversary() const 1567/*! \fn QDate OContact::anniversary() const
1563 Returns the anniversary of the contact. 1568 Returns the anniversary of the contact.
1564*/ 1569*/
1565QDate OContact::anniversary() const 1570QDate OContact::anniversary() const
1566{ 1571{
1567 QDate empty; 1572 QDate empty;
1568 QString str = find( Qtopia::Anniversary ); 1573 QString str = find( Qtopia::Anniversary );
1569 qWarning ("Anniversary %s", str.latin1() ); 1574 qWarning ("Anniversary %s", str.latin1() );
1570 if ( !str.isEmpty() ) 1575 if ( !str.isEmpty() )
1571 return TimeConversion::fromString ( str ); 1576 return TimeConversion::fromString ( str );
1572 else 1577 else
1573 return empty; 1578 return empty;
1574} 1579}
1575 1580
1576 1581
1577void OContact::insertEmail( const QString &v ) 1582void OContact::insertEmail( const QString &v )
1578{ 1583{
1579 //qDebug("insertEmail %s", v.latin1()); 1584 //qDebug("insertEmail %s", v.latin1());
1580 QString e = v.simplifyWhiteSpace(); 1585 QString e = v.simplifyWhiteSpace();
1581 QString def = defaultEmail(); 1586 QString def = defaultEmail();
1582 1587
1583 // if no default, set it as the default email and don't insert 1588 // if no default, set it as the default email and don't insert
1584 if ( def.isEmpty() ) { 1589 if ( def.isEmpty() ) {
1585 setDefaultEmail( e ); // will insert into the list for us 1590 setDefaultEmail( e ); // will insert into the list for us
1586 return; 1591 return;
1587 } 1592 }
1588 1593
1589 // otherwise, insert assuming doesn't already exist 1594 // otherwise, insert assuming doesn't already exist
1590 QString emailsStr = find( Qtopia::Emails ); 1595 QString emailsStr = find( Qtopia::Emails );
1591 if ( emailsStr.contains( e )) 1596 if ( emailsStr.contains( e ))
1592 return; 1597 return;
1593 if ( !emailsStr.isEmpty() ) 1598 if ( !emailsStr.isEmpty() )
1594 emailsStr += emailSeparator(); 1599 emailsStr += emailSeparator();
1595 emailsStr += e; 1600 emailsStr += e;
1596 replace( Qtopia::Emails, emailsStr ); 1601 replace( Qtopia::Emails, emailsStr );
1597} 1602}
1598 1603
1599void OContact::removeEmail( const QString &v ) 1604void OContact::removeEmail( const QString &v )
1600{ 1605{
1601 QString e = v.simplifyWhiteSpace(); 1606 QString e = v.simplifyWhiteSpace();
1602 QString def = defaultEmail(); 1607 QString def = defaultEmail();
1603 QString emailsStr = find( Qtopia::Emails ); 1608 QString emailsStr = find( Qtopia::Emails );
1604 QStringList emails = emailList(); 1609 QStringList emails = emailList();
1605 1610
1606 // otherwise, must first contain it 1611 // otherwise, must first contain it
1607 if ( !emailsStr.contains( e ) ) 1612 if ( !emailsStr.contains( e ) )
1608 return; 1613 return;
1609 1614
1610 // remove it 1615 // remove it
1611 //qDebug(" removing email from list %s", e.latin1()); 1616 //qDebug(" removing email from list %s", e.latin1());
1612 emails.remove( e ); 1617 emails.remove( e );
1613 // reset the string 1618 // reset the string
1614 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator 1619 emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator
1615 replace( Qtopia::Emails, emailsStr ); 1620 replace( Qtopia::Emails, emailsStr );
1616 1621
1617 // if default, then replace the default email with the first one 1622 // if default, then replace the default email with the first one
1618 if ( def == e ) { 1623 if ( def == e ) {
1619 //qDebug("removeEmail is default; setting new default"); 1624 //qDebug("removeEmail is default; setting new default");
1620 if ( !emails.count() ) 1625 if ( !emails.count() )
1621 clearEmails(); 1626 clearEmails();
1622 else // setDefaultEmail will remove e from the list 1627 else // setDefaultEmail will remove e from the list