summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/backend
authorzecke <zecke>2003-02-16 22:25:46 (UTC)
committer zecke <zecke>2003-02-16 22:25:46 (UTC)
commit4d0e8ffd8518fe24ed94cfcf92eeff666b014094 (patch) (unidiff)
tree86a0bec752418c409cbc9ad95d6479997dfaf909 /libopie2/opiepim/backend
parent8ecc375c803dc57b160bd0335891fcaf4f6de1df (diff)
downloadopie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.zip
opie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.tar.gz
opie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.tar.bz2
0000276 Fix for that bug.. or better temp workaround
A Preferred Number is HOME|VOICE A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test triggers both and the cell phone number overrides the other entries.. as a temp I check that it's not equal to HOME|VOICE|CELL before setting the number The right and final fix would be to reorder the if statement to make it if else based and the less common thing put to the bottom OTodoAccessVcal fix the date for beaming
Diffstat (limited to 'libopie2/opiepim/backend') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp82
-rw-r--r--libopie2/opiepim/backend/otodoaccessvcal.cpp7
2 files changed, 54 insertions, 35 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
index 1dc6b48..622d40a 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
@@ -8,24 +8,39 @@
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.7 2003/02/16 22:25:46 zecke
21 * 0000276 Fix for that bug.. or better temp workaround
22 * A Preferred Number is HOME|VOICE
23 * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test
24 * triggers both
25 * and the cell phone number overrides the other entries..
26 *
27 * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the
28 * number
29 *
30 * The right and final fix would be to reorder the if statement to make it
31 * if else based and the less common thing put to the bottom
32 *
33 * OTodoAccessVcal fix the date for beaming
34 *
20 * Revision 1.6 2003/01/13 15:49:31 eilers 35 * Revision 1.6 2003/01/13 15:49:31 eilers
21 * Fixing crash when businesscard.vcf is missing.. 36 * Fixing crash when businesscard.vcf is missing..
22 * 37 *
23 * Revision 1.5 2002/12/07 13:26:22 eilers 38 * Revision 1.5 2002/12/07 13:26:22 eilers
24 * Fixing bug in storing anniversary.. 39 * Fixing bug in storing anniversary..
25 * 40 *
26 * Revision 1.4 2002/11/13 14:14:51 eilers 41 * Revision 1.4 2002/11/13 14:14:51 eilers
27 * Added sorted for Contacts.. 42 * Added sorted for Contacts..
28 * 43 *
29 * Revision 1.3 2002/11/11 16:41:09 kergoth 44 * Revision 1.3 2002/11/11 16:41:09 kergoth
30 * no default arguments in implementation 45 * no default arguments in implementation
31 * 46 *
@@ -44,118 +59,118 @@
44 59
45#include <qfile.h> 60#include <qfile.h>
46 61
47OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): 62OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ):
48 m_dirty( false ), 63 m_dirty( false ),
49 m_file( filename ) 64 m_file( filename )
50{ 65{
51 load(); 66 load();
52} 67}
53 68
54 69
55bool OContactAccessBackend_VCard::load () 70bool OContactAccessBackend_VCard::load ()
56{ 71{
57 m_map.clear(); 72 m_map.clear();
58 m_dirty = false; 73 m_dirty = false;
59 74
60 VObject* obj = 0l; 75 VObject* obj = 0l;
61 76
62 if ( QFile( m_file ).exists() ){ 77 if ( QFile( m_file ).exists() ){
63 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); 78 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() );
64 if ( !obj ) 79 if ( !obj )
65 return false; 80 return false;
66 }else{ 81 }else{
67 qWarning("File \"%s\" not found !", m_file.latin1() ); 82 qWarning("File \"%s\" not found !", m_file.latin1() );
68 return false; 83 return false;
69 } 84 }
70 85
71 while ( obj ) { 86 while ( obj ) {
72 OContact con = parseVObject( obj ); 87 OContact con = parseVObject( obj );
73 /* 88 /*
74 * if uid is 0 assign a new one 89 * if uid is 0 assign a new one
75 * this at least happens on 90 * this at least happens on
76 * Nokia6210 91 * Nokia6210
77 */ 92 */
78 if ( con.uid() == 0 ){ 93 if ( con.uid() == 0 ){
79 con.setUid( 1 ); 94 con.setUid( 1 );
80 qWarning("assigned new uid %d",con.uid() ); 95 qWarning("assigned new uid %d",con.uid() );
81 } 96 }
82 97
83 m_map.insert( con.uid(), con ); 98 m_map.insert( con.uid(), con );
84 99
85 VObject *t = obj; 100 VObject *t = obj;
86 obj = nextVObjectInList(obj); 101 obj = nextVObjectInList(obj);
87 cleanVObject( t ); 102 cleanVObject( t );
88 } 103 }
89 104
90 return true; 105 return true;
91 106
92} 107}
93bool OContactAccessBackend_VCard::reload() 108bool OContactAccessBackend_VCard::reload()
94{ 109{
95 return load(); 110 return load();
96} 111}
97bool OContactAccessBackend_VCard::save() 112bool OContactAccessBackend_VCard::save()
98{ 113{
99 if (!m_dirty ) 114 if (!m_dirty )
100 return true; 115 return true;
101 116
102 QFileDirect file( m_file ); 117 QFileDirect file( m_file );
103 if (!file.open(IO_WriteOnly ) ) 118 if (!file.open(IO_WriteOnly ) )
104 return false; 119 return false;
105 120
106 VObject *obj; 121 VObject *obj;
107 obj = newVObject( VCCalProp ); 122 obj = newVObject( VCCalProp );
108 addPropValue( obj, VCVersionProp, "1.0" ); 123 addPropValue( obj, VCVersionProp, "1.0" );
109 124
110 VObject *vo; 125 VObject *vo;
111 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ 126 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
112 vo = createVObject( *it ); 127 vo = createVObject( *it );
113 writeVObject( file.directHandle() , vo ); 128 writeVObject( file.directHandle() , vo );
114 cleanVObject( vo ); 129 cleanVObject( vo );
115 } 130 }
116 cleanStrTbl(); 131 cleanStrTbl();
117 132
118 m_dirty = false; 133 m_dirty = false;
119 return true; 134 return true;
120 135
121 136
122} 137}
123void OContactAccessBackend_VCard::clear () 138void OContactAccessBackend_VCard::clear ()
124{ 139{
125 m_map.clear(); 140 m_map.clear();
126 m_dirty = true; // ??? sure ? (se) 141 m_dirty = true; // ??? sure ? (se)
127} 142}
128 143
129bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) 144bool OContactAccessBackend_VCard::add ( const OContact& newcontact )
130{ 145{
131 m_map.insert( newcontact.uid(), newcontact ); 146 m_map.insert( newcontact.uid(), newcontact );
132 m_dirty = true; 147 m_dirty = true;
133 return true; 148 return true;
134} 149}
135 150
136bool OContactAccessBackend_VCard::remove ( int uid ) 151bool OContactAccessBackend_VCard::remove ( int uid )
137{ 152{
138 m_map.remove( uid ); 153 m_map.remove( uid );
139 m_dirty = true; 154 m_dirty = true;
140 return true; 155 return true;
141} 156}
142 157
143bool OContactAccessBackend_VCard::replace ( const OContact &contact ) 158bool OContactAccessBackend_VCard::replace ( const OContact &contact )
144{ 159{
145 m_map.replace( contact.uid(), contact ); 160 m_map.replace( contact.uid(), contact );
146 m_dirty = true; 161 m_dirty = true;
147 return true; 162 return true;
148} 163}
149 164
150OContact OContactAccessBackend_VCard::find ( int uid ) const 165OContact OContactAccessBackend_VCard::find ( int uid ) const
151{ 166{
152 return m_map[uid]; 167 return m_map[uid];
153} 168}
154 169
155QArray<int> OContactAccessBackend_VCard::allRecords() const 170QArray<int> OContactAccessBackend_VCard::allRecords() const
156{ 171{
157 QArray<int> ar( m_map.count() ); 172 QArray<int> ar( m_map.count() );
158 QMap<int, OContact>::ConstIterator it; 173 QMap<int, OContact>::ConstIterator it;
159 int i = 0; 174 int i = 0;
160 for ( it = m_map.begin(); it != m_map.end(); ++it ) { 175 for ( it = m_map.begin(); it != m_map.end(); ++it ) {
161 ar[i] = it.key(); 176 ar[i] = it.key();
@@ -197,25 +212,25 @@ bool OContactAccessBackend_VCard::wasChangedExternally()
197QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) 212QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int )
198{ 213{
199 QArray<int> ar(0); 214 QArray<int> ar(0);
200 return ar; 215 return ar;
201} 216}
202 217
203// *** Private stuff *** 218// *** Private stuff ***
204 219
205 220
206OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) 221OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
207{ 222{
208 OContact c; 223 OContact c;
209 224
210 VObjectIterator it; 225 VObjectIterator it;
211 initPropIterator( &it, obj ); 226 initPropIterator( &it, obj );
212 while( moreIteration( &it ) ) { 227 while( moreIteration( &it ) ) {
213 VObject *o = nextVObject( &it ); 228 VObject *o = nextVObject( &it );
214 QCString name = vObjectName( o ); 229 QCString name = vObjectName( o );
215 QCString value = vObjectStringZValue( o ); 230 QCString value = vObjectStringZValue( o );
216 if ( name == VCNameProp ) { 231 if ( name == VCNameProp ) {
217 VObjectIterator nit; 232 VObjectIterator nit;
218 initPropIterator( &nit, o ); 233 initPropIterator( &nit, o );
219 while( moreIteration( &nit ) ) { 234 while( moreIteration( &nit ) ) {
220 VObject *o = nextVObject( &nit ); 235 VObject *o = nextVObject( &nit );
221 QCString name = vObjectTypeInfo( o ); 236 QCString name = vObjectTypeInfo( o );
@@ -230,25 +245,25 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
230 c.setFirstName( value ); 245 c.setFirstName( value );
231 else if ( name == VCAdditionalNamesProp ) 246 else if ( name == VCAdditionalNamesProp )
232 c.setMiddleName( value ); 247 c.setMiddleName( value );
233 } 248 }
234 } 249 }
235 else if ( name == VCAdrProp ) { 250 else if ( name == VCAdrProp ) {
236 bool work = TRUE; // default address is work address 251 bool work = TRUE; // default address is work address
237 QString street; 252 QString street;
238 QString city; 253 QString city;
239 QString region; 254 QString region;
240 QString postal; 255 QString postal;
241 QString country; 256 QString country;
242 257
243 VObjectIterator nit; 258 VObjectIterator nit;
244 initPropIterator( &nit, o ); 259 initPropIterator( &nit, o );
245 while( moreIteration( &nit ) ) { 260 while( moreIteration( &nit ) ) {
246 VObject *o = nextVObject( &nit ); 261 VObject *o = nextVObject( &nit );
247 QCString name = vObjectName( o ); 262 QCString name = vObjectName( o );
248 QString value = vObjectStringZValue( o ); 263 QString value = vObjectStringZValue( o );
249 if ( name == VCHomeProp ) 264 if ( name == VCHomeProp )
250 work = FALSE; 265 work = FALSE;
251 else if ( name == VCWorkProp ) 266 else if ( name == VCWorkProp )
252 work = TRUE; 267 work = TRUE;
253 else if ( name == VCStreetAddressProp ) 268 else if ( name == VCStreetAddressProp )
254 street = value; 269 street = value;
@@ -277,25 +292,25 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
277 } 292 }
278 else if ( name == VCTelephoneProp ) { 293 else if ( name == VCTelephoneProp ) {
279 enum { 294 enum {
280 HOME = 0x01, 295 HOME = 0x01,
281 WORK = 0x02, 296 WORK = 0x02,
282 VOICE = 0x04, 297 VOICE = 0x04,
283 CELL = 0x08, 298 CELL = 0x08,
284 FAX = 0x10, 299 FAX = 0x10,
285 PAGER = 0x20, 300 PAGER = 0x20,
286 UNKNOWN = 0x80 301 UNKNOWN = 0x80
287 }; 302 };
288 int type = 0; 303 int type = 0;
289 304
290 VObjectIterator nit; 305 VObjectIterator nit;
291 initPropIterator( &nit, o ); 306 initPropIterator( &nit, o );
292 while( moreIteration( &nit ) ) { 307 while( moreIteration( &nit ) ) {
293 VObject *o = nextVObject( &nit ); 308 VObject *o = nextVObject( &nit );
294 QCString name = vObjectTypeInfo( o ); 309 QCString name = vObjectTypeInfo( o );
295 if ( name == VCHomeProp ) 310 if ( name == VCHomeProp )
296 type |= HOME; 311 type |= HOME;
297 else if ( name == VCWorkProp ) 312 else if ( name == VCWorkProp )
298 type |= WORK; 313 type |= WORK;
299 else if ( name == VCVoiceProp ) 314 else if ( name == VCVoiceProp )
300 type |= VOICE; 315 type |= VOICE;
301 else if ( name == VCCellularProp ) 316 else if ( name == VCCellularProp )
@@ -305,32 +320,33 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
305 else if ( name == VCPagerProp ) 320 else if ( name == VCPagerProp )
306 type |= PAGER; 321 type |= PAGER;
307 else if ( name == VCPreferredProp ) 322 else if ( name == VCPreferredProp )
308 ; 323 ;
309 else 324 else
310 type |= UNKNOWN; 325 type |= UNKNOWN;
311 } 326 }
312 if ( (type & UNKNOWN) != UNKNOWN ) { 327 if ( (type & UNKNOWN) != UNKNOWN ) {
313 if ( ( type & (HOME|WORK) ) == 0 ) // default 328 if ( ( type & (HOME|WORK) ) == 0 ) // default
314 type |= HOME; 329 type |= HOME;
315 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 330 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
316 type |= VOICE; 331 type |= VOICE;
317 332
318 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) 333 qWarning("value %s %d", value.data(), type );
334 if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) )
319 c.setHomePhone( value ); 335 c.setHomePhone( value );
320 if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) 336 if ( ( type & (FAX|HOME) ) == (FAX|HOME) )
321 c.setHomeFax( value ); 337 c.setHomeFax( value );
322 if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) 338 if ( ( type & (CELL|HOME) ) == (CELL|HOME) )
323 c.setHomeMobile( value ); 339 c.setHomeMobile( value );
324 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) 340 if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) )
325 c.setBusinessPhone( value ); 341 c.setBusinessPhone( value );
326 if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) 342 if ( ( type & (FAX|WORK) ) == (FAX|WORK) )
327 c.setBusinessFax( value ); 343 c.setBusinessFax( value );
328 if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) 344 if ( ( type & (CELL|WORK) ) == (CELL|WORK) )
329 c.setBusinessMobile( value ); 345 c.setBusinessMobile( value );
330 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) 346 if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) )
331 c.setBusinessPager( value ); 347 c.setBusinessPager( value );
332 } 348 }
333 } 349 }
334 else if ( name == VCEmailAddressProp ) { 350 else if ( name == VCEmailAddressProp ) {
335 QString email = vObjectStringZValue( o ); 351 QString email = vObjectStringZValue( o );
336 bool valid = TRUE; 352 bool valid = TRUE;
@@ -397,27 +413,27 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
397 else if ( name == "X-Qtopia-Anniversary" ) { 413 else if ( name == "X-Qtopia-Anniversary" ) {
398 c.setAnniversary( convVCardDateToDate( value ) ); 414 c.setAnniversary( convVCardDateToDate( value ) );
399 } 415 }
400 else if ( name == "X-Qtopia-Nickname" ) { 416 else if ( name == "X-Qtopia-Nickname" ) {
401 c.setNickname( value ); 417 c.setNickname( value );
402 } 418 }
403 else if ( name == "X-Qtopia-Children" ) { 419 else if ( name == "X-Qtopia-Children" ) {
404 c.setChildren( value ); 420 c.setChildren( value );
405 } 421 }
406 else if ( name == VCBirthDateProp ) { 422 else if ( name == VCBirthDateProp ) {
407 // Reading Birthdate regarding RFC 2425 (5.8.4) 423 // Reading Birthdate regarding RFC 2425 (5.8.4)
408 c.setBirthday( convVCardDateToDate( value ) ); 424 c.setBirthday( convVCardDateToDate( value ) );
409 425
410 } 426 }
411 427
412#if 0 428#if 0
413 else { 429 else {
414 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 430 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
415 VObjectIterator nit; 431 VObjectIterator nit;
416 initPropIterator( &nit, o ); 432 initPropIterator( &nit, o );
417 while( moreIteration( &nit ) ) { 433 while( moreIteration( &nit ) ) {
418 VObject *o = nextVObject( &nit ); 434 VObject *o = nextVObject( &nit );
419 QCString name = vObjectName( o ); 435 QCString name = vObjectName( o );
420 QString value = vObjectStringZValue( o ); 436 QString value = vObjectStringZValue( o );
421 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 437 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
422 } 438 }
423 } 439 }
@@ -425,135 +441,135 @@ OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
425 } 441 }
426 c.setFileAs(); 442 c.setFileAs();
427 return c; 443 return c;
428} 444}
429 445
430 446
431VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) 447VObject* OContactAccessBackend_VCard::createVObject( const OContact &c )
432{ 448{
433 VObject *vcard = newVObject( VCCardProp ); 449 VObject *vcard = newVObject( VCCardProp );
434 safeAddPropValue( vcard, VCVersionProp, "2.1" ); 450 safeAddPropValue( vcard, VCVersionProp, "2.1" );
435 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); 451 safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) );
436 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); 452 safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) );
437 453
438 // full name 454 // full name
439 safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); 455 safeAddPropValue( vcard, VCFullNameProp, c.fullName() );
440 456
441 // name properties 457 // name properties
442 VObject *name = safeAddProp( vcard, VCNameProp ); 458 VObject *name = safeAddProp( vcard, VCNameProp );
443 safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); 459 safeAddPropValue( name, VCFamilyNameProp, c.lastName() );
444 safeAddPropValue( name, VCGivenNameProp, c.firstName() ); 460 safeAddPropValue( name, VCGivenNameProp, c.firstName() );
445 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); 461 safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() );
446 safeAddPropValue( name, VCNamePrefixesProp, c.title() ); 462 safeAddPropValue( name, VCNamePrefixesProp, c.title() );
447 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); 463 safeAddPropValue( name, VCNameSuffixesProp, c.suffix() );
448 464
449 // home properties 465 // home properties
450 VObject *home_adr= safeAddProp( vcard, VCAdrProp ); 466 VObject *home_adr= safeAddProp( vcard, VCAdrProp );
451 safeAddProp( home_adr, VCHomeProp ); 467 safeAddProp( home_adr, VCHomeProp );
452 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); 468 safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() );
453 safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); 469 safeAddPropValue( home_adr, VCCityProp, c.homeCity() );
454 safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); 470 safeAddPropValue( home_adr, VCRegionProp, c.homeState() );
455 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); 471 safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() );
456 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); 472 safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() );
457 473
458 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); 474 VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() );
459 safeAddProp( home_phone, VCHomeProp ); 475 safeAddProp( home_phone, VCHomeProp );
460 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); 476 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() );
461 safeAddProp( home_phone, VCHomeProp ); 477 safeAddProp( home_phone, VCHomeProp );
462 safeAddProp( home_phone, VCCellularProp ); 478 safeAddProp( home_phone, VCCellularProp );
463 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); 479 home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() );
464 safeAddProp( home_phone, VCHomeProp ); 480 safeAddProp( home_phone, VCHomeProp );
465 safeAddProp( home_phone, VCFaxProp ); 481 safeAddProp( home_phone, VCFaxProp );
466 482
467 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); 483 VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() );
468 safeAddProp( url, VCHomeProp ); 484 safeAddProp( url, VCHomeProp );
469 485
470 // work properties 486 // work properties
471 VObject *work_adr= safeAddProp( vcard, VCAdrProp ); 487 VObject *work_adr= safeAddProp( vcard, VCAdrProp );
472 safeAddProp( work_adr, VCWorkProp ); 488 safeAddProp( work_adr, VCWorkProp );
473 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); 489 safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() );
474 safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); 490 safeAddPropValue( work_adr, VCCityProp, c.businessCity() );
475 safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); 491 safeAddPropValue( work_adr, VCRegionProp, c.businessState() );
476 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); 492 safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() );
477 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); 493 safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() );
478 494
479 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); 495 VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() );
480 safeAddProp( work_phone, VCWorkProp ); 496 safeAddProp( work_phone, VCWorkProp );
481 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); 497 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() );
482 safeAddProp( work_phone, VCWorkProp ); 498 safeAddProp( work_phone, VCWorkProp );
483 safeAddProp( work_phone, VCCellularProp ); 499 safeAddProp( work_phone, VCCellularProp );
484 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); 500 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() );
485 safeAddProp( work_phone, VCWorkProp ); 501 safeAddProp( work_phone, VCWorkProp );
486 safeAddProp( work_phone, VCFaxProp ); 502 safeAddProp( work_phone, VCFaxProp );
487 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); 503 work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() );
488 safeAddProp( work_phone, VCWorkProp ); 504 safeAddProp( work_phone, VCWorkProp );
489 safeAddProp( work_phone, VCPagerProp ); 505 safeAddProp( work_phone, VCPagerProp );
490 506
491 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); 507 url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() );
492 safeAddProp( url, VCWorkProp ); 508 safeAddProp( url, VCWorkProp );
493 509
494 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); 510 VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() );
495 safeAddProp( title, VCWorkProp ); 511 safeAddProp( title, VCWorkProp );
496 512
497 513
498 QStringList emails = c.emailList(); 514 QStringList emails = c.emailList();
499 emails.prepend( c.defaultEmail() ); 515 emails.prepend( c.defaultEmail() );
500 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { 516 for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) {
501 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); 517 VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it );
502 safeAddProp( email, VCInternetProp ); 518 safeAddProp( email, VCInternetProp );
503 } 519 }
504 520
505 safeAddPropValue( vcard, VCNoteProp, c.notes() ); 521 safeAddPropValue( vcard, VCNoteProp, c.notes() );
506 522
507 // Exporting Birthday regarding RFC 2425 (5.8.4) 523 // Exporting Birthday regarding RFC 2425 (5.8.4)
508 if ( c.birthday().isValid() ){ 524 if ( c.birthday().isValid() ){
509 qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() ); 525 qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() );
510 safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); 526 safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) );
511 } 527 }
512 528
513 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { 529 if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) {
514 VObject *org = safeAddProp( vcard, VCOrgProp ); 530 VObject *org = safeAddProp( vcard, VCOrgProp );
515 safeAddPropValue( org, VCOrgNameProp, c.company() ); 531 safeAddPropValue( org, VCOrgNameProp, c.company() );
516 safeAddPropValue( org, VCOrgUnitProp, c.department() ); 532 safeAddPropValue( org, VCOrgUnitProp, c.department() );
517 safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); 533 safeAddPropValue( org, VCOrgUnit2Prop, c.office() );
518 } 534 }
519 535
520 // some values we have to export as custom fields 536 // some values we have to export as custom fields
521 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); 537 safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() );
522 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); 538 safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() );
523 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); 539 safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() );
524 540
525 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); 541 safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() );
526 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); 542 safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() );
527 if ( c.anniversary().isValid() ){ 543 if ( c.anniversary().isValid() ){
528 qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() ); 544 qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() );
529 safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); 545 safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) );
530 } 546 }
531 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); 547 safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() );
532 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); 548 safeAddPropValue( vcard, "X-Qtopia-Children", c.children() );
533 549
534 return vcard; 550 return vcard;
535} 551}
536 552
537QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const 553QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const
538{ 554{
539 QString str_rfc2425 = QString("%1-%2-%3") 555 QString str_rfc2425 = QString("%1-%2-%3")
540 .arg( d.year() ) 556 .arg( d.year() )
541 .arg( d.month(), 2 ) 557 .arg( d.month(), 2 )
542 .arg( d.day(), 2 ); 558 .arg( d.day(), 2 );
543 // Now replace spaces with "0"... 559 // Now replace spaces with "0"...
544 int pos = 0; 560 int pos = 0;
545 while ( ( pos = str_rfc2425.find (' ') ) > 0 ) 561 while ( ( pos = str_rfc2425.find (' ') ) > 0 )
546 str_rfc2425.replace( pos, 1, "0" ); 562 str_rfc2425.replace( pos, 1, "0" );
547 563
548 return str_rfc2425; 564 return str_rfc2425;
549} 565}
550 566
551QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) 567QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr )
552{ 568{
553 int monthPos = datestr.find('-'); 569 int monthPos = datestr.find('-');
554 int dayPos = datestr.find('-', monthPos+1 ); 570 int dayPos = datestr.find('-', monthPos+1 );
555 int sep_ignore = 1; 571 int sep_ignore = 1;
556 if ( monthPos == -1 || dayPos == -1 ) { 572 if ( monthPos == -1 || dayPos == -1 ) {
557 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); 573 qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos );
558 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) 574 // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD )
559 if ( datestr.length() == 8 ){ 575 if ( datestr.length() == 8 ){
diff --git a/libopie2/opiepim/backend/otodoaccessvcal.cpp b/libopie2/opiepim/backend/otodoaccessvcal.cpp
index e96cc3c..309f9e1 100644
--- a/libopie2/opiepim/backend/otodoaccessvcal.cpp
+++ b/libopie2/opiepim/backend/otodoaccessvcal.cpp
@@ -49,27 +49,30 @@ namespace {
49 name = vObjectStringZValue( ob ); 49 name = vObjectStringZValue( ob );
50 qWarning("Categories:%s", name.data() ); 50 qWarning("Categories:%s", name.data() );
51 } 51 }
52 52
53 event.setUid( 1 ); 53 event.setUid( 1 );
54 return event; 54 return event;
55 }; 55 };
56 static VObject *vobjByEvent( const OTodo &event ) { 56 static VObject *vobjByEvent( const OTodo &event ) {
57 VObject *task = newVObject( VCTodoProp ); 57 VObject *task = newVObject( VCTodoProp );
58 if( task == 0 ) 58 if( task == 0 )
59 return 0l; 59 return 0l;
60 60
61 if( event.hasDueDate() ) 61 if( event.hasDueDate() ) {
62 QTime time(0, 0, 0);
63 QDateTime date(event.dueDate(), time );
62 addPropValue( task, VCDueProp, 64 addPropValue( task, VCDueProp,
63 TimeConversion::toISO8601( event.dueDate() ) ); 65 TimeConversion::toISO8601( date ) );
66 }
64 67
65 if( event.isCompleted() ) 68 if( event.isCompleted() )
66 addPropValue( task, VCStatusProp, "COMPLETED"); 69 addPropValue( task, VCStatusProp, "COMPLETED");
67 70
68 QString string = QString::number(event.priority() ); 71 QString string = QString::number(event.priority() );
69 addPropValue( task, VCPriorityProp, string.local8Bit() ); 72 addPropValue( task, VCPriorityProp, string.local8Bit() );
70 73
71 addPropValue( task, VCCategoriesProp, 74 addPropValue( task, VCCategoriesProp,
72 event.idsToString( event.categories() ).local8Bit() ); 75 event.idsToString( event.categories() ).local8Bit() );
73 76
74 addPropValue( task, VCDescriptionProp, 77 addPropValue( task, VCDescriptionProp,
75 event.description().local8Bit() ); 78 event.description().local8Bit() );