author | eilers <eilers> | 2005-02-03 10:05:00 (UTC) |
---|---|---|
committer | eilers <eilers> | 2005-02-03 10:05:00 (UTC) |
commit | 9424f9fa34e458c90b5f9bbe2a88074cd9a1161c (patch) (unidiff) | |
tree | a4d94b096a82f49e8b6d4766cc4cae3763350d19 | |
parent | 2ed3b823bdcb473dca8a809b939c5d7d282b70bb (diff) | |
download | opie-9424f9fa34e458c90b5f9bbe2a88074cd9a1161c.zip opie-9424f9fa34e458c90b5f9bbe2a88074cd9a1161c.tar.gz opie-9424f9fa34e458c90b5f9bbe2a88074cd9a1161c.tar.bz2 |
Fixing bug #1236: VCARD contained empty WORK and HOME addressfields..
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp index f3b6d56..0ffbb67 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | |||
@@ -199,399 +199,411 @@ OPimContact OPimContactAccessBackend_VCard::parseVObject( VObject *obj ) | |||
199 | initPropIterator( &nit, o ); | 199 | initPropIterator( &nit, o ); |
200 | while( moreIteration( &nit ) ) { | 200 | while( moreIteration( &nit ) ) { |
201 | VObject *o = nextVObject( &nit ); | 201 | VObject *o = nextVObject( &nit ); |
202 | QCString name = vObjectTypeInfo( o ); | 202 | QCString name = vObjectTypeInfo( o ); |
203 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); | 203 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); |
204 | odebug << "Nametype is: "<< name << " Value: " << value.latin1() << oendl; | 204 | odebug << "Nametype is: "<< name << " Value: " << value.latin1() << oendl; |
205 | if ( name == VCNamePrefixesProp ) | 205 | if ( name == VCNamePrefixesProp ) |
206 | c.setTitle( value ); | 206 | c.setTitle( value ); |
207 | else if ( name == VCNameSuffixesProp ) | 207 | else if ( name == VCNameSuffixesProp ) |
208 | c.setSuffix( value ); | 208 | c.setSuffix( value ); |
209 | else if ( name == VCFamilyNameProp ) | 209 | else if ( name == VCFamilyNameProp ) |
210 | c.setLastName( value ); | 210 | c.setLastName( value ); |
211 | else if ( name == VCGivenNameProp ) | 211 | else if ( name == VCGivenNameProp ) |
212 | c.setFirstName( value ); | 212 | c.setFirstName( value ); |
213 | else if ( name == VCAdditionalNamesProp ) | 213 | else if ( name == VCAdditionalNamesProp ) |
214 | c.setMiddleName( value ); | 214 | c.setMiddleName( value ); |
215 | } | 215 | } |
216 | } | 216 | } |
217 | else if ( name == VCAdrProp ) { | 217 | else if ( name == VCAdrProp ) { |
218 | bool work = TRUE; // default address is work address | 218 | bool work = TRUE; // default address is work address |
219 | QString street; | 219 | QString street; |
220 | QString city; | 220 | QString city; |
221 | QString region; | 221 | QString region; |
222 | QString postal; | 222 | QString postal; |
223 | QString country; | 223 | QString country; |
224 | 224 | ||
225 | VObjectIterator nit; | 225 | VObjectIterator nit; |
226 | initPropIterator( &nit, o ); | 226 | initPropIterator( &nit, o ); |
227 | while( moreIteration( &nit ) ) { | 227 | while( moreIteration( &nit ) ) { |
228 | VObject *o = nextVObject( &nit ); | 228 | VObject *o = nextVObject( &nit ); |
229 | QCString name = vObjectTypeInfo( o ); | 229 | QCString name = vObjectTypeInfo( o ); |
230 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); | 230 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); |
231 | odebug << "AddressType is: "<< name << " Value: " << value.latin1() << oendl; | 231 | odebug << "AddressType is: "<< name << " Value: " << value.latin1() << oendl; |
232 | if ( name == VCHomeProp ) | 232 | if ( name == VCHomeProp ) |
233 | work = FALSE; | 233 | work = FALSE; |
234 | else if ( name == VCWorkProp ) | 234 | else if ( name == VCWorkProp ) |
235 | work = TRUE; | 235 | work = TRUE; |
236 | else if ( name == VCStreetAddressProp ) | 236 | else if ( name == VCStreetAddressProp ) |
237 | street = value; | 237 | street = value; |
238 | else if ( name == VCCityProp ) | 238 | else if ( name == VCCityProp ) |
239 | city = value; | 239 | city = value; |
240 | else if ( name == VCRegionProp ) | 240 | else if ( name == VCRegionProp ) |
241 | region = value; | 241 | region = value; |
242 | else if ( name == VCPostalCodeProp ) | 242 | else if ( name == VCPostalCodeProp ) |
243 | postal = value; | 243 | postal = value; |
244 | else if ( name == VCCountryNameProp ) | 244 | else if ( name == VCCountryNameProp ) |
245 | country = value; | 245 | country = value; |
246 | } | 246 | } |
247 | if ( work ) { | 247 | if ( work ) { |
248 | c.setBusinessStreet( street ); | 248 | c.setBusinessStreet( street ); |
249 | c.setBusinessCity( city ); | 249 | c.setBusinessCity( city ); |
250 | c.setBusinessCountry( country ); | 250 | c.setBusinessCountry( country ); |
251 | c.setBusinessZip( postal ); | 251 | c.setBusinessZip( postal ); |
252 | c.setBusinessState( region ); | 252 | c.setBusinessState( region ); |
253 | } else { | 253 | } else { |
254 | c.setHomeStreet( street ); | 254 | c.setHomeStreet( street ); |
255 | c.setHomeCity( city ); | 255 | c.setHomeCity( city ); |
256 | c.setHomeCountry( country ); | 256 | c.setHomeCountry( country ); |
257 | c.setHomeZip( postal ); | 257 | c.setHomeZip( postal ); |
258 | c.setHomeState( region ); | 258 | c.setHomeState( region ); |
259 | } | 259 | } |
260 | } | 260 | } |
261 | else if ( name == VCTelephoneProp ) { | 261 | else if ( name == VCTelephoneProp ) { |
262 | enum { | 262 | enum { |
263 | HOME = 0x01, | 263 | HOME = 0x01, |
264 | WORK = 0x02, | 264 | WORK = 0x02, |
265 | VOICE = 0x04, | 265 | VOICE = 0x04, |
266 | CELL = 0x08, | 266 | CELL = 0x08, |
267 | FAX = 0x10, | 267 | FAX = 0x10, |
268 | PAGER = 0x20, | 268 | PAGER = 0x20, |
269 | UNKNOWN = 0x80 | 269 | UNKNOWN = 0x80 |
270 | }; | 270 | }; |
271 | int type = 0; | 271 | int type = 0; |
272 | 272 | ||
273 | VObjectIterator nit; | 273 | VObjectIterator nit; |
274 | initPropIterator( &nit, o ); | 274 | initPropIterator( &nit, o ); |
275 | while( moreIteration( &nit ) ) { | 275 | while( moreIteration( &nit ) ) { |
276 | VObject *o = nextVObject( &nit ); | 276 | VObject *o = nextVObject( &nit ); |
277 | QCString name = vObjectTypeInfo( o ); | 277 | QCString name = vObjectTypeInfo( o ); |
278 | odebug << "Telephonetype is: "<< name << " Value: " << value.latin1() << oendl; | 278 | odebug << "Telephonetype is: "<< name << " Value: " << value.latin1() << oendl; |
279 | if ( name == VCHomeProp ) | 279 | if ( name == VCHomeProp ) |
280 | type |= HOME; | 280 | type |= HOME; |
281 | else if ( name == VCWorkProp ) | 281 | else if ( name == VCWorkProp ) |
282 | type |= WORK; | 282 | type |= WORK; |
283 | else if ( name == VCVoiceProp ) | 283 | else if ( name == VCVoiceProp ) |
284 | type |= VOICE; | 284 | type |= VOICE; |
285 | else if ( name == VCCellularProp ) | 285 | else if ( name == VCCellularProp ) |
286 | type |= CELL; | 286 | type |= CELL; |
287 | else if ( name == VCFaxProp ) | 287 | else if ( name == VCFaxProp ) |
288 | type |= FAX; | 288 | type |= FAX; |
289 | else if ( name == VCPagerProp ) | 289 | else if ( name == VCPagerProp ) |
290 | type |= PAGER; | 290 | type |= PAGER; |
291 | else if ( name == VCPreferredProp ) | 291 | else if ( name == VCPreferredProp ) |
292 | ; | 292 | ; |
293 | else if ( name.left( 2 ) == "X-" || name.left( 2 ) == "x-" ) | 293 | else if ( name.left( 2 ) == "X-" || name.left( 2 ) == "x-" ) |
294 | ; // Ignore | 294 | ; // Ignore |
295 | else | 295 | else |
296 | type |= UNKNOWN; | 296 | type |= UNKNOWN; |
297 | } | 297 | } |
298 | if ( (type & UNKNOWN) != UNKNOWN ) { | 298 | if ( (type & UNKNOWN) != UNKNOWN ) { |
299 | if ( ( type & (HOME|WORK) ) == 0 ) // default | 299 | if ( ( type & (HOME|WORK) ) == 0 ) // default |
300 | type |= HOME; | 300 | type |= HOME; |
301 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default | 301 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default |
302 | type |= VOICE; | 302 | type |= VOICE; |
303 | 303 | ||
304 | odebug << "value %s %d" << value.data() << type << oendl; | 304 | odebug << "value %s %d" << value.data() << type << oendl; |
305 | 305 | ||
306 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) | 306 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) |
307 | c.setHomePhone( value ); | 307 | c.setHomePhone( value ); |
308 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) | 308 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) |
309 | c.setHomeFax( value ); | 309 | c.setHomeFax( value ); |
310 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) | 310 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) |
311 | c.setHomeMobile( value ); | 311 | c.setHomeMobile( value ); |
312 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) | 312 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) |
313 | c.setBusinessPhone( value ); | 313 | c.setBusinessPhone( value ); |
314 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) | 314 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) |
315 | c.setBusinessFax( value ); | 315 | c.setBusinessFax( value ); |
316 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) | 316 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) |
317 | c.setBusinessMobile( value ); | 317 | c.setBusinessMobile( value ); |
318 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) | 318 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) |
319 | c.setBusinessPager( value ); | 319 | c.setBusinessPager( value ); |
320 | } | 320 | } |
321 | } | 321 | } |
322 | else if ( name == VCEmailAddressProp ) { | 322 | else if ( name == VCEmailAddressProp ) { |
323 | QString email = QString::fromUtf8( vObjectStringZValue( o ) ); | 323 | QString email = QString::fromUtf8( vObjectStringZValue( o ) ); |
324 | bool valid = TRUE; | 324 | bool valid = TRUE; |
325 | VObjectIterator nit; | 325 | VObjectIterator nit; |
326 | initPropIterator( &nit, o ); | 326 | initPropIterator( &nit, o ); |
327 | while( moreIteration( &nit ) ) { | 327 | while( moreIteration( &nit ) ) { |
328 | VObject *o = nextVObject( &nit ); | 328 | VObject *o = nextVObject( &nit ); |
329 | QCString name = vObjectTypeInfo( o ); | 329 | QCString name = vObjectTypeInfo( o ); |
330 | odebug << "Emailtype is: "<< name << " Value: " << value.latin1() << oendl; | 330 | odebug << "Emailtype is: "<< name << " Value: " << value.latin1() << oendl; |
331 | if ( name != VCInternetProp && name != VCHomeProp && | 331 | if ( name != VCInternetProp && name != VCHomeProp && |
332 | name != VCWorkProp && | 332 | name != VCWorkProp && |
333 | name != VCPreferredProp && | 333 | name != VCPreferredProp && |
334 | name.left( 2 ) != "X-" && name.left( 2 ) != "x-" ){ | 334 | name.left( 2 ) != "X-" && name.left( 2 ) != "x-" ){ |
335 | // ### preffered should map to default email | 335 | // ### preffered should map to default email |
336 | valid = FALSE; | 336 | valid = FALSE; |
337 | odebug << "Email was detected as invalid!" << oendl; | 337 | odebug << "Email was detected as invalid!" << oendl; |
338 | } | 338 | } |
339 | } | 339 | } |
340 | if ( valid ) { | 340 | if ( valid ) { |
341 | c.insertEmail( email ); | 341 | c.insertEmail( email ); |
342 | } | 342 | } |
343 | } | 343 | } |
344 | else if ( name == VCURLProp ) { | 344 | else if ( name == VCURLProp ) { |
345 | VObjectIterator nit; | 345 | VObjectIterator nit; |
346 | initPropIterator( &nit, o ); | 346 | initPropIterator( &nit, o ); |
347 | while( moreIteration( &nit ) ) { | 347 | while( moreIteration( &nit ) ) { |
348 | VObject *o = nextVObject( &nit ); | 348 | VObject *o = nextVObject( &nit ); |
349 | QCString name = vObjectTypeInfo( o ); | 349 | QCString name = vObjectTypeInfo( o ); |
350 | if ( name == VCHomeProp ) | 350 | if ( name == VCHomeProp ) |
351 | c.setHomeWebpage( value ); | 351 | c.setHomeWebpage( value ); |
352 | else if ( name == VCWorkProp ) | 352 | else if ( name == VCWorkProp ) |
353 | c.setBusinessWebpage( value ); | 353 | c.setBusinessWebpage( value ); |
354 | } | 354 | } |
355 | } | 355 | } |
356 | else if ( name == VCOrgProp ) { | 356 | else if ( name == VCOrgProp ) { |
357 | VObjectIterator nit; | 357 | VObjectIterator nit; |
358 | initPropIterator( &nit, o ); | 358 | initPropIterator( &nit, o ); |
359 | while( moreIteration( &nit ) ) { | 359 | while( moreIteration( &nit ) ) { |
360 | VObject *o = nextVObject( &nit ); | 360 | VObject *o = nextVObject( &nit ); |
361 | QCString name = vObjectName( o ); | 361 | QCString name = vObjectName( o ); |
362 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); | 362 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); |
363 | if ( name == VCOrgNameProp ) | 363 | if ( name == VCOrgNameProp ) |
364 | c.setCompany( value ); | 364 | c.setCompany( value ); |
365 | else if ( name == VCOrgUnitProp ) | 365 | else if ( name == VCOrgUnitProp ) |
366 | c.setDepartment( value ); | 366 | c.setDepartment( value ); |
367 | else if ( name == VCOrgUnit2Prop ) | 367 | else if ( name == VCOrgUnit2Prop ) |
368 | c.setOffice( value ); | 368 | c.setOffice( value ); |
369 | } | 369 | } |
370 | } | 370 | } |
371 | else if ( name == VCTitleProp ) { | 371 | else if ( name == VCTitleProp ) { |
372 | c.setJobTitle( value ); | 372 | c.setJobTitle( value ); |
373 | } | 373 | } |
374 | else if ( name == "X-Qtopia-Profession" ) { | 374 | else if ( name == "X-Qtopia-Profession" ) { |
375 | c.setProfession( value ); | 375 | c.setProfession( value ); |
376 | } | 376 | } |
377 | else if ( name == "X-Qtopia-Manager" ) { | 377 | else if ( name == "X-Qtopia-Manager" ) { |
378 | c.setManager( value ); | 378 | c.setManager( value ); |
379 | } | 379 | } |
380 | else if ( name == "X-Qtopia-Assistant" ) { | 380 | else if ( name == "X-Qtopia-Assistant" ) { |
381 | c.setAssistant( value ); | 381 | c.setAssistant( value ); |
382 | } | 382 | } |
383 | else if ( name == "X-Qtopia-Spouse" ) { | 383 | else if ( name == "X-Qtopia-Spouse" ) { |
384 | c.setSpouse( value ); | 384 | c.setSpouse( value ); |
385 | } | 385 | } |
386 | else if ( name == "X-Qtopia-Gender" ) { | 386 | else if ( name == "X-Qtopia-Gender" ) { |
387 | c.setGender( value ); | 387 | c.setGender( value ); |
388 | } | 388 | } |
389 | else if ( name == "X-Qtopia-Anniversary" ) { | 389 | else if ( name == "X-Qtopia-Anniversary" ) { |
390 | c.setAnniversary( convVCardDateToDate( value ) ); | 390 | c.setAnniversary( convVCardDateToDate( value ) ); |
391 | } | 391 | } |
392 | else if ( name == "X-Qtopia-Nickname" ) { | 392 | else if ( name == "X-Qtopia-Nickname" ) { |
393 | c.setNickname( value ); | 393 | c.setNickname( value ); |
394 | } | 394 | } |
395 | else if ( name == "X-Qtopia-Children" ) { | 395 | else if ( name == "X-Qtopia-Children" ) { |
396 | c.setChildren( value ); | 396 | c.setChildren( value ); |
397 | } | 397 | } |
398 | else if ( name == VCBirthDateProp ) { | 398 | else if ( name == VCBirthDateProp ) { |
399 | // Reading Birthdate regarding RFC 2425 (5.8.4) | 399 | // Reading Birthdate regarding RFC 2425 (5.8.4) |
400 | c.setBirthday( convVCardDateToDate( value ) ); | 400 | c.setBirthday( convVCardDateToDate( value ) ); |
401 | 401 | ||
402 | } | 402 | } |
403 | else if ( name == VCCommentProp ) { | 403 | else if ( name == VCCommentProp ) { |
404 | c.setNotes( value ); | 404 | c.setNotes( value ); |
405 | } | 405 | } |
406 | #if 0 | 406 | #if 0 |
407 | else { | 407 | else { |
408 | printf("Name: %s, value=%s\n", name.data(), QString::fromUtf8( vObjectStringZValue( o ) ) ); | 408 | printf("Name: %s, value=%s\n", name.data(), QString::fromUtf8( vObjectStringZValue( o ) ) ); |
409 | VObjectIterator nit; | 409 | VObjectIterator nit; |
410 | initPropIterator( &nit, o ); | 410 | initPropIterator( &nit, o ); |
411 | while( moreIteration( &nit ) ) { | 411 | while( moreIteration( &nit ) ) { |
412 | VObject *o = nextVObject( &nit ); | 412 | VObject *o = nextVObject( &nit ); |
413 | QCString name = vObjectName( o ); | 413 | QCString name = vObjectName( o ); |
414 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); | 414 | QString value = QString::fromUtf8( vObjectStringZValue( o ) ); |
415 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); | 415 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); |
416 | } | 416 | } |
417 | } | 417 | } |
418 | else { | 418 | else { |
419 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); | 419 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); |
420 | VObjectIterator nit; | 420 | VObjectIterator nit; |
421 | initPropIterator( &nit, o ); | 421 | initPropIterator( &nit, o ); |
422 | while( moreIteration( &nit ) ) { | 422 | while( moreIteration( &nit ) ) { |
423 | VObject *o = nextVObject( &nit ); | 423 | VObject *o = nextVObject( &nit ); |
424 | QCString name = vObjectName( o ); | 424 | QCString name = vObjectName( o ); |
425 | QString value = vObjectStringZValue( o ); | 425 | QString value = vObjectStringZValue( o ); |
426 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); | 426 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); |
427 | } | 427 | } |
428 | } | 428 | } |
429 | #endif | 429 | #endif |
430 | } | 430 | } |
431 | c.setFileAs(); | 431 | c.setFileAs(); |
432 | return c; | 432 | return c; |
433 | } | 433 | } |
434 | 434 | ||
435 | 435 | ||
436 | VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &c ) | 436 | VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &c ) |
437 | { | 437 | { |
438 | VObject *vcard = newVObject( VCCardProp ); | 438 | VObject *vcard = newVObject( VCCardProp ); |
439 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); | 439 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); |
440 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); | 440 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); |
441 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); | 441 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); |
442 | 442 | ||
443 | // full name | 443 | // full name |
444 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); | 444 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); |
445 | 445 | ||
446 | // name properties | 446 | // name properties |
447 | VObject *name = safeAddProp( vcard, VCNameProp ); | 447 | VObject *name = safeAddProp( vcard, VCNameProp ); |
448 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); | 448 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); |
449 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); | 449 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); |
450 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); | 450 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); |
451 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); | 451 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); |
452 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); | 452 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); |
453 | 453 | ||
454 | // home properties | 454 | // home properties |
455 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); | 455 | if ( !( c.homeStreet().isEmpty() |
456 | safeAddProp( home_adr, VCHomeProp ); | 456 | && c.homeCity().isEmpty() |
457 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); | 457 | && c.homeState().isEmpty() |
458 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); | 458 | && c.homeZip().isEmpty() |
459 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); | 459 | && c.homeCountry().isEmpty() ) ){ |
460 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); | 460 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); |
461 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); | 461 | safeAddProp( home_adr, VCHomeProp ); |
462 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); | ||
463 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); | ||
464 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); | ||
465 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); | ||
466 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); | ||
467 | } | ||
462 | 468 | ||
463 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); | 469 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); |
464 | safeAddProp( home_phone, VCHomeProp ); | 470 | safeAddProp( home_phone, VCHomeProp ); |
465 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); | 471 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); |
466 | safeAddProp( home_phone, VCHomeProp ); | 472 | safeAddProp( home_phone, VCHomeProp ); |
467 | safeAddProp( home_phone, VCCellularProp ); | 473 | safeAddProp( home_phone, VCCellularProp ); |
468 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); | 474 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); |
469 | safeAddProp( home_phone, VCHomeProp ); | 475 | safeAddProp( home_phone, VCHomeProp ); |
470 | safeAddProp( home_phone, VCFaxProp ); | 476 | safeAddProp( home_phone, VCFaxProp ); |
471 | 477 | ||
472 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); | 478 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); |
473 | safeAddProp( url, VCHomeProp ); | 479 | safeAddProp( url, VCHomeProp ); |
474 | 480 | ||
475 | // work properties | 481 | // work properties |
476 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); | 482 | if ( !( c.businessStreet().isEmpty() |
477 | safeAddProp( work_adr, VCWorkProp ); | 483 | && c.businessCity().isEmpty() |
478 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); | 484 | && c.businessState().isEmpty() |
479 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); | 485 | && c.businessZip().isEmpty() |
480 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); | 486 | && c.businessCountry().isEmpty() ) ){ |
481 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); | 487 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); |
482 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); | 488 | safeAddProp( work_adr, VCWorkProp ); |
489 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); | ||
490 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); | ||
491 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); | ||
492 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); | ||
493 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); | ||
494 | } | ||
483 | 495 | ||
484 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); | 496 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); |
485 | safeAddProp( work_phone, VCWorkProp ); | 497 | safeAddProp( work_phone, VCWorkProp ); |
486 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); | 498 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); |
487 | safeAddProp( work_phone, VCWorkProp ); | 499 | safeAddProp( work_phone, VCWorkProp ); |
488 | safeAddProp( work_phone, VCCellularProp ); | 500 | safeAddProp( work_phone, VCCellularProp ); |
489 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); | 501 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); |
490 | safeAddProp( work_phone, VCWorkProp ); | 502 | safeAddProp( work_phone, VCWorkProp ); |
491 | safeAddProp( work_phone, VCFaxProp ); | 503 | safeAddProp( work_phone, VCFaxProp ); |
492 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); | 504 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); |
493 | safeAddProp( work_phone, VCWorkProp ); | 505 | safeAddProp( work_phone, VCWorkProp ); |
494 | safeAddProp( work_phone, VCPagerProp ); | 506 | safeAddProp( work_phone, VCPagerProp ); |
495 | 507 | ||
496 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); | 508 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); |
497 | safeAddProp( url, VCWorkProp ); | 509 | safeAddProp( url, VCWorkProp ); |
498 | 510 | ||
499 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); | 511 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); |
500 | safeAddProp( title, VCWorkProp ); | 512 | safeAddProp( title, VCWorkProp ); |
501 | 513 | ||
502 | 514 | ||
503 | QStringList emails = c.emailList(); | 515 | QStringList emails = c.emailList(); |
504 | // emails.prepend( c.defaultEmail() ); Fix for bugreport #1045 | 516 | // emails.prepend( c.defaultEmail() ); Fix for bugreport #1045 |
505 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { | 517 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { |
506 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); | 518 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); |
507 | safeAddProp( email, VCInternetProp ); | 519 | safeAddProp( email, VCInternetProp ); |
508 | } | 520 | } |
509 | 521 | ||
510 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); | 522 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); |
511 | 523 | ||
512 | // Exporting Birthday regarding RFC 2425 (5.8.4) | 524 | // Exporting Birthday regarding RFC 2425 (5.8.4) |
513 | if ( c.birthday().isValid() ){ | 525 | if ( c.birthday().isValid() ){ |
514 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); | 526 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); |
515 | } | 527 | } |
516 | 528 | ||
517 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { | 529 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { |
518 | VObject *org = safeAddProp( vcard, VCOrgProp ); | 530 | VObject *org = safeAddProp( vcard, VCOrgProp ); |
519 | safeAddPropValue( org, VCOrgNameProp, c.company() ); | 531 | safeAddPropValue( org, VCOrgNameProp, c.company() ); |
520 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); | 532 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); |
521 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); | 533 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); |
522 | } | 534 | } |
523 | 535 | ||
524 | // some values we have to export as custom fields | 536 | // some values we have to export as custom fields |
525 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); | 537 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); |
526 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); | 538 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); |
527 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); | 539 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); |
528 | 540 | ||
529 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); | 541 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); |
530 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); | 542 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); |
531 | if ( c.anniversary().isValid() ){ | 543 | if ( c.anniversary().isValid() ){ |
532 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); | 544 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); |
533 | } | 545 | } |
534 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); | 546 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); |
535 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); | 547 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); |
536 | 548 | ||
537 | return vcard; | 549 | return vcard; |
538 | } | 550 | } |
539 | 551 | ||
540 | QString OPimContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const | 552 | QString OPimContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const |
541 | { | 553 | { |
542 | QString str_rfc2425 = QString("%1-%2-%3") | 554 | QString str_rfc2425 = QString("%1-%2-%3") |
543 | .arg( d.year() ) | 555 | .arg( d.year() ) |
544 | .arg( d.month(), 2 ) | 556 | .arg( d.month(), 2 ) |
545 | .arg( d.day(), 2 ); | 557 | .arg( d.day(), 2 ); |
546 | // Now replace spaces with "0"... | 558 | // Now replace spaces with "0"... |
547 | int pos = 0; | 559 | int pos = 0; |
548 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) | 560 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) |
549 | str_rfc2425.replace( pos, 1, "0" ); | 561 | str_rfc2425.replace( pos, 1, "0" ); |
550 | 562 | ||
551 | return str_rfc2425; | 563 | return str_rfc2425; |
552 | } | 564 | } |
553 | 565 | ||
554 | QDate OPimContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) | 566 | QDate OPimContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) |
555 | { | 567 | { |
556 | int monthPos = datestr.find('-'); | 568 | int monthPos = datestr.find('-'); |
557 | int dayPos = datestr.find('-', monthPos+1 ); | 569 | int dayPos = datestr.find('-', monthPos+1 ); |
558 | int sep_ignore = 1; | 570 | int sep_ignore = 1; |
559 | if ( monthPos == -1 || dayPos == -1 ) { | 571 | if ( monthPos == -1 || dayPos == -1 ) { |
560 | odebug << "fromString didn't find - in str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; | 572 | odebug << "fromString didn't find - in str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
561 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) | 573 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) |
562 | if ( datestr.length() == 8 ){ | 574 | if ( datestr.length() == 8 ){ |
563 | monthPos = 4; | 575 | monthPos = 4; |
564 | dayPos = 6; | 576 | dayPos = 6; |
565 | sep_ignore = 0; | 577 | sep_ignore = 0; |
566 | odebug << "Try with follwing positions str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; | 578 | odebug << "Try with follwing positions str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
567 | } else { | 579 | } else { |
568 | return QDate(); | 580 | return QDate(); |
569 | } | 581 | } |
570 | } | 582 | } |
571 | int y = datestr.left( monthPos ).toInt(); | 583 | int y = datestr.left( monthPos ).toInt(); |
572 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); | 584 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); |
573 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); | 585 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); |
574 | odebug << "TimeConversion::fromString ymd = " << datestr << " => " << y << " " << m << " " << d << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; | 586 | odebug << "TimeConversion::fromString ymd = " << datestr << " => " << y << " " << m << " " << d << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
575 | QDate date ( y,m,d ); | 587 | QDate date ( y,m,d ); |
576 | return date; | 588 | return date; |
577 | } | 589 | } |
578 | 590 | ||
579 | VObject* OPimContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) | 591 | VObject* OPimContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) |
580 | { | 592 | { |
581 | VObject *ret = 0; | 593 | VObject *ret = 0; |
582 | if ( o && !value.isEmpty() ) | 594 | if ( o && !value.isEmpty() ) |
583 | ret = addPropValue( o, prop, value.utf8() ); | 595 | ret = addPropValue( o, prop, value.utf8() ); |
584 | return ret; | 596 | return ret; |
585 | } | 597 | } |
586 | 598 | ||
587 | VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) | 599 | VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) |
588 | { | 600 | { |
589 | VObject *ret = 0; | 601 | VObject *ret = 0; |
590 | if ( o ) | 602 | if ( o ) |
591 | ret = addProp( o, prop ); | 603 | ret = addProp( o, prop ); |
592 | return ret; | 604 | return ret; |
593 | } | 605 | } |
594 | 606 | ||
595 | 607 | ||
596 | 608 | ||
597 | } | 609 | } |