summaryrefslogtreecommitdiff
path: root/library/backend/contact.cpp
Unidiff
Diffstat (limited to 'library/backend/contact.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/contact.cpp526
1 files changed, 505 insertions, 21 deletions
diff --git a/library/backend/contact.cpp b/library/backend/contact.cpp
index b10b19a..3f4934a 100644
--- a/library/backend/contact.cpp
+++ b/library/backend/contact.cpp
@@ -1,117 +1,495 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2001 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_CONTACT_MRE 21#define QTOPIA_INTERNAL_CONTACT_MRE
22 22
23#include "contact.h" 23#include "contact.h"
24#include "vobject_p.h" 24#include "vobject_p.h"
25#include "qfiledirect_p.h" 25#include "qfiledirect_p.h"
26 26
27#include <qpe/stringutil.h> 27#include <qpe/stringutil.h>
28#include <qpe/timeconversion.h> 28#include <qpe/timeconversion.h>
29 29
30#include <qobject.h> 30#include <qobject.h>
31#include <qregexp.h> 31#include <qregexp.h>
32#include <qstylesheet.h> 32#include <qstylesheet.h>
33#include <qfileinfo.h> 33#include <qfileinfo.h>
34 34
35#include <stdio.h> 35#include <stdio.h>
36 36
37/*!
38 \class Contact contact.h
39 \brief The Contact class holds the data of an address book entry.
40
41 This data includes information the name of the person, contact
42 information, and business information such as deparment and job title.
43
44 \ingroup qtopiaemb
45 \ingroup qtopiadesktop
46*/
47
37Qtopia::UidGen Contact::sUidGen( Qtopia::UidGen::Qtopia ); 48Qtopia::UidGen Contact::sUidGen( Qtopia::UidGen::Qtopia );
38 49
50/*!
51 Creates a new, empty contact.
52*/
39Contact::Contact() 53Contact::Contact()
40 : Record(), mMap(), d( 0 ) 54 : Record(), mMap(), d( 0 )
41{ 55{
42} 56}
43 57
58/*!
59 \internal
60 Creates a new contact. The properties of the contact are
61 set from \a fromMap.
62*/
44Contact::Contact( const QMap<int, QString> &fromMap ) : 63Contact::Contact( const QMap<int, QString> &fromMap ) :
45 Record(), mMap( fromMap ), d( 0 ) 64 Record(), mMap( fromMap ), d( 0 )
46{ 65{
47 QString cats = mMap[ Qtopia::AddressCategory ]; 66 QString cats = mMap[ Qtopia::AddressCategory ];
48 if ( !cats.isEmpty() ) 67 if ( !cats.isEmpty() )
49 setCategories( idsFromString( cats ) ); 68 setCategories( idsFromString( cats ) );
50 QString uidStr = find( Qtopia::AddressUid ); 69 QString uidStr = find( Qtopia::AddressUid );
70
51 if ( uidStr.isEmpty() ) 71 if ( uidStr.isEmpty() )
52 setUid( uidGen().generate() ); 72 setUid( uidGen().generate() );
53 else 73 else
54 setUid( uidStr.toInt() ); 74 setUid( uidStr.toInt() );
75
76 if ( !uidStr.isEmpty() )
77 setUid( uidStr.toInt() );
55} 78}
56 79
80/*!
81 Destroys a contact.
82*/
57Contact::~Contact() 83Contact::~Contact()
58{ 84{
59} 85}
60 86
87/*! \fn void Contact::setTitle( const QString &str )
88 Sets the title of the contact to \a str.
89*/
90
91/*! \fn void Contact::setFirstName( const QString &str )
92 Sets the first name of the contact to \a str.
93*/
94
95/*! \fn void Contact::setMiddleName( const QString &str )
96 Sets the middle name of the contact to \a str.
97*/
98
99/*! \fn void Contact::setLastName( const QString &str )
100 Sets the last name of the contact to \a str.
101*/
102
103/*! \fn void Contact::setSuffix( const QString &str )
104 Sets the suffix of the contact to \a str.
105*/
106
107/*! \fn void Contact::setFileAs( const QString &str )
108 Sets the contact to filed as \a str.
109*/
110
111/*! \fn void Contact::setDefaultEmail( const QString &str )
112 Sets the default email of the contact to \a str.
113*/
114
115/*! \fn void Contact::setHomeStreet( const QString &str )
116 Sets the home street address of the contact to \a str.
117*/
118
119/*! \fn void Contact::setHomeCity( const QString &str )
120 Sets the home city of the contact to \a str.
121*/
122
123/*! \fn void Contact::setHomeState( const QString &str )
124 Sets the home state of the contact to \a str.
125*/
126
127/*! \fn void Contact::setHomeZip( const QString &str )
128 Sets the home zip code of the contact to \a str.
129*/
130
131/*! \fn void Contact::setHomeCountry( const QString &str )
132 Sets the home country of the contact to \a str.
133*/
134
135/*! \fn void Contact::setHomePhone( const QString &str )
136 Sets the home phone number of the contact to \a str.
137*/
138
139/*! \fn void Contact::setHomeFax( const QString &str )
140 Sets the home fax number of the contact to \a str.
141*/
142
143/*! \fn void Contact::setHomeMobile( const QString &str )
144 Sets the home mobile phone number of the contact to \a str.
145*/
146
147/*! \fn void Contact::setHomeWebpage( const QString &str )
148 Sets the home webpage of the contact to \a str.
149*/
150
151/*! \fn void Contact::setCompany( const QString &str )
152 Sets the company for contact to \a str.
153*/
154
155/*! \fn void Contact::setJobTitle( const QString &str )
156 Sets the job title of the contact to \a str.
157*/
158
159/*! \fn void Contact::setDepartment( const QString &str )
160 Sets the department for contact to \a str.
161*/
162
163/*! \fn void Contact::setOffice( const QString &str )
164 Sets the office for contact to \a str.
165*/
166
167/*! \fn void Contact::setBusinessStreet( const QString &str )
168 Sets the business street address of the contact to \a str.
169*/
170
171/*! \fn void Contact::setBusinessCity( const QString &str )
172 Sets the business city of the contact to \a str.
173*/
174
175/*! \fn void Contact::setBusinessState( const QString &str )
176 Sets the business state of the contact to \a str.
177*/
178
179/*! \fn void Contact::setBusinessZip( const QString &str )
180 Sets the business zip code of the contact to \a str.
181*/
182
183/*! \fn void Contact::setBusinessCountry( const QString &str )
184 Sets the business country of the contact to \a str.
185*/
186
187/*! \fn void Contact::setBusinessPhone( const QString &str )
188 Sets the business phone number of the contact to \a str.
189*/
190
191/*! \fn void Contact::setBusinessFax( const QString &str )
192 Sets the business fax number of the contact to \a str.
193*/
194
195/*! \fn void Contact::setBusinessMobile( const QString &str )
196 Sets the business mobile phone number of the contact to \a str.
197*/
198
199/*! \fn void Contact::setBusinessPager( const QString &str )
200 Sets the business pager number of the contact to \a str.
201*/
202
203/*! \fn void Contact::setBusinessWebpage( const QString &str )
204 Sets the business webpage of the contact to \a str.
205*/
206
207/*! \fn void Contact::setProfession( const QString &str )
208 Sets the profession of the contact to \a str.
209*/
210
211/*! \fn void Contact::setAssistant( const QString &str )
212 Sets the assistant of the contact to \a str.
213*/
214
215/*! \fn void Contact::setManager( const QString &str )
216 Sets the manager of the contact to \a str.
217*/
218
219/*! \fn void Contact::setSpouse( const QString &str )
220 Sets the spouse of the contact to \a str.
221*/
222
223/*! \fn void Contact::setGender( const QString &str )
224 Sets the gender of the contact to \a str.
225*/
226
227/*! \fn void Contact::setBirthday( const QString &str )
228 Sets the birthday for the contact to \a str.
229*/
230
231/*! \fn void Contact::setAnniversary( const QString &str )
232 Sets the anniversary of the contact to \a str.
233*/
234
235/*! \fn void Contact::setNickname( const QString &str )
236 Sets the nickname of the contact to \a str.
237*/
238
239/*! \fn void Contact::setNotes( const QString &str )
240 Sets the notes about the contact to \a str.
241*/
242
243/*! \fn QString Contact::title() const
244 Returns the title of the contact.
245*/
246
247/*! \fn QString Contact::firstName() const
248 Returns the first name of the contact.
249*/
250
251/*! \fn QString Contact::middleName() const
252 Returns the middle name of the contact.
253*/
254
255/*! \fn QString Contact::lastName() const
256 Returns the last name of the contact.
257*/
258
259/*! \fn QString Contact::suffix() const
260 Returns the suffix of the contact.
261*/
262
263/*! \fn QString Contact::fileAs() const
264 Returns the string the contact is filed as.
265*/
266
267/*! \fn QString Contact::defaultEmail() const
268 Returns the default email address of the contact.
269*/
270
271/*! \fn QString Contact::emails() const
272 Returns the list of email address for a contact separated by ';'s in a single
273 string.
274*/
275
276/*! \fn QString Contact::homeStreet() const
277 Returns the home street address of the contact.
278*/
279
280/*! \fn QString Contact::homeCity() const
281 Returns the home city of the contact.
282*/
283
284/*! \fn QString Contact::homeState() const
285 Returns the home state of the contact.
286*/
287
288/*! \fn QString Contact::homeZip() const
289 Returns the home zip of the contact.
290*/
291
292/*! \fn QString Contact::homeCountry() const
293 Returns the home country of the contact.
294*/
295
296/*! \fn QString Contact::homePhone() const
297 Returns the home phone number of the contact.
298*/
299
300/*! \fn QString Contact::homeFax() const
301 Returns the home fax number of the contact.
302*/
303
304/*! \fn QString Contact::homeMobile() const
305 Returns the home mobile number of the contact.
306*/
307
308/*! \fn QString Contact::homeWebpage() const
309 Returns the home webpage of the contact.
310*/
311
312/*! \fn QString Contact::company() const
313 Returns the company for the contact.
314*/
315
316/*! \fn QString Contact::department() const
317 Returns the department for the contact.
318*/
319
320/*! \fn QString Contact::office() const
321 Returns the office for the contact.
322*/
323
324/*! \fn QString Contact::jobTitle() const
325 Returns the job title of the contact.
326*/
327
328/*! \fn QString Contact::profession() const
329 Returns the profession of the contact.
330*/
331
332/*! \fn QString Contact::assistant() const
333 Returns the assistant of the contact.
334*/
335
336/*! \fn QString Contact::manager() const
337 Returns the manager of the contact.
338*/
339
340/*! \fn QString Contact::businessStreet() const
341 Returns the business street address of the contact.
342*/
343
344/*! \fn QString Contact::businessCity() const
345 Returns the business city of the contact.
346*/
347
348/*! \fn QString Contact::businessState() const
349 Returns the business state of the contact.
350*/
351
352/*! \fn QString Contact::businessZip() const
353 Returns the business zip of the contact.
354*/
355
356/*! \fn QString Contact::businessCountry() const
357 Returns the business country of the contact.
358*/
359
360/*! \fn QString Contact::businessPhone() const
361 Returns the business phone number of the contact.
362*/
363
364/*! \fn QString Contact::businessFax() const
365 Returns the business fax number of the contact.
366*/
367
368/*! \fn QString Contact::businessMobile() const
369 Returns the business mobile number of the contact.
370*/
371
372/*! \fn QString Contact::businessPager() const
373 Returns the business pager number of the contact.
374*/
375
376/*! \fn QString Contact::businessWebpage() const
377 Returns the business webpage of the contact.
378*/
379
380/*! \fn QString Contact::spouse() const
381 Returns the spouse of the contact.
382*/
383
384/*! \fn QString Contact::gender() const
385 Returns the gender of the contact.
386*/
387
388/*! \fn QString Contact::birthday() const
389 Returns the birthday of the contact.
390*/
391
392/*! \fn QString Contact::anniversary() const
393 Returns the anniversary of the contact.
394*/
395
396/*! \fn QString Contact::nickname() const
397 Returns the nickname of the contact.
398*/
399
400/*! \fn QString Contact::children() const
401 Returns the children of the contact.
402*/
403
404/*! \fn QString Contact::notes() const
405 Returns the notes relating to the the contact.
406*/
407
408/*! \fn QString Contact::groups() const
409 \internal
410 Returns the groups for the contact.
411*/
412
413/*! \fn QStringList Contact::groupList() const
414 \internal
415*/
416
417/*! \fn QString Contact::field(int) const
418 \internal
419*/
420
421/*! \fn void Contact::saveJournal( journal_action, const QString & = QString::null )
422 \internal
423*/
424
425/*! \fn void Contact::setUid( int id )
426 \internal
427 Sets the uid for this record to \a id.
428*/
429
430/*! \enum Contact::journal_action
431 \internal
432*/
433
434/*!
435 \internal
436*/
61QMap<int, QString> Contact::toMap() const 437QMap<int, QString> Contact::toMap() const
62{ 438{
63 QMap<int, QString> map = mMap; 439 QMap<int, QString> map = mMap;
64 map.insert( Qtopia::AddressCategory, idsToString( categories() )); 440 QString cats = idsToString( categories() );
441 if ( !cats.isEmpty() )
442 map.insert( Qtopia::AddressCategory, cats );
65 return map; 443 return map;
66} 444}
67 445
68/*! 446/*!
69 Returns a rich text formatted QString of the Contact. 447 Returns a rich text formatted QString representing the contents the contact.
70*/ 448*/
71QString Contact::toRichText() const 449QString Contact::toRichText() const
72{ 450{
73 QString text; 451 QString text;
74 QString value, comp, state; 452 QString value, comp, state;
75 453
76 // name, jobtitle and company 454 // name, jobtitle and company
77 if ( !(value = fullName()).isEmpty() ) 455 if ( !(value = fullName()).isEmpty() )
78 text += "<b>" + Qtopia::escapeString(value) + "</b><br>"; 456 text += "<b>" + Qtopia::escapeString(value) + "</b><br>";
79 if ( !(value = jobTitle()).isEmpty() ) 457 if ( !(value = jobTitle()).isEmpty() )
80 text += Qtopia::escapeString(value) + "<br>"; 458 text += Qtopia::escapeString(value) + "<br>";
81 459
82 comp = company(); 460 comp = company();
83 if ( !(value = department()).isEmpty() ) { 461 if ( !(value = department()).isEmpty() ) {
84 text += Qtopia::escapeString(value); 462 text += Qtopia::escapeString(value);
85 if ( comp ) 463 if ( comp )
86 text += ", "; 464 text += ", ";
87 else 465 else
88 text += "<br>"; 466 text += "<br>";
89 } 467 }
90 if ( !comp.isEmpty() ) 468 if ( !comp.isEmpty() )
91 text += Qtopia::escapeString(comp) + "<br>"; 469 text += Qtopia::escapeString(comp) + "<br>";
92 470
93 // business address 471 // business address
94 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || 472 if ( !businessStreet().isEmpty() || !businessCity().isEmpty() ||
95 !businessZip().isEmpty() || !businessCountry().isEmpty() ) { 473 !businessZip().isEmpty() || !businessCountry().isEmpty() ) {
96 text += "<br>"; 474 text += "<br>";
97 text += QObject::tr( "<b>Work Address:</b>" ); 475 text += QObject::tr( "<b>Work Address:</b>" );
98 text += "<br>"; 476 text += "<br>";
99 } 477 }
100 478
101 if ( !(value = businessStreet()).isEmpty() ) 479 if ( !(value = businessStreet()).isEmpty() )
102 text += Qtopia::escapeString(value) + "<br>"; 480 text += Qtopia::escapeString(value) + "<br>";
103 state = businessState(); 481 state = businessState();
104 if ( !(value = businessCity()).isEmpty() ) { 482 if ( !(value = businessCity()).isEmpty() ) {
105 text += Qtopia::escapeString(value); 483 text += Qtopia::escapeString(value);
106 if ( state ) 484 if ( state )
107 text += ", " + Qtopia::escapeString(state); 485 text += ", " + Qtopia::escapeString(state);
108 text += "<br>"; 486 text += "<br>";
109 } else if ( !state.isEmpty() ) 487 } else if ( !state.isEmpty() )
110 text += Qtopia::escapeString(state) + "<br>"; 488 text += Qtopia::escapeString(state) + "<br>";
111 if ( !(value = businessZip()).isEmpty() ) 489 if ( !(value = businessZip()).isEmpty() )
112 text += Qtopia::escapeString(value) + "<br>"; 490 text += Qtopia::escapeString(value) + "<br>";
113 if ( !(value = businessCountry()).isEmpty() ) 491 if ( !(value = businessCountry()).isEmpty() )
114 text += Qtopia::escapeString(value) + "<br>"; 492 text += Qtopia::escapeString(value) + "<br>";
115 493
116 // home address 494 // home address
117 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || 495 if ( !homeStreet().isEmpty() || !homeCity().isEmpty() ||
@@ -186,387 +564,482 @@ QString Contact::toRichText() const
186 if ( !str.isEmpty() ) 564 if ( !str.isEmpty() )
187 text += "<b>" + QObject::tr("Profession: ") + "</b>" 565 text += "<b>" + QObject::tr("Profession: ") + "</b>"
188 + Qtopia::escapeString(str) + "<br>"; 566 + Qtopia::escapeString(str) + "<br>";
189 str = assistant(); 567 str = assistant();
190 if ( !str.isEmpty() ) 568 if ( !str.isEmpty() )
191 text += "<b>" + QObject::tr("Assistant: ") + "</b>" 569 text += "<b>" + QObject::tr("Assistant: ") + "</b>"
192 + Qtopia::escapeString(str) + "<br>"; 570 + Qtopia::escapeString(str) + "<br>";
193 str = manager(); 571 str = manager();
194 if ( !str.isEmpty() ) 572 if ( !str.isEmpty() )
195 text += "<b>" + QObject::tr("Manager: ") + "</b>" 573 text += "<b>" + QObject::tr("Manager: ") + "</b>"
196 + Qtopia::escapeString(str) + "<br>"; 574 + Qtopia::escapeString(str) + "<br>";
197 str = gender(); 575 str = gender();
198 if ( !str.isEmpty() && str.toInt() != 0 ) { 576 if ( !str.isEmpty() && str.toInt() != 0 ) {
199 if ( str.toInt() == 1 ) 577 if ( str.toInt() == 1 )
200 str = QObject::tr( "Male" ); 578 str = QObject::tr( "Male" );
201 else if ( str.toInt() == 2 ) 579 else if ( str.toInt() == 2 )
202 str = QObject::tr( "Female" ); 580 str = QObject::tr( "Female" );
203 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>"; 581 text += "<b>" + QObject::tr("Gender: ") + "</b>" + str + "<br>";
204 } 582 }
205 str = spouse(); 583 str = spouse();
206 if ( !str.isEmpty() ) 584 if ( !str.isEmpty() )
207 text += "<b>" + QObject::tr("Spouse: ") + "</b>" 585 text += "<b>" + QObject::tr("Spouse: ") + "</b>"
208 + Qtopia::escapeString(str) + "<br>"; 586 + Qtopia::escapeString(str) + "<br>";
209 str = birthday(); 587 str = birthday();
210 if ( !str.isEmpty() ) 588 if ( !str.isEmpty() )
211 text += "<b>" + QObject::tr("Birthday: ") + "</b>" 589 text += "<b>" + QObject::tr("Birthday: ") + "</b>"
212 + Qtopia::escapeString(str) + "<br>"; 590 + Qtopia::escapeString(str) + "<br>";
213 str = anniversary(); 591 str = anniversary();
214 if ( !str.isEmpty() ) 592 if ( !str.isEmpty() )
215 text += "<b>" + QObject::tr("Anniversary: ") + "</b>" 593 text += "<b>" + QObject::tr("Anniversary: ") + "</b>"
216 + Qtopia::escapeString(str) + "<br>"; 594 + Qtopia::escapeString(str) + "<br>";
217 str = nickname(); 595 str = nickname();
218 if ( !str.isEmpty() ) 596 if ( !str.isEmpty() )
219 text += "<b>" + QObject::tr("Nickname: ") + "</b>" 597 text += "<b>" + QObject::tr("Nickname: ") + "</b>"
220 + Qtopia::escapeString(str) + "<br>"; 598 + Qtopia::escapeString(str) + "<br>";
221 599
222 // notes last 600 // notes last
223 if ( (value = notes()) ) { 601 if ( (value = notes()) ) {
224 QRegExp reg("\n"); 602 QRegExp reg("\n");
225 603
226 //QString tmp = Qtopia::escapeString(value); 604 //QString tmp = Qtopia::escapeString(value);
227 QString tmp = QStyleSheet::convertFromPlainText(value); 605 QString tmp = QStyleSheet::convertFromPlainText(value);
228 //tmp.replace( reg, "<br>" ); 606 //tmp.replace( reg, "<br>" );
229 text += "<br>" + tmp + "<br>"; 607 text += "<br>" + tmp + "<br>";
230 } 608 }
231 return text; 609 return text;
232} 610}
233 611
612/*!
613 \internal
614*/
234void Contact::insert( int key, const QString &v ) 615void Contact::insert( int key, const QString &v )
235{ 616{
236 QString value = v.stripWhiteSpace(); 617 QString value = v.stripWhiteSpace();
237 if ( value.isEmpty() ) 618 if ( value.isEmpty() )
238 mMap.remove( key ); 619 mMap.remove( key );
239 else 620 else
240 mMap.insert( key, value ); 621 mMap.insert( key, value );
241} 622}
242 623
624/*!
625 \internal
626*/
243void Contact::replace( int key, const QString & v ) 627void Contact::replace( int key, const QString & v )
244{ 628{
245 QString value = v.stripWhiteSpace(); 629 QString value = v.stripWhiteSpace();
246 if ( value.isEmpty() ) 630 if ( value.isEmpty() )
247 mMap.remove( key ); 631 mMap.remove( key );
248 else 632 else
249 mMap.replace( key, value ); 633 mMap.replace( key, value );
250} 634}
251 635
636/*!
637 \internal
638*/
252QString Contact::find( int key ) const 639QString Contact::find( int key ) const
253{ 640{
254 return mMap[key]; 641 return mMap[key];
255} 642}
256 643
644/*!
645 \internal
646*/
257QString Contact::displayAddress( const QString &street, 647QString Contact::displayAddress( const QString &street,
258 const QString &city, 648 const QString &city,
259 const QString &state, 649 const QString &state,
260 const QString &zip, 650 const QString &zip,
261 const QString &country ) const 651 const QString &country ) const
262{ 652{
263 QString s = street; 653 QString s = street;
264 if ( !street.isEmpty() ) 654 if ( !street.isEmpty() )
265 s+= "\n"; 655 s+= "\n";
266 s += city; 656 s += city;
267 if ( !city.isEmpty() && !state.isEmpty() ) 657 if ( !city.isEmpty() && !state.isEmpty() )
268 s += ", "; 658 s += ", ";
269 s += state; 659 s += state;
270 if ( !state.isEmpty() && !zip.isEmpty() ) 660 if ( !state.isEmpty() && !zip.isEmpty() )
271 s += " "; 661 s += " ";
272 s += zip; 662 s += zip;
273 if ( !country.isEmpty() && !s.isEmpty() ) 663 if ( !country.isEmpty() && !s.isEmpty() )
274 s += "\n"; 664 s += "\n";
275 s += country; 665 s += country;
276 return s; 666 return s;
277} 667}
278 668
669/*!
670 \internal
671*/
279QString Contact::displayBusinessAddress() const 672QString Contact::displayBusinessAddress() const
280{ 673{
281 return displayAddress( businessStreet(), businessCity(), 674 return displayAddress( businessStreet(), businessCity(),
282 businessState(), businessZip(), 675 businessState(), businessZip(),
283 businessCountry() ); 676 businessCountry() );
284} 677}
285 678
679/*!
680 \internal
681*/
286QString Contact::displayHomeAddress() const 682QString Contact::displayHomeAddress() const
287{ 683{
288 return displayAddress( homeStreet(), homeCity(), 684 return displayAddress( homeStreet(), homeCity(),
289 homeState(), homeZip(), 685 homeState(), homeZip(),
290 homeCountry() ); 686 homeCountry() );
291} 687}
292 688
689/*!
690 Returns the full name of the contact
691*/
293QString Contact::fullName() const 692QString Contact::fullName() const
294{ 693{
295 QString title = find( Qtopia::Title ); 694 QString title = find( Qtopia::Title );
296 QString firstName = find( Qtopia::FirstName ); 695 QString firstName = find( Qtopia::FirstName );
297 QString middleName = find( Qtopia::MiddleName ); 696 QString middleName = find( Qtopia::MiddleName );
298 QString lastName = find( Qtopia::LastName ); 697 QString lastName = find( Qtopia::LastName );
299 QString suffix = find( Qtopia::Suffix ); 698 QString suffix = find( Qtopia::Suffix );
300 699
301 QString name = title; 700 QString name = title;
302 if ( !firstName.isEmpty() ) { 701 if ( !firstName.isEmpty() ) {
303 if ( !name.isEmpty() ) 702 if ( !name.isEmpty() )
304 name += " "; 703 name += " ";
305 name += firstName; 704 name += firstName;
306 } 705 }
307 if ( !middleName.isEmpty() ) { 706 if ( !middleName.isEmpty() ) {
308 if ( !name.isEmpty() ) 707 if ( !name.isEmpty() )
309 name += " "; 708 name += " ";
310 name += middleName; 709 name += middleName;
311 } 710 }
312 if ( !lastName.isEmpty() ) { 711 if ( !lastName.isEmpty() ) {
313 if ( !name.isEmpty() ) 712 if ( !name.isEmpty() )
314 name += " "; 713 name += " ";
315 name += lastName; 714 name += lastName;
316 } 715 }
317 if ( !suffix.isEmpty() ) { 716 if ( !suffix.isEmpty() ) {
318 if ( !name.isEmpty() ) 717 if ( !name.isEmpty() )
319 name += " "; 718 name += " ";
320 name += suffix; 719 name += suffix;
321 } 720 }
322 return name.simplifyWhiteSpace(); 721 return name.simplifyWhiteSpace();
323} 722}
324 723
724/*!
725 Returns a list of the names of the children of the contact.
726*/
325QStringList Contact::childrenList() const 727QStringList Contact::childrenList() const
326{ 728{
327 return QStringList::split( " ", find( Qtopia::Children ) ); 729 return QStringList::split( " ", find( Qtopia::Children ) );
328} 730}
329 731
732/*! \fn void Contact::insertEmail( const QString &email )
733
734 Insert \a email into the email list. Ensures \a email can only be added
735 once. If there is no default email address set, it sets it to the \a email.
736*/
737
738/*! \fn void Contact::removeEmail( const QString &email )
739
740 Removes the \a email from the email list. If the default email was \a email,
741 then the default email address is assigned to the first email in the
742 email list
743*/
744
745/*! \fn void Contact::clearEmails()
746
747 Clears the email list.
748 */
749
750/*! \fn void Contact::insertEmails( const QStringList &emailList )
751
752 Appends the \a emailList to the exiting email list
753 */
754
755/*!
756 Returns a list of email addresses belonging to the contact, including
757 the default email address.
758*/
330QStringList Contact::emailList() const 759QStringList Contact::emailList() const
331{ 760{
332 return QStringList::split( ";", find( Qtopia::Emails ) ); 761 QString emailStr = emails();
762
763 QStringList r;
764 if ( !emailStr.isEmpty() ) {
765 qDebug(" emailstr ");
766 QStringList l = QStringList::split( emailSeparator(), emailStr );
767 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
768 r += (*it).simplifyWhiteSpace();
769 }
770
771 return r;
333} 772}
334 773
774/*!
775 \overload
776
777 Generates the string for the contact to be filed as from the first,
778 middle and last name of the contact.
779*/
335void Contact::setFileAs() 780void Contact::setFileAs()
336{ 781{
337 QString lastName, firstName, middleName, fileas; 782 QString lastName, firstName, middleName, fileas;
338 783
339 lastName = find( Qtopia::LastName ); 784 lastName = find( Qtopia::LastName );
340 firstName = find( Qtopia::FirstName ); 785 firstName = find( Qtopia::FirstName );
341 middleName = find( Qtopia::MiddleName ); 786 middleName = find( Qtopia::MiddleName );
342 if ( !lastName.isEmpty() && !firstName.isEmpty() 787 if ( !lastName.isEmpty() && !firstName.isEmpty()
343 && !middleName.isEmpty() ) 788 && !middleName.isEmpty() )
344 fileas = lastName + ", " + firstName + " " + middleName; 789 fileas = lastName + ", " + firstName + " " + middleName;
345 else if ( !lastName.isEmpty() && !firstName.isEmpty() ) 790 else if ( !lastName.isEmpty() && !firstName.isEmpty() )
346 fileas = lastName + ", " + firstName; 791 fileas = lastName + ", " + firstName;
347 else if ( !lastName.isEmpty() || !firstName.isEmpty() || 792 else if ( !lastName.isEmpty() || !firstName.isEmpty() ||
348 !middleName.isEmpty() ) 793 !middleName.isEmpty() )
349 fileas = firstName + ( firstName.isEmpty() ? "" : " " ) 794 fileas = firstName + ( firstName.isEmpty() ? "" : " " )
350 + middleName + ( middleName.isEmpty() ? "" : " " ) 795 + middleName + ( middleName.isEmpty() ? "" : " " )
351 + lastName; 796 + lastName;
352 797
353 replace( Qtopia::FileAs, fileas ); 798 replace( Qtopia::FileAs, fileas );
354} 799}
355 800
801/*!
802 \internal
803 Appends the contact information to \a buf.
804*/
356void Contact::save( QString &buf ) const 805void Contact::save( QString &buf ) const
357{ 806{
358 static const QStringList SLFIELDS = fields(); 807 static const QStringList SLFIELDS = fields();
359 // I'm expecting "<Contact " in front of this... 808 // I'm expecting "<Contact " in front of this...
360 for ( QMap<int, QString>::ConstIterator it = mMap.begin(); 809 for ( QMap<int, QString>::ConstIterator it = mMap.begin();
361 it != mMap.end(); ++it ) { 810 it != mMap.end(); ++it ) {
362 const QString &value = it.data(); 811 const QString &value = it.data();
363 int key = it.key(); 812 int key = it.key();
364 if ( !value.isEmpty() ) { 813 if ( !value.isEmpty() ) {
365 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid) 814 if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid)
366 continue; 815 continue;
367 816
368 key -= Qtopia::AddressCategory+1; 817 key -= Qtopia::AddressCategory+1;
369 buf += SLFIELDS[key]; 818 buf += SLFIELDS[key];
370 buf += "=\"" + Qtopia::escapeString(value) + "\" "; 819 buf += "=\"" + Qtopia::escapeString(value) + "\" ";
371 } 820 }
372 } 821 }
373 buf += customToXml(); 822 buf += customToXml();
374 if ( categories().count() > 0 ) 823 if ( categories().count() > 0 )
375 buf += "Categories=\"" + idsToString( categories() ) + "\" "; 824 buf += "Categories=\"" + idsToString( categories() ) + "\" ";
376 buf += "Uid=\"" + QString::number( uid() ) + "\" "; 825 buf += "Uid=\"" + QString::number( uid() ) + "\" ";
377 // You need to close this yourself 826 // You need to close this yourself
378} 827}
379 828
829/*!
830 \internal
831 Returns the list of fields belonging to a contact
832*/
380QStringList Contact::fields() 833QStringList Contact::fields()
381{ 834{
382 QStringList list; 835 QStringList list;
383 836
384 list.append( "Title" ); // Not Used! 837 list.append( "Title" ); // Not Used!
385 list.append( "FirstName" ); 838 list.append( "FirstName" );
386 list.append( "MiddleName" ); 839 list.append( "MiddleName" );
387 list.append( "LastName" ); 840 list.append( "LastName" );
388 list.append( "Suffix" ); 841 list.append( "Suffix" );
389 list.append( "FileAs" ); 842 list.append( "FileAs" );
390 843
391 list.append( "JobTitle" ); 844 list.append( "JobTitle" );
392 list.append( "Department" ); 845 list.append( "Department" );
393 list.append( "Company" ); 846 list.append( "Company" );
394 list.append( "BusinessPhone" ); 847 list.append( "BusinessPhone" );
395 list.append( "BusinessFax" ); 848 list.append( "BusinessFax" );
396 list.append( "BusinessMobile" ); 849 list.append( "BusinessMobile" );
397 850
398 list.append( "DefaultEmail" ); 851 list.append( "DefaultEmail" );
399 list.append( "Emails" ); 852 list.append( "Emails" );
400 853
401 list.append( "HomePhone" ); 854 list.append( "HomePhone" );
402 list.append( "HomeFax" ); 855 list.append( "HomeFax" );
403 list.append( "HomeMobile" ); 856 list.append( "HomeMobile" );
404 857
405 list.append( "BusinessStreet" ); 858 list.append( "BusinessStreet" );
406 list.append( "BusinessCity" ); 859 list.append( "BusinessCity" );
407 list.append( "BusinessState" ); 860 list.append( "BusinessState" );
408 list.append( "BusinessZip" ); 861 list.append( "BusinessZip" );
409 list.append( "BusinessCountry" ); 862 list.append( "BusinessCountry" );
410 list.append( "BusinessPager" ); 863 list.append( "BusinessPager" );
411 list.append( "BusinessWebPage" ); 864 list.append( "BusinessWebPage" );
412 865
413 list.append( "Office" ); 866 list.append( "Office" );
414 list.append( "Profession" ); 867 list.append( "Profession" );
415 list.append( "Assistant" ); 868 list.append( "Assistant" );
416 list.append( "Manager" ); 869 list.append( "Manager" );
417 870
418 list.append( "HomeStreet" ); 871 list.append( "HomeStreet" );
419 list.append( "HomeCity" ); 872 list.append( "HomeCity" );
420 list.append( "HomeState" ); 873 list.append( "HomeState" );
421 list.append( "HomeZip" ); 874 list.append( "HomeZip" );
422 list.append( "HomeCountry" ); 875 list.append( "HomeCountry" );
423 list.append( "HomeWebPage" ); 876 list.append( "HomeWebPage" );
424 877
425 list.append( "Spouse" ); 878 list.append( "Spouse" );
426 list.append( "Gender" ); 879 list.append( "Gender" );
427 list.append( "Birthday" ); 880 list.append( "Birthday" );
428 list.append( "Anniversary" ); 881 list.append( "Anniversary" );
429 list.append( "Nickname" ); 882 list.append( "Nickname" );
430 list.append( "Children" ); 883 list.append( "Children" );
431 884
432 list.append( "Notes" ); 885 list.append( "Notes" );
433 list.append( "Groups" ); 886 list.append( "Groups" );
434 887
435 return list; 888 return list;
436} 889}
437 890
891/*!
892 \internal
893 Returns a translated list of field names for a contact.
894*/
438QStringList Contact::trfields() 895QStringList Contact::trfields()
439{ 896{
440 QStringList list; 897 QStringList list;
441 898
442 list.append( QObject::tr( "Name Title") ); 899 list.append( QObject::tr( "Name Title") );
443 list.append( QObject::tr( "First Name" ) ); 900 list.append( QObject::tr( "First Name" ) );
444 list.append( QObject::tr( "Middle Name" ) ); 901 list.append( QObject::tr( "Middle Name" ) );
445 list.append( QObject::tr( "Last Name" ) ); 902 list.append( QObject::tr( "Last Name" ) );
446 list.append( QObject::tr( "Suffix" ) ); 903 list.append( QObject::tr( "Suffix" ) );
447 list.append( QObject::tr( "File As" ) ); 904 list.append( QObject::tr( "File As" ) );
448 905
449 list.append( QObject::tr( "Job Title" ) ); 906 list.append( QObject::tr( "Job Title" ) );
450 list.append( QObject::tr( "Department" ) ); 907 list.append( QObject::tr( "Department" ) );
451 list.append( QObject::tr( "Company" ) ); 908 list.append( QObject::tr( "Company" ) );
452 list.append( QObject::tr( "Business Phone" ) ); 909 list.append( QObject::tr( "Business Phone" ) );
453 list.append( QObject::tr( "Business Fax" ) ); 910 list.append( QObject::tr( "Business Fax" ) );
454 list.append( QObject::tr( "Business Mobile" ) ); 911 list.append( QObject::tr( "Business Mobile" ) );
455 912
456 list.append( QObject::tr( "Default Email" ) ); 913 list.append( QObject::tr( "Default Email" ) );
457 list.append( QObject::tr( "Emails" ) ); 914 list.append( QObject::tr( "Emails" ) );
458 915
459 list.append( QObject::tr( "Home Phone" ) ); 916 list.append( QObject::tr( "Home Phone" ) );
460 list.append( QObject::tr( "Home Fax" ) ); 917 list.append( QObject::tr( "Home Fax" ) );
461 list.append( QObject::tr( "Home Mobile" ) ); 918 list.append( QObject::tr( "Home Mobile" ) );
462 919
463 list.append( QObject::tr( "Business Street" ) ); 920 list.append( QObject::tr( "Business Street" ) );
464 list.append( QObject::tr( "Business City" ) ); 921 list.append( QObject::tr( "Business City" ) );
465 list.append( QObject::tr( "Business State" ) ); 922 list.append( QObject::tr( "Business State" ) );
466 list.append( QObject::tr( "Business Zip" ) ); 923 list.append( QObject::tr( "Business Zip" ) );
467 list.append( QObject::tr( "Business Country" ) ); 924 list.append( QObject::tr( "Business Country" ) );
468 list.append( QObject::tr( "Business Pager" ) ); 925 list.append( QObject::tr( "Business Pager" ) );
469 list.append( QObject::tr( "Business WebPage" ) ); 926 list.append( QObject::tr( "Business WebPage" ) );
470 927
471 list.append( QObject::tr( "Office" ) ); 928 list.append( QObject::tr( "Office" ) );
472 list.append( QObject::tr( "Profession" ) ); 929 list.append( QObject::tr( "Profession" ) );
473 list.append( QObject::tr( "Assistant" ) ); 930 list.append( QObject::tr( "Assistant" ) );
474 list.append( QObject::tr( "Manager" ) ); 931 list.append( QObject::tr( "Manager" ) );
475 932
476 list.append( QObject::tr( "Home Street" ) ); 933 list.append( QObject::tr( "Home Street" ) );
477 list.append( QObject::tr( "Home City" ) ); 934 list.append( QObject::tr( "Home City" ) );
478 list.append( QObject::tr( "Home State" ) ); 935 list.append( QObject::tr( "Home State" ) );
479 list.append( QObject::tr( "Home Zip" ) ); 936 list.append( QObject::tr( "Home Zip" ) );
480 list.append( QObject::tr( "Home Country" ) ); 937 list.append( QObject::tr( "Home Country" ) );
481 list.append( QObject::tr( "Home Web Page" ) ); 938 list.append( QObject::tr( "Home Web Page" ) );
482 939
483 list.append( QObject::tr( "Spouse" ) ); 940 list.append( QObject::tr( "Spouse" ) );
484 list.append( QObject::tr( "Gender" ) ); 941 list.append( QObject::tr( "Gender" ) );
485 list.append( QObject::tr( "Birthday" ) ); 942 list.append( QObject::tr( "Birthday" ) );
486 list.append( QObject::tr( "Anniversary" ) ); 943 list.append( QObject::tr( "Anniversary" ) );
487 list.append( QObject::tr( "Nickname" ) ); 944 list.append( QObject::tr( "Nickname" ) );
488 list.append( QObject::tr( "Children" ) ); 945 list.append( QObject::tr( "Children" ) );
489 946
490 list.append( QObject::tr( "Notes" ) ); 947 list.append( QObject::tr( "Notes" ) );
491 list.append( QObject::tr( "Groups" ) ); 948 list.append( QObject::tr( "Groups" ) );
492 949
493 return list; 950 return list;
494} 951}
495 952
496void Contact::setEmails( const QString &v ) 953/*!
954 Sets the list of email address for contact to those contained in \a str.
955 Email address should be separated by ';'s.
956*/
957void Contact::setEmails( const QString &str )
497{ 958{
498 replace( Qtopia::Emails, v ); 959 replace( Qtopia::Emails, str );
499 if ( v.isEmpty() ) 960 if ( str.isEmpty() )
500 setDefaultEmail( QString::null ); 961 setDefaultEmail( QString::null );
501} 962}
502 963
503void Contact::setChildren( const QString &v ) 964/*!
965 Sets the list of children for the contact to those contained in \a str.
966*/
967void Contact::setChildren( const QString &str )
504{ 968{
505 replace( Qtopia::Children, v ); 969 replace( Qtopia::Children, str );
506} 970}
507 971
508// vcard conversion code 972// vcard conversion code
973/*!
974 \internal
975*/
509static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) 976static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value )
510{ 977{
511 VObject *ret = 0; 978 VObject *ret = 0;
512 if ( o && !value.isEmpty() ) 979 if ( o && !value.isEmpty() )
513 ret = addPropValue( o, prop, value.latin1() ); 980 ret = addPropValue( o, prop, value.latin1() );
514 return ret; 981 return ret;
515} 982}
516 983
984/*!
985 \internal
986*/
517static inline VObject *safeAddProp( VObject *o, const char *prop) 987static inline VObject *safeAddProp( VObject *o, const char *prop)
518{ 988{
519 VObject *ret = 0; 989 VObject *ret = 0;
520 if ( o ) 990 if ( o )
521 ret = addProp( o, prop ); 991 ret = addProp( o, prop );
522 return ret; 992 return ret;
523} 993}
524 994
995/*!
996 \internal
997*/
525static VObject *createVObject( const Contact &c ) 998static VObject *createVObject( const Contact &c )
526{ 999{
527 VObject *vcard = newVObject( VCCardProp ); 1000 VObject *vcard = newVObject( VCCardProp );
528 safeAddPropValue( vcard, VCVersionProp, "2.1" ); 1001 safeAddPropValue( vcard, VCVersionProp, "2.1" );
529 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); 1002 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) );
530 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); 1003 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) );
531 1004
532 // full name 1005 // full name
533 safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); 1006 safeAddPropValue( vcard, VCFullNameProp, c.fullName() );
534 1007
535 // name properties 1008 // name properties
536 VObject *name = safeAddProp( vcard, VCNameProp ); 1009 VObject *name = safeAddProp( vcard, VCNameProp );
537 safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); 1010 safeAddPropValue( name, VCFamilyNameProp, c.lastName() );
538 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 1011 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
539 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 1012 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
540 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 1013 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
541 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 1014 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
542 1015
543 // home properties 1016 // home properties
544 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 1017 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
545 safeAddProp( home_adr, VCHomeProp ); 1018 safeAddProp( home_adr, VCHomeProp );
546 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 1019 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
547 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 1020 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
548 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 1021 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
549 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 1022 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
550 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 1023 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
551 1024
552 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 1025 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
553 safeAddProp( home_phone, VCHomeProp ); 1026 safeAddProp( home_phone, VCHomeProp );
554 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 1027 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
555 safeAddProp( home_phone, VCHomeProp ); 1028 safeAddProp( home_phone, VCHomeProp );
556 safeAddProp( home_phone, VCCellularProp ); 1029 safeAddProp( home_phone, VCCellularProp );
557 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 1030 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
558 safeAddProp( home_phone, VCHomeProp ); 1031 safeAddProp( home_phone, VCHomeProp );
559 safeAddProp( home_phone, VCFaxProp ); 1032 safeAddProp( home_phone, VCFaxProp );
560 1033
561 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 1034 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
562 safeAddProp( url, VCHomeProp ); 1035 safeAddProp( url, VCHomeProp );
563 1036
564 // work properties 1037 // work properties
565 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 1038 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
566 safeAddProp( work_adr, VCWorkProp ); 1039 safeAddProp( work_adr, VCWorkProp );
567 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 1040 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
568 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 1041 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
569 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 1042 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
570 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 1043 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
571 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 1044 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
572 1045
@@ -577,102 +1050,103 @@ static VObject *createVObject( const Contact &c )
577 safeAddProp( work_phone, VCCellularProp ); 1050 safeAddProp( work_phone, VCCellularProp );
578 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 1051 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
579 safeAddProp( work_phone, VCWorkProp ); 1052 safeAddProp( work_phone, VCWorkProp );
580 safeAddProp( work_phone, VCFaxProp ); 1053 safeAddProp( work_phone, VCFaxProp );
581 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 1054 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
582 safeAddProp( work_phone, VCWorkProp ); 1055 safeAddProp( work_phone, VCWorkProp );
583 safeAddProp( work_phone, VCPagerProp ); 1056 safeAddProp( work_phone, VCPagerProp );
584 1057
585 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 1058 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
586 safeAddProp( url, VCWorkProp ); 1059 safeAddProp( url, VCWorkProp );
587 1060
588 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 1061 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
589 safeAddProp( title, VCWorkProp ); 1062 safeAddProp( title, VCWorkProp );
590 1063
591 1064
592 QStringList emails = c.emailList(); 1065 QStringList emails = c.emailList();
593 emails.prepend( c.defaultEmail() ); 1066 emails.prepend( c.defaultEmail() );
594 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 1067 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
595 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 1068 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
596 safeAddProp( email, VCInternetProp ); 1069 safeAddProp( email, VCInternetProp );
597 } 1070 }
598 1071
599 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 1072 safeAddPropValue( vcard, VCNoteProp, c.notes() );
600 1073
601 safeAddPropValue( vcard, VCBirthDateProp, c.birthday() ); 1074 safeAddPropValue( vcard, VCBirthDateProp, c.birthday() );
602 1075
603 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 1076 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
604 VObject *org = safeAddProp( vcard, VCOrgProp ); 1077 VObject *org = safeAddProp( vcard, VCOrgProp );
605 safeAddPropValue( org, VCOrgNameProp, c.company() ); 1078 safeAddPropValue( org, VCOrgNameProp, c.company() );
606 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 1079 safeAddPropValue( org, VCOrgUnitProp, c.department() );
607 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 1080 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
608 } 1081 }
609 1082
610 // some values we have to export as custom fields 1083 // some values we have to export as custom fields
611 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 1084 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
612 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 1085 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
613 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 1086 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
614 1087
615 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 1088 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
616 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 1089 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
617 safeAddPropValue( vcard, "X-Qtopia-Anniversary", c.anniversary() ); 1090 safeAddPropValue( vcard, "X-Qtopia-Anniversary", c.anniversary() );
618 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 1091 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
619 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 1092 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
620 1093
621 return vcard; 1094 return vcard;
622} 1095}
623 1096
624 1097
1098/*!
1099 \internal
1100*/
625static Contact parseVObject( VObject *obj ) 1101static Contact parseVObject( VObject *obj )
626{ 1102{
627 Contact c; 1103 Contact c;
628 1104
629 bool haveDefaultEmail = FALSE;
630
631 VObjectIterator it; 1105 VObjectIterator it;
632 initPropIterator( &it, obj ); 1106 initPropIterator( &it, obj );
633 while( moreIteration( &it ) ) { 1107 while( moreIteration( &it ) ) {
634 VObject *o = nextVObject( &it ); 1108 VObject *o = nextVObject( &it );
635 QCString name = vObjectName( o ); 1109 QCString name = vObjectName( o );
636 QCString value = vObjectStringZValue( o ); 1110 QCString value = vObjectStringZValue( o );
637 if ( name == VCNameProp ) { 1111 if ( name == VCNameProp ) {
638 VObjectIterator nit; 1112 VObjectIterator nit;
639 initPropIterator( &nit, o ); 1113 initPropIterator( &nit, o );
640 while( moreIteration( &nit ) ) { 1114 while( moreIteration( &nit ) ) {
641 VObject *o = nextVObject( &nit ); 1115 VObject *o = nextVObject( &nit );
642 QCString name = vObjectTypeInfo( o ); 1116 QCString name = vObjectTypeInfo( o );
643 QString value = vObjectStringZValue( o ); 1117 QString value = vObjectStringZValue( o );
644 if ( name == VCNamePrefixesProp ) 1118 if ( name == VCNamePrefixesProp )
645 c.setTitle( value ); 1119 c.setTitle( value );
646 else if ( name == VCNameSuffixesProp ) 1120 else if ( name == VCNameSuffixesProp )
647 c.setSuffix( value ); 1121 c.setSuffix( value );
648 else if ( name == VCFamilyNameProp ) 1122 else if ( name == VCFamilyNameProp )
649 c.setLastName( value ); 1123 c.setLastName( value );
650 else if ( name == VCGivenNameProp ) 1124 else if ( name == VCGivenNameProp )
651 c.setFirstName( value ); 1125 c.setFirstName( value );
652 else if ( name == VCAdditionalNamesProp ) 1126 else if ( name == VCAdditionalNamesProp )
653 c.setMiddleName( value ); 1127 c.setMiddleName( value );
654 } 1128 }
655 } 1129 }
656 else if ( name == VCAdrProp ) { 1130 else if ( name == VCAdrProp ) {
657 bool work = TRUE; // default address is work address 1131 bool work = TRUE; // default address is work address
658 QString street; 1132 QString street;
659 QString city; 1133 QString city;
660 QString region; 1134 QString region;
661 QString postal; 1135 QString postal;
662 QString country; 1136 QString country;
663 1137
664 VObjectIterator nit; 1138 VObjectIterator nit;
665 initPropIterator( &nit, o ); 1139 initPropIterator( &nit, o );
666 while( moreIteration( &nit ) ) { 1140 while( moreIteration( &nit ) ) {
667 VObject *o = nextVObject( &nit ); 1141 VObject *o = nextVObject( &nit );
668 QCString name = vObjectName( o ); 1142 QCString name = vObjectName( o );
669 QString value = vObjectStringZValue( o ); 1143 QString value = vObjectStringZValue( o );
670 if ( name == VCHomeProp ) 1144 if ( name == VCHomeProp )
671 work = FALSE; 1145 work = FALSE;
672 else if ( name == VCWorkProp ) 1146 else if ( name == VCWorkProp )
673 work = TRUE; 1147 work = TRUE;
674 else if ( name == VCStreetAddressProp ) 1148 else if ( name == VCStreetAddressProp )
675 street = value; 1149 street = value;
676 else if ( name == VCCityProp ) 1150 else if ( name == VCCityProp )
677 city = value; 1151 city = value;
678 else if ( name == VCRegionProp ) 1152 else if ( name == VCRegionProp )
@@ -722,203 +1196,213 @@ static Contact parseVObject( VObject *obj )
722 else if ( name == VCCellularProp ) 1196 else if ( name == VCCellularProp )
723 type |= CELL; 1197 type |= CELL;
724 else if ( name == VCFaxProp ) 1198 else if ( name == VCFaxProp )
725 type |= FAX; 1199 type |= FAX;
726 else if ( name == VCPagerProp ) 1200 else if ( name == VCPagerProp )
727 type |= PAGER; 1201 type |= PAGER;
728 else if ( name == VCPreferredProp ) 1202 else if ( name == VCPreferredProp )
729 ; 1203 ;
730 else 1204 else
731 type |= UNKNOWN; 1205 type |= UNKNOWN;
732 } 1206 }
733 if ( (type & UNKNOWN) != UNKNOWN ) { 1207 if ( (type & UNKNOWN) != UNKNOWN ) {
734 if ( ( type & (HOME|WORK) ) == 0 ) // default 1208 if ( ( type & (HOME|WORK) ) == 0 ) // default
735 type |= HOME; 1209 type |= HOME;
736 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 1210 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
737 type |= VOICE; 1211 type |= VOICE;
738 1212
739 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) 1213 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) )
740 c.setHomePhone( value ); 1214 c.setHomePhone( value );
741 if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) 1215 if ( ( type & (FAX|HOME) ) == (FAX|HOME) )
742 c.setHomeFax( value ); 1216 c.setHomeFax( value );
743 if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) 1217 if ( ( type & (CELL|HOME) ) == (CELL|HOME) )
744 c.setHomeMobile( value ); 1218 c.setHomeMobile( value );
745 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) 1219 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) )
746 c.setBusinessPhone( value ); 1220 c.setBusinessPhone( value );
747 if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) 1221 if ( ( type & (FAX|WORK) ) == (FAX|WORK) )
748 c.setBusinessFax( value ); 1222 c.setBusinessFax( value );
749 if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) 1223 if ( ( type & (CELL|WORK) ) == (CELL|WORK) )
750 c.setBusinessMobile( value ); 1224 c.setBusinessMobile( value );
751 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) 1225 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) )
752 c.setBusinessPager( value ); 1226 c.setBusinessPager( value );
753 } 1227 }
754 } 1228 }
755 else if ( name == VCEmailAddressProp ) { 1229 else if ( name == VCEmailAddressProp ) {
756 QString email = vObjectStringZValue( o ); 1230 QString email = vObjectStringZValue( o );
757 bool valid = TRUE; 1231 bool valid = TRUE;
758 VObjectIterator nit; 1232 VObjectIterator nit;
759 initPropIterator( &nit, o ); 1233 initPropIterator( &nit, o );
760 while( moreIteration( &nit ) ) { 1234 while( moreIteration( &nit ) ) {
761 VObject *o = nextVObject( &nit ); 1235 VObject *o = nextVObject( &nit );
762 QCString name = vObjectTypeInfo( o ); 1236 QCString name = vObjectTypeInfo( o );
763 if ( name != VCInternetProp && name != VCHomeProp && 1237 if ( name != VCInternetProp && name != VCHomeProp &&
764 name != VCWorkProp && 1238 name != VCWorkProp &&
765 name != VCPreferredProp ) 1239 name != VCPreferredProp )
766 // ### preffered should map to default email 1240 // ### preffered should map to default email
767 valid = FALSE; 1241 valid = FALSE;
768 } 1242 }
769 if ( valid ) { 1243 if ( valid ) {
770 if ( haveDefaultEmail ) { 1244 c.insertEmail( email );
771 QString str = c.emails();
772 if ( !str.isEmpty() )
773 str += ","+email;
774 c.setEmails( str );
775 } else {
776 c.setDefaultEmail( email );
777 }
778 } 1245 }
779 } 1246 }
780 else if ( name == VCURLProp ) { 1247 else if ( name == VCURLProp ) {
781 VObjectIterator nit; 1248 VObjectIterator nit;
782 initPropIterator( &nit, o ); 1249 initPropIterator( &nit, o );
783 while( moreIteration( &nit ) ) { 1250 while( moreIteration( &nit ) ) {
784 VObject *o = nextVObject( &nit ); 1251 VObject *o = nextVObject( &nit );
785 QCString name = vObjectTypeInfo( o ); 1252 QCString name = vObjectTypeInfo( o );
786 if ( name == VCHomeProp ) 1253 if ( name == VCHomeProp )
787 c.setHomeWebpage( value ); 1254 c.setHomeWebpage( value );
788 else if ( name == VCWorkProp ) 1255 else if ( name == VCWorkProp )
789 c.setBusinessWebpage( value ); 1256 c.setBusinessWebpage( value );
790 } 1257 }
791 } 1258 }
792 else if ( name == VCOrgProp ) { 1259 else if ( name == VCOrgProp ) {
793 VObjectIterator nit; 1260 VObjectIterator nit;
794 initPropIterator( &nit, o ); 1261 initPropIterator( &nit, o );
795 while( moreIteration( &nit ) ) { 1262 while( moreIteration( &nit ) ) {
796 VObject *o = nextVObject( &nit ); 1263 VObject *o = nextVObject( &nit );
797 QCString name = vObjectName( o ); 1264 QCString name = vObjectName( o );
798 QString value = vObjectStringZValue( o ); 1265 QString value = vObjectStringZValue( o );
799 if ( name == VCOrgNameProp ) 1266 if ( name == VCOrgNameProp )
800 c.setCompany( value ); 1267 c.setCompany( value );
801 else if ( name == VCOrgUnitProp ) 1268 else if ( name == VCOrgUnitProp )
802 c.setDepartment( value ); 1269 c.setDepartment( value );
803 else if ( name == VCOrgUnit2Prop ) 1270 else if ( name == VCOrgUnit2Prop )
804 c.setOffice( value ); 1271 c.setOffice( value );
805 } 1272 }
806 } 1273 }
807 else if ( name == VCTitleProp ) { 1274 else if ( name == VCTitleProp ) {
808 c.setJobTitle( value ); 1275 c.setJobTitle( value );
809 } 1276 }
810 else if ( name == "X-Qtopia-Profession" ) { 1277 else if ( name == "X-Qtopia-Profession" ) {
811 c.setProfession( value ); 1278 c.setProfession( value );
812 } 1279 }
813 else if ( name == "X-Qtopia-Manager" ) { 1280 else if ( name == "X-Qtopia-Manager" ) {
814 c.setManager( value ); 1281 c.setManager( value );
815 } 1282 }
816 else if ( name == "X-Qtopia-Assistant" ) { 1283 else if ( name == "X-Qtopia-Assistant" ) {
817 c.setAssistant( value ); 1284 c.setAssistant( value );
818 } 1285 }
819 else if ( name == "X-Qtopia-Spouse" ) { 1286 else if ( name == "X-Qtopia-Spouse" ) {
820 c.setSpouse( value ); 1287 c.setSpouse( value );
821 } 1288 }
822 else if ( name == "X-Qtopia-Gender" ) { 1289 else if ( name == "X-Qtopia-Gender" ) {
823 c.setGender( value ); 1290 c.setGender( value );
824 } 1291 }
825 else if ( name == "X-Qtopia-Anniversary" ) { 1292 else if ( name == "X-Qtopia-Anniversary" ) {
826 c.setAnniversary( value ); 1293 c.setAnniversary( value );
827 } 1294 }
828 else if ( name == "X-Qtopia-Nickname" ) { 1295 else if ( name == "X-Qtopia-Nickname" ) {
829 c.setNickname( value ); 1296 c.setNickname( value );
830 } 1297 }
831 else if ( name == "X-Qtopia-Children" ) { 1298 else if ( name == "X-Qtopia-Children" ) {
832 c.setChildren( value ); 1299 c.setChildren( value );
833 } 1300 }
834 1301
835 1302
836#if 0 1303#if 0
837 else { 1304 else {
838 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 1305 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
839 VObjectIterator nit; 1306 VObjectIterator nit;
840 initPropIterator( &nit, o ); 1307 initPropIterator( &nit, o );
841 while( moreIteration( &nit ) ) { 1308 while( moreIteration( &nit ) ) {
842 VObject *o = nextVObject( &nit ); 1309 VObject *o = nextVObject( &nit );
843 QCString name = vObjectName( o ); 1310 QCString name = vObjectName( o );
844 QString value = vObjectStringZValue( o ); 1311 QString value = vObjectStringZValue( o );
845 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 1312 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
846 } 1313 }
847 } 1314 }
848#endif 1315#endif
849 } 1316 }
850 c.setFileAs(); 1317 c.setFileAs();
851 return c; 1318 return c;
852} 1319}
853 1320
1321/*!
1322 Writes the list of \a contacts as a set of VCards to the file \a filename.
1323*/
854void Contact::writeVCard( const QString &filename, const QValueList<Contact> &contacts) 1324void Contact::writeVCard( const QString &filename, const QValueList<Contact> &contacts)
855{ 1325{
856 QFileDirect f( filename.utf8().data() ); 1326 QFileDirect f( filename.utf8().data() );
857 if ( !f.open( IO_WriteOnly ) ) { 1327 if ( !f.open( IO_WriteOnly ) ) {
858 qWarning("Unable to open vcard write"); 1328 qWarning("Unable to open vcard write");
859 return; 1329 return;
860 } 1330 }
861 1331
862 QValueList<Contact>::ConstIterator it; 1332 QValueList<Contact>::ConstIterator it;
863 for( it = contacts.begin(); it != contacts.end(); ++it ) { 1333 for( it = contacts.begin(); it != contacts.end(); ++it ) {
864 VObject *obj = createVObject( *it ); 1334 VObject *obj = createVObject( *it );
865 writeVObject(f.directHandle() , obj ); 1335 writeVObject(f.directHandle() , obj );
866 cleanVObject( obj ); 1336 cleanVObject( obj );
867 } 1337 }
868 cleanStrTbl(); 1338 cleanStrTbl();
869} 1339}
870 1340
1341/*!
1342 writes \a contact as a VCard to the file \a filename.
1343*/
871void Contact::writeVCard( const QString &filename, const Contact &contact) 1344void Contact::writeVCard( const QString &filename, const Contact &contact)
872{ 1345{
873 QFileDirect f( filename.utf8().data() ); 1346 QFileDirect f( filename.utf8().data() );
874 if ( !f.open( IO_WriteOnly ) ) { 1347 if ( !f.open( IO_WriteOnly ) ) {
875 qWarning("Unable to open vcard write"); 1348 qWarning("Unable to open vcard write");
876 return; 1349 return;
877 } 1350 }
878 1351
879 VObject *obj = createVObject( contact ); 1352 VObject *obj = createVObject( contact );
880 writeVObject( f.directHandle() , obj ); 1353 writeVObject( f.directHandle() , obj );
881 cleanVObject( obj ); 1354 cleanVObject( obj );
882 1355
883 cleanStrTbl(); 1356 cleanStrTbl();
884} 1357}
885 1358
886 1359/*!
1360 Returns the set of contacts read as VCards from the file \a filename.
1361*/
887QValueList<Contact> Contact::readVCard( const QString &filename ) 1362QValueList<Contact> Contact::readVCard( const QString &filename )
888{ 1363{
889 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() ); 1364 qDebug("trying to open %s, exists=%d", filename.utf8().data(), QFileInfo( filename.utf8().data() ).size() );
890 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); 1365 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() );
891 1366
892 qDebug("vobject = %p", obj ); 1367 qDebug("vobject = %p", obj );
893 1368
894 QValueList<Contact> contacts; 1369 QValueList<Contact> contacts;
895 1370
896 while ( obj ) { 1371 while ( obj ) {
897 contacts.append( parseVObject( obj ) ); 1372 contacts.append( parseVObject( obj ) );
898 1373
899 VObject *t = obj; 1374 VObject *t = obj;
900 obj = nextVObjectInList(obj); 1375 obj = nextVObjectInList(obj);
901 cleanVObject( t ); 1376 cleanVObject( t );
902 } 1377 }
903 1378
904 return contacts; 1379 return contacts;
905} 1380}
906 1381
1382/*!
1383 Returns TRUE if the contact matches the regular expression \a regexp.
1384 Otherwise returns FALSE.
1385*/
907bool Contact::match( const QString &regexp ) const 1386bool Contact::match( const QString &regexp ) const
908{ 1387{
909 return match(QRegExp(regexp)); 1388 return match(QRegExp(regexp));
910} 1389}
911 1390
1391/*!
1392 \overload
1393 Returns TRUE if the contact matches the regular expression \a regexp.
1394 Otherwise returns FALSE.
1395*/
912bool Contact::match( const QRegExp &r ) const 1396bool Contact::match( const QRegExp &r ) const
913{ 1397{
914 bool match; 1398 bool match;
915 match = false; 1399 match = false;
916 QMap<int, QString>::ConstIterator it; 1400 QMap<int, QString>::ConstIterator it;
917 for ( it = mMap.begin(); it != mMap.end(); ++it ) { 1401 for ( it = mMap.begin(); it != mMap.end(); ++it ) {
918 if ( (*it).find( r ) > -1 ) { 1402 if ( (*it).find( r ) > -1 ) {
919 match = true; 1403 match = true;
920 break; 1404 break;
921 } 1405 }
922 } 1406 }
923 return match; 1407 return match;
924} 1408}