-rw-r--r-- | libopie/pim/ocontactaccessbackend_vcard.cpp | 37 | ||||
-rw-r--r-- | libopie/pim/ocontactaccessbackend_vcard.h | 4 |
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 | ||
41 | OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): | 44 | OContactAccessBackend_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 | ||
49 | bool OContactAccessBackend_VCard::load () | 52 | bool 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 | } |
81 | bool OContactAccessBackend_VCard::reload() | 84 | bool OContactAccessBackend_VCard::reload() |
82 | { | 85 | { |
83 | return load(); | 86 | return load(); |
84 | } | 87 | } |
85 | bool OContactAccessBackend_VCard::save() | 88 | bool 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 | } |
111 | void OContactAccessBackend_VCard::clear () | 114 | void 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 | ||
117 | bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) | 120 | bool 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 | ||
124 | bool OContactAccessBackend_VCard::remove ( int uid ) | 127 | bool 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 | ||
131 | bool OContactAccessBackend_VCard::replace ( const OContact &contact ) | 134 | bool 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 | ||
138 | OContact OContactAccessBackend_VCard::find ( int uid ) const | 141 | OContact OContactAccessBackend_VCard::find ( int uid ) const |
139 | { | 142 | { |
140 | return m_map[uid]; | 143 | return m_map[uid]; |
141 | } | 144 | } |
142 | 145 | ||
143 | QArray<int> OContactAccessBackend_VCard::allRecords() const | 146 | QArray<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 | ||
419 | VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) | 422 | VObject* 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 | ||
528 | QString 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 | |||
531 | QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) | 542 | QDate 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 | ||
556 | VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) | 567 | VObject* 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 | ||
564 | VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) | 575 | VObject* 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 | ||
37 | class VObject; | 40 | class VObject; |
38 | 41 | ||
39 | class OContactAccessBackend_VCard : public OContactAccessBackend { | 42 | class 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 | ||
62 | private: | 65 | private: |
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 |