summaryrefslogtreecommitdiff
path: root/libopie
Unidiff
Diffstat (limited to 'libopie') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontactaccessbackend_vcard.cpp37
-rw-r--r--libopie/pim/ocontactaccessbackend_vcard.h4
2 files changed, 28 insertions, 13 deletions
diff --git a/libopie/pim/ocontactaccessbackend_vcard.cpp b/libopie/pim/ocontactaccessbackend_vcard.cpp
index 09ae37b..ca9e410 100644
--- a/libopie/pim/ocontactaccessbackend_vcard.cpp
+++ b/libopie/pim/ocontactaccessbackend_vcard.cpp
@@ -1,147 +1,150 @@
1/* 1/*
2 * VCard Backend for the OPIE-Contact Database. 2 * VCard Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (C) 2000 Trolltech AS. All rights reserved. 4 * Copyright (C) 2000 Trolltech AS. All rights reserved.
5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version. 11 * version 2 of the License, or (at your option) any later version.
12 * ===================================================================== 12 * =====================================================================
13 * ToDo: 13 * ToDo:
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.5 2002/12/07 13:26:22 eilers
21 * Fixing bug in storing anniversary..
22 *
20 * Revision 1.4 2002/11/13 14:14:51 eilers 23 * Revision 1.4 2002/11/13 14:14:51 eilers
21 * Added sorted for Contacts.. 24 * Added sorted for Contacts..
22 * 25 *
23 * Revision 1.3 2002/11/11 16:41:09 kergoth 26 * Revision 1.3 2002/11/11 16:41:09 kergoth
24 * no default arguments in implementation 27 * no default arguments in implementation
25 * 28 *
26 * Revision 1.2 2002/11/10 15:41:53 eilers 29 * Revision 1.2 2002/11/10 15:41:53 eilers
27 * Bugfixes.. 30 * Bugfixes..
28 * 31 *
29 * Revision 1.1 2002/11/09 14:34:52 eilers 32 * Revision 1.1 2002/11/09 14:34:52 eilers
30 * Added VCard Backend. 33 * Added VCard Backend.
31 * 34 *
32 */ 35 */
33#include "ocontactaccessbackend_vcard.h" 36#include "ocontactaccessbackend_vcard.h"
34#include "../../library/backend/vobject_p.h" 37#include "../../library/backend/vobject_p.h"
35#include "../../library/backend/qfiledirect_p.h" 38#include "../../library/backend/qfiledirect_p.h"
36 39
37#include <qpe/timeconversion.h> 40#include <qpe/timeconversion.h>
38 41
39#include <qfile.h> 42#include <qfile.h>
40 43
41OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): 44OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ):
42 m_dirty( false ), 45 m_dirty( false ),
43 m_file( filename ) 46 m_file( filename )
44{ 47{
45 load(); 48 load();
46} 49}
47 50
48 51
49bool OContactAccessBackend_VCard::load () 52bool OContactAccessBackend_VCard::load ()
50{ 53{
51 m_map.clear(); 54 m_map.clear();
52 m_dirty = false; 55 m_dirty = false;
53 56
54 VObject* obj = 0l; 57 VObject* obj = 0l;
55 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); 58 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() );
56 if ( !obj ) 59 if ( !obj )
57 return false; 60 return false;
58 61
59 while ( obj ) { 62 while ( obj ) {
60 OContact con = parseVObject( obj ); 63 OContact con = parseVObject( obj );
61 /* 64 /*
62 * if uid is 0 assign a new one 65 * if uid is 0 assign a new one
63 * this at least happens on 66 * this at least happens on
64 * Nokia6210 67 * Nokia6210
65 */ 68 */
66 if ( con.uid() == 0 ){ 69 if ( con.uid() == 0 ){
67 con.setUid( 1 ); 70 con.setUid( 1 );
68 qWarning("assigned new uid %d",con.uid() ); 71 qWarning("assigned new uid %d",con.uid() );
69 } 72 }
70 73
71 m_map.insert( con.uid(), con ); 74 m_map.insert( con.uid(), con );
72 75
73 VObject *t = obj; 76 VObject *t = obj;
74 obj = nextVObjectInList(obj); 77 obj = nextVObjectInList(obj);
75 cleanVObject( t ); 78 cleanVObject( t );
76 } 79 }
77 80
78 return true; 81 return true;
79 82
80} 83}
81bool OContactAccessBackend_VCard::reload() 84bool OContactAccessBackend_VCard::reload()
82{ 85{
83 return load(); 86 return load();
84} 87}
85bool OContactAccessBackend_VCard::save() 88bool OContactAccessBackend_VCard::save()
86{ 89{
87 if (!m_dirty ) 90 if (!m_dirty )
88 return true; 91 return true;
89 92
90 QFileDirect file( m_file ); 93 QFileDirect file( m_file );
91 if (!file.open(IO_WriteOnly ) ) 94 if (!file.open(IO_WriteOnly ) )
92 return false; 95 return false;
93 96
94 VObject *obj; 97 VObject *obj;
95 obj = newVObject( VCCalProp ); 98 obj = newVObject( VCCalProp );
96 addPropValue( obj, VCVersionProp, "1.0" ); 99 addPropValue( obj, VCVersionProp, "1.0" );
97 100
98 VObject *vo; 101 VObject *vo;
99 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ 102 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
100 vo = createVObject( *it ); 103 vo = createVObject( *it );
101 writeVObject( file.directHandle() , vo ); 104 writeVObject( file.directHandle() , vo );
102 cleanVObject( vo ); 105 cleanVObject( vo );
103 } 106 }
104 cleanStrTbl(); 107 cleanStrTbl();
105 108
106 m_dirty = false; 109 m_dirty = false;
107 return true; 110 return true;
108 111
109 112
110} 113}
111void OContactAccessBackend_VCard::clear () 114void OContactAccessBackend_VCard::clear ()
112{ 115{
113 m_map.clear(); 116 m_map.clear();
114 m_dirty = true; // ??? sure ? (se) 117 m_dirty = true; // ??? sure ? (se)
115} 118}
116 119
117bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) 120bool OContactAccessBackend_VCard::add ( const OContact& newcontact )
118{ 121{
119 m_map.insert( newcontact.uid(), newcontact ); 122 m_map.insert( newcontact.uid(), newcontact );
120 m_dirty = true; 123 m_dirty = true;
121 return true; 124 return true;
122} 125}
123 126
124bool OContactAccessBackend_VCard::remove ( int uid ) 127bool OContactAccessBackend_VCard::remove ( int uid )
125{ 128{
126 m_map.remove( uid ); 129 m_map.remove( uid );
127 m_dirty = true; 130 m_dirty = true;
128 return true; 131 return true;
129} 132}
130 133
131bool OContactAccessBackend_VCard::replace ( const OContact &contact ) 134bool OContactAccessBackend_VCard::replace ( const OContact &contact )
132{ 135{
133 m_map.replace( contact.uid(), contact ); 136 m_map.replace( contact.uid(), contact );
134 m_dirty = true; 137 m_dirty = true;
135 return true; 138 return true;
136} 139}
137 140
138OContact OContactAccessBackend_VCard::find ( int uid ) const 141OContact OContactAccessBackend_VCard::find ( int uid ) const
139{ 142{
140 return m_map[uid]; 143 return m_map[uid];
141} 144}
142 145
143QArray<int> OContactAccessBackend_VCard::allRecords() const 146QArray<int> OContactAccessBackend_VCard::allRecords() const
144{ 147{
145 QArray<int> ar( m_map.count() ); 148 QArray<int> ar( m_map.count() );
146 QMap<int, OContact>::ConstIterator it; 149 QMap<int, OContact>::ConstIterator it;
147 int i = 0; 150 int i = 0;
@@ -258,313 +261,321 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
258 } else { 261 } else {
259 c.setHomeStreet( street ); 262 c.setHomeStreet( street );
260 c.setHomeCity( city ); 263 c.setHomeCity( city );
261 c.setHomeCountry( country ); 264 c.setHomeCountry( country );
262 c.setHomeZip( postal ); 265 c.setHomeZip( postal );
263 c.setHomeState( region ); 266 c.setHomeState( region );
264 } 267 }
265 } 268 }
266 else if ( name == VCTelephoneProp ) { 269 else if ( name == VCTelephoneProp ) {
267 enum { 270 enum {
268 HOME = 0x01, 271 HOME = 0x01,
269 WORK = 0x02, 272 WORK = 0x02,
270 VOICE = 0x04, 273 VOICE = 0x04,
271 CELL = 0x08, 274 CELL = 0x08,
272 FAX = 0x10, 275 FAX = 0x10,
273 PAGER = 0x20, 276 PAGER = 0x20,
274 UNKNOWN = 0x80 277 UNKNOWN = 0x80
275 }; 278 };
276 int type = 0; 279 int type = 0;
277 280
278 VObjectIterator nit; 281 VObjectIterator nit;
279 initPropIterator( &nit, o ); 282 initPropIterator( &nit, o );
280 while( moreIteration( &nit ) ) { 283 while( moreIteration( &nit ) ) {
281 VObject *o = nextVObject( &nit ); 284 VObject *o = nextVObject( &nit );
282 QCString name = vObjectTypeInfo( o ); 285 QCString name = vObjectTypeInfo( o );
283 if ( name == VCHomeProp ) 286 if ( name == VCHomeProp )
284 type |= HOME; 287 type |= HOME;
285 else if ( name == VCWorkProp ) 288 else if ( name == VCWorkProp )
286 type |= WORK; 289 type |= WORK;
287 else if ( name == VCVoiceProp ) 290 else if ( name == VCVoiceProp )
288 type |= VOICE; 291 type |= VOICE;
289 else if ( name == VCCellularProp ) 292 else if ( name == VCCellularProp )
290 type |= CELL; 293 type |= CELL;
291 else if ( name == VCFaxProp ) 294 else if ( name == VCFaxProp )
292 type |= FAX; 295 type |= FAX;
293 else if ( name == VCPagerProp ) 296 else if ( name == VCPagerProp )
294 type |= PAGER; 297 type |= PAGER;
295 else if ( name == VCPreferredProp ) 298 else if ( name == VCPreferredProp )
296 ; 299 ;
297 else 300 else
298 type |= UNKNOWN; 301 type |= UNKNOWN;
299 } 302 }
300 if ( (type & UNKNOWN) != UNKNOWN ) { 303 if ( (type & UNKNOWN) != UNKNOWN ) {
301 if ( ( type & (HOME|WORK) ) == 0 ) // default 304 if ( ( type & (HOME|WORK) ) == 0 ) // default
302 type |= HOME; 305 type |= HOME;
303 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 306 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
304 type |= VOICE; 307 type |= VOICE;
305 308
306 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) 309 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) )
307 c.setHomePhone( value ); 310 c.setHomePhone( value );
308 if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) 311 if ( ( type & (FAX|HOME) ) == (FAX|HOME) )
309 c.setHomeFax( value ); 312 c.setHomeFax( value );
310 if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) 313 if ( ( type & (CELL|HOME) ) == (CELL|HOME) )
311 c.setHomeMobile( value ); 314 c.setHomeMobile( value );
312 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) 315 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) )
313 c.setBusinessPhone( value ); 316 c.setBusinessPhone( value );
314 if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) 317 if ( ( type & (FAX|WORK) ) == (FAX|WORK) )
315 c.setBusinessFax( value ); 318 c.setBusinessFax( value );
316 if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) 319 if ( ( type & (CELL|WORK) ) == (CELL|WORK) )
317 c.setBusinessMobile( value ); 320 c.setBusinessMobile( value );
318 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) 321 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) )
319 c.setBusinessPager( value ); 322 c.setBusinessPager( value );
320 } 323 }
321 } 324 }
322 else if ( name == VCEmailAddressProp ) { 325 else if ( name == VCEmailAddressProp ) {
323 QString email = vObjectStringZValue( o ); 326 QString email = vObjectStringZValue( o );
324 bool valid = TRUE; 327 bool valid = TRUE;
325 VObjectIterator nit; 328 VObjectIterator nit;
326 initPropIterator( &nit, o ); 329 initPropIterator( &nit, o );
327 while( moreIteration( &nit ) ) { 330 while( moreIteration( &nit ) ) {
328 VObject *o = nextVObject( &nit ); 331 VObject *o = nextVObject( &nit );
329 QCString name = vObjectTypeInfo( o ); 332 QCString name = vObjectTypeInfo( o );
330 if ( name != VCInternetProp && name != VCHomeProp && 333 if ( name != VCInternetProp && name != VCHomeProp &&
331 name != VCWorkProp && 334 name != VCWorkProp &&
332 name != VCPreferredProp ) 335 name != VCPreferredProp )
333 // ### preffered should map to default email 336 // ### preffered should map to default email
334 valid = FALSE; 337 valid = FALSE;
335 } 338 }
336 if ( valid ) { 339 if ( valid ) {
337 c.insertEmail( email ); 340 c.insertEmail( email );
338 } 341 }
339 } 342 }
340 else if ( name == VCURLProp ) { 343 else if ( name == VCURLProp ) {
341 VObjectIterator nit; 344 VObjectIterator nit;
342 initPropIterator( &nit, o ); 345 initPropIterator( &nit, o );
343 while( moreIteration( &nit ) ) { 346 while( moreIteration( &nit ) ) {
344 VObject *o = nextVObject( &nit ); 347 VObject *o = nextVObject( &nit );
345 QCString name = vObjectTypeInfo( o ); 348 QCString name = vObjectTypeInfo( o );
346 if ( name == VCHomeProp ) 349 if ( name == VCHomeProp )
347 c.setHomeWebpage( value ); 350 c.setHomeWebpage( value );
348 else if ( name == VCWorkProp ) 351 else if ( name == VCWorkProp )
349 c.setBusinessWebpage( value ); 352 c.setBusinessWebpage( value );
350 } 353 }
351 } 354 }
352 else if ( name == VCOrgProp ) { 355 else if ( name == VCOrgProp ) {
353 VObjectIterator nit; 356 VObjectIterator nit;
354 initPropIterator( &nit, o ); 357 initPropIterator( &nit, o );
355 while( moreIteration( &nit ) ) { 358 while( moreIteration( &nit ) ) {
356 VObject *o = nextVObject( &nit ); 359 VObject *o = nextVObject( &nit );
357 QCString name = vObjectName( o ); 360 QCString name = vObjectName( o );
358 QString value = vObjectStringZValue( o ); 361 QString value = vObjectStringZValue( o );
359 if ( name == VCOrgNameProp ) 362 if ( name == VCOrgNameProp )
360 c.setCompany( value ); 363 c.setCompany( value );
361 else if ( name == VCOrgUnitProp ) 364 else if ( name == VCOrgUnitProp )
362 c.setDepartment( value ); 365 c.setDepartment( value );
363 else if ( name == VCOrgUnit2Prop ) 366 else if ( name == VCOrgUnit2Prop )
364 c.setOffice( value ); 367 c.setOffice( value );
365 } 368 }
366 } 369 }
367 else if ( name == VCTitleProp ) { 370 else if ( name == VCTitleProp ) {
368 c.setJobTitle( value ); 371 c.setJobTitle( value );
369 } 372 }
370 else if ( name == "X-Qtopia-Profession" ) { 373 else if ( name == "X-Qtopia-Profession" ) {
371 c.setProfession( value ); 374 c.setProfession( value );
372 } 375 }
373 else if ( name == "X-Qtopia-Manager" ) { 376 else if ( name == "X-Qtopia-Manager" ) {
374 c.setManager( value ); 377 c.setManager( value );
375 } 378 }
376 else if ( name == "X-Qtopia-Assistant" ) { 379 else if ( name == "X-Qtopia-Assistant" ) {
377 c.setAssistant( value ); 380 c.setAssistant( value );
378 } 381 }
379 else if ( name == "X-Qtopia-Spouse" ) { 382 else if ( name == "X-Qtopia-Spouse" ) {
380 c.setSpouse( value ); 383 c.setSpouse( value );
381 } 384 }
382 else if ( name == "X-Qtopia-Gender" ) { 385 else if ( name == "X-Qtopia-Gender" ) {
383 c.setGender( value ); 386 c.setGender( value );
384 } 387 }
385 else if ( name == "X-Qtopia-Anniversary" ) { 388 else if ( name == "X-Qtopia-Anniversary" ) {
386 c.setAnniversary( TimeConversion::fromString( value ) ); 389 c.setAnniversary( convVCardDateToDate( value ) );
387 } 390 }
388 else if ( name == "X-Qtopia-Nickname" ) { 391 else if ( name == "X-Qtopia-Nickname" ) {
389 c.setNickname( value ); 392 c.setNickname( value );
390 } 393 }
391 else if ( name == "X-Qtopia-Children" ) { 394 else if ( name == "X-Qtopia-Children" ) {
392 c.setChildren( value ); 395 c.setChildren( value );
393 } 396 }
394 else if ( name == VCBirthDateProp ) { 397 else if ( name == VCBirthDateProp ) {
395 // Reading Birthdate regarding RFC 2425 (5.8.4) 398 // Reading Birthdate regarding RFC 2425 (5.8.4)
396 c.setBirthday( convVCardDateToDate( value ) ); 399 c.setBirthday( convVCardDateToDate( value ) );
397 400
398 } 401 }
399 402
400#if 0 403#if 0
401 else { 404 else {
402 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 405 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
403 VObjectIterator nit; 406 VObjectIterator nit;
404 initPropIterator( &nit, o ); 407 initPropIterator( &nit, o );
405 while( moreIteration( &nit ) ) { 408 while( moreIteration( &nit ) ) {
406 VObject *o = nextVObject( &nit ); 409 VObject *o = nextVObject( &nit );
407 QCString name = vObjectName( o ); 410 QCString name = vObjectName( o );
408 QString value = vObjectStringZValue( o ); 411 QString value = vObjectStringZValue( o );
409 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 412 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
410 } 413 }
411 } 414 }
412#endif 415#endif
413 } 416 }
414 c.setFileAs(); 417 c.setFileAs();
415 return c; 418 return c;
416} 419}
417 420
418 421
419VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) 422VObject* OContactAccessBackend_VCard::createVObject( const OContact &c )
420{ 423{
421 VObject *vcard = newVObject( VCCardProp ); 424 VObject *vcard = newVObject( VCCardProp );
422 safeAddPropValue( vcard, VCVersionProp, "2.1" ); 425 safeAddPropValue( vcard, VCVersionProp, "2.1" );
423 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); 426 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) );
424 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); 427 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) );
425 428
426 // full name 429 // full name
427 safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); 430 safeAddPropValue( vcard, VCFullNameProp, c.fullName() );
428 431
429 // name properties 432 // name properties
430 VObject *name = safeAddProp( vcard, VCNameProp ); 433 VObject *name = safeAddProp( vcard, VCNameProp );
431 safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); 434 safeAddPropValue( name, VCFamilyNameProp, c.lastName() );
432 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 435 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
433 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 436 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
434 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 437 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
435 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 438 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
436 439
437 // home properties 440 // home properties
438 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 441 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
439 safeAddProp( home_adr, VCHomeProp ); 442 safeAddProp( home_adr, VCHomeProp );
440 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 443 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
441 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 444 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
442 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 445 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
443 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 446 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
444 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 447 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
445 448
446 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 449 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
447 safeAddProp( home_phone, VCHomeProp ); 450 safeAddProp( home_phone, VCHomeProp );
448 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 451 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
449 safeAddProp( home_phone, VCHomeProp ); 452 safeAddProp( home_phone, VCHomeProp );
450 safeAddProp( home_phone, VCCellularProp ); 453 safeAddProp( home_phone, VCCellularProp );
451 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 454 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
452 safeAddProp( home_phone, VCHomeProp ); 455 safeAddProp( home_phone, VCHomeProp );
453 safeAddProp( home_phone, VCFaxProp ); 456 safeAddProp( home_phone, VCFaxProp );
454 457
455 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 458 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
456 safeAddProp( url, VCHomeProp ); 459 safeAddProp( url, VCHomeProp );
457 460
458 // work properties 461 // work properties
459 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 462 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
460 safeAddProp( work_adr, VCWorkProp ); 463 safeAddProp( work_adr, VCWorkProp );
461 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 464 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
462 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 465 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
463 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 466 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
464 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 467 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
465 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 468 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
466 469
467 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 470 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
468 safeAddProp( work_phone, VCWorkProp ); 471 safeAddProp( work_phone, VCWorkProp );
469 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 472 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
470 safeAddProp( work_phone, VCWorkProp ); 473 safeAddProp( work_phone, VCWorkProp );
471 safeAddProp( work_phone, VCCellularProp ); 474 safeAddProp( work_phone, VCCellularProp );
472 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 475 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
473 safeAddProp( work_phone, VCWorkProp ); 476 safeAddProp( work_phone, VCWorkProp );
474 safeAddProp( work_phone, VCFaxProp ); 477 safeAddProp( work_phone, VCFaxProp );
475 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 478 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
476 safeAddProp( work_phone, VCWorkProp ); 479 safeAddProp( work_phone, VCWorkProp );
477 safeAddProp( work_phone, VCPagerProp ); 480 safeAddProp( work_phone, VCPagerProp );
478 481
479 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 482 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
480 safeAddProp( url, VCWorkProp ); 483 safeAddProp( url, VCWorkProp );
481 484
482 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 485 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
483 safeAddProp( title, VCWorkProp ); 486 safeAddProp( title, VCWorkProp );
484 487
485 488
486 QStringList emails = c.emailList(); 489 QStringList emails = c.emailList();
487 emails.prepend( c.defaultEmail() ); 490 emails.prepend( c.defaultEmail() );
488 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 491 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
489 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 492 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
490 safeAddProp( email, VCInternetProp ); 493 safeAddProp( email, VCInternetProp );
491 } 494 }
492 495
493 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 496 safeAddPropValue( vcard, VCNoteProp, c.notes() );
494 497
495 // Exporting Birthday regarding RFC 2425 (5.8.4) 498 // Exporting Birthday regarding RFC 2425 (5.8.4)
496 if ( c.birthday().isValid() ){ 499 if ( c.birthday().isValid() ){
497 QString birthd_rfc2425 = QString("%1-%2-%3") 500 qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() );
498 .arg( c.birthday().year() ) 501 safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) );
499 .arg( c.birthday().month(), 2 )
500 .arg( c.birthday().day(), 2 );
501 // Now replace spaces with "0"...
502 int pos = 0;
503 while ( ( pos = birthd_rfc2425.find (' ') ) > 0 )
504 birthd_rfc2425.replace( pos, 1, "0" );
505
506 qWarning("Exporting birthday as: %s", birthd_rfc2425.latin1());
507 safeAddPropValue( vcard, VCBirthDateProp, birthd_rfc2425.latin1() );
508 } 502 }
509 503
510 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 504 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
511 VObject *org = safeAddProp( vcard, VCOrgProp ); 505 VObject *org = safeAddProp( vcard, VCOrgProp );
512 safeAddPropValue( org, VCOrgNameProp, c.company() ); 506 safeAddPropValue( org, VCOrgNameProp, c.company() );
513 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 507 safeAddPropValue( org, VCOrgUnitProp, c.department() );
514 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 508 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
515 } 509 }
516 510
517 // some values we have to export as custom fields 511 // some values we have to export as custom fields
518 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 512 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
519 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 513 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
520 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 514 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
521 515
522 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 516 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
523 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 517 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
524 safeAddPropValue( vcard, "X-Qtopia-Anniversary", TimeConversion::toString( c.anniversary() ) ); 518 if ( c.anniversary().isValid() ){
519 qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() );
520 safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) );
521 }
525 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 522 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
526 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 523 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
527 524
528 return vcard; 525 return vcard;
529} 526}
530 527
528QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const
529{
530 QString str_rfc2425 = QString("%1-%2-%3")
531 .arg( d.year() )
532 .arg( d.month(), 2 )
533 .arg( d.day(), 2 );
534 // Now replace spaces with "0"...
535 int pos = 0;
536 while ( ( pos = str_rfc2425.find (' ') ) > 0 )
537 str_rfc2425.replace( pos, 1, "0" );
538
539 return str_rfc2425;
540}
541
531QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) 542QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr )
532{ 543{
533 int monthPos = datestr.find('-'); 544 int monthPos = datestr.find('-');
534 int dayPos = datestr.find('-', monthPos+1 ); 545 int dayPos = datestr.find('-', monthPos+1 );
535 int sep_ignore = 1; 546 int sep_ignore = 1;
536 if ( monthPos == -1 || dayPos == -1 ) { 547 if ( monthPos == -1 || dayPos == -1 ) {
537 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 548 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
538 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) 549 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD )
539 if ( datestr.length() == 8 ){ 550 if ( datestr.length() == 8 ){
540 monthPos = 4; 551 monthPos = 4;
541 dayPos = 6; 552 dayPos = 6;
542 sep_ignore = 0; 553 sep_ignore = 0;
543 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 554 qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
544 } else { 555 } else {
545 return QDate(); 556 return QDate();
546 } 557 }
547 } 558 }
548 int y = datestr.left( monthPos ).toInt(); 559 int y = datestr.left( monthPos ).toInt();
549 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); 560 int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt();
550 int d = datestr.mid( dayPos + sep_ignore ).toInt(); 561 int d = datestr.mid( dayPos + sep_ignore ).toInt();
551 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); 562 qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos);
552 QDate date ( y,m,d ); 563 QDate date ( y,m,d );
553 return date; 564 return date;
554} 565}
555 566
556VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) 567VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value )
557{ 568{
558 VObject *ret = 0; 569 VObject *ret = 0;
559 if ( o && !value.isEmpty() ) 570 if ( o && !value.isEmpty() )
560 ret = addPropValue( o, prop, value.latin1() ); 571 ret = addPropValue( o, prop, value.latin1() );
561 return ret; 572 return ret;
562} 573}
563 574
564VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) 575VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop)
565{ 576{
566 VObject *ret = 0; 577 VObject *ret = 0;
567 if ( o ) 578 if ( o )
568 ret = addProp( o, prop ); 579 ret = addProp( o, prop );
569 return ret; 580 return ret;
570} 581}
diff --git a/libopie/pim/ocontactaccessbackend_vcard.h b/libopie/pim/ocontactaccessbackend_vcard.h
index 4437756..236da00 100644
--- a/libopie/pim/ocontactaccessbackend_vcard.h
+++ b/libopie/pim/ocontactaccessbackend_vcard.h
@@ -1,74 +1,78 @@
1/* 1/*
2 * VCard Backend for the OPIE-Contact Database. 2 * VCard Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (C) 2000 Trolltech AS. All rights reserved. 4 * Copyright (C) 2000 Trolltech AS. All rights reserved.
5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version. 11 * version 2 of the License, or (at your option) any later version.
12 * ===================================================================== 12 * =====================================================================
13 * ToDo: 13 * ToDo:
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.4 2002/12/07 13:26:22 eilers
21 * Fixing bug in storing anniversary..
22 *
20 * Revision 1.3 2002/11/13 14:14:51 eilers 23 * Revision 1.3 2002/11/13 14:14:51 eilers
21 * Added sorted for Contacts.. 24 * Added sorted for Contacts..
22 * 25 *
23 * Revision 1.2 2002/11/10 15:41:53 eilers 26 * Revision 1.2 2002/11/10 15:41:53 eilers
24 * Bugfixes.. 27 * Bugfixes..
25 * 28 *
26 * Revision 1.1 2002/11/09 14:34:52 eilers 29 * Revision 1.1 2002/11/09 14:34:52 eilers
27 * Added VCard Backend. 30 * Added VCard Backend.
28 * 31 *
29 */ 32 */
30#ifndef __OCONTACTACCESSBACKEND_VCARD_H_ 33#ifndef __OCONTACTACCESSBACKEND_VCARD_H_
31#define __OCONTACTACCESSBACKEND_VCARD_H_ 34#define __OCONTACTACCESSBACKEND_VCARD_H_
32 35
33#include <opie/ocontact.h> 36#include <opie/ocontact.h>
34 37
35#include "ocontactaccessbackend.h" 38#include "ocontactaccessbackend.h"
36 39
37class VObject; 40class VObject;
38 41
39class OContactAccessBackend_VCard : public OContactAccessBackend { 42class OContactAccessBackend_VCard : public OContactAccessBackend {
40 public: 43 public:
41 OContactAccessBackend_VCard ( QString appname, QString filename = 0l ); 44 OContactAccessBackend_VCard ( QString appname, QString filename = 0l );
42 45
43 bool load (); 46 bool load ();
44 bool reload(); 47 bool reload();
45 bool save(); 48 bool save();
46 void clear (); 49 void clear ();
47 50
48 bool add ( const OContact& newcontact ); 51 bool add ( const OContact& newcontact );
49 bool remove ( int uid ); 52 bool remove ( int uid );
50 bool replace ( const OContact& contact ); 53 bool replace ( const OContact& contact );
51 54
52 OContact find ( int uid ) const; 55 OContact find ( int uid ) const;
53 QArray<int> allRecords() const; 56 QArray<int> allRecords() const;
54 QArray<int> queryByExample ( const OContact &query, int settings ); 57 QArray<int> queryByExample ( const OContact &query, int settings );
55 QArray<int> matchRegexp( const QRegExp &r ) const; 58 QArray<int> matchRegexp( const QRegExp &r ) const;
56 59
57 const uint querySettings(); 60 const uint querySettings();
58 bool hasQuerySettings (uint querySettings) const; 61 bool hasQuerySettings (uint querySettings) const;
59 QArray<int> sorted( bool ascending, int sortOrder, int sortFilter, int cat ); 62 QArray<int> sorted( bool ascending, int sortOrder, int sortFilter, int cat );
60 bool wasChangedExternally(); 63 bool wasChangedExternally();
61 64
62private: 65private:
63 OContact parseVObject( VObject* obj ); 66 OContact parseVObject( VObject* obj );
64 VObject* createVObject( const OContact& c ); 67 VObject* createVObject( const OContact& c );
68 QString convDateToVCardDate( const QDate& c ) const;
65 QDate convVCardDateToDate( const QString& datestr ); 69 QDate convVCardDateToDate( const QString& datestr );
66 VObject *safeAddPropValue( VObject *o, const char* prop, const QString& value ); 70 VObject *safeAddPropValue( VObject *o, const char* prop, const QString& value );
67 VObject *safeAddProp( VObject* o, const char* prop); 71 VObject *safeAddProp( VObject* o, const char* prop);
68 72
69 bool m_dirty : 1; 73 bool m_dirty : 1;
70 QString m_file; 74 QString m_file;
71 QMap<int, OContact> m_map; 75 QMap<int, OContact> m_map;
72}; 76};
73 77
74#endif 78#endif