summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index e241281..31ce1d6 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -14,64 +14,66 @@
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22/* 22/*
23Enhanced Version of the file for platform independent KDE tools. 23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk 24Copyright (c) 2004 Ulf Schenk
25 25
26$Id$ 26$Id$
27*/ 27*/
28 28
29#include <kconfig.h> 29#include <kconfig.h>
30 30
31#include <ksharedptr.h> 31#include <ksharedptr.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kapplication.h> 33#include <kapplication.h>
34#include <klocale.h> 34#include <klocale.h>
35#include <kidmanager.h> 35#include <kidmanager.h>
36//US 36//US
37#include <kstandarddirs.h> 37#include <kstandarddirs.h>
38#include <libkcal/syncdefines.h> 38#include <libkcal/syncdefines.h>
39 39
40//US #include "resource.h" 40//US #include "resource.h"
41#include "addressee.h" 41#include "addressee.h"
42 42
43using namespace KABC; 43using namespace KABC;
44 44
45static bool matchBinaryPattern( int value, int pattern ); 45static bool matchBinaryPattern( int value, int pattern );
46static bool matchBinaryPatternA( int value, int pattern );
47static bool matchBinaryPatternP( int value, int pattern );
46 48
47struct Addressee::AddresseeData : public KShared 49struct Addressee::AddresseeData : public KShared
48{ 50{
49 QString uid; 51 QString uid;
50 QString name; 52 QString name;
51 QString formattedName; 53 QString formattedName;
52 QString familyName; 54 QString familyName;
53 QString givenName; 55 QString givenName;
54 QString additionalName; 56 QString additionalName;
55 QString prefix; 57 QString prefix;
56 QString suffix; 58 QString suffix;
57 QString nickName; 59 QString nickName;
58 QDateTime birthday; 60 QDateTime birthday;
59 QString mailer; 61 QString mailer;
60 TimeZone timeZone; 62 TimeZone timeZone;
61 Geo geo; 63 Geo geo;
62 QString title; 64 QString title;
63 QString role; 65 QString role;
64 QString organization; 66 QString organization;
65 QString note; 67 QString note;
66 QString productId; 68 QString productId;
67 QDateTime revision; 69 QDateTime revision;
68 QString sortString; 70 QString sortString;
69 QString externalUID; 71 QString externalUID;
70 QString originalExternalUID; 72 QString originalExternalUID;
71 KURL url; 73 KURL url;
72 Secrecy secrecy; 74 Secrecy secrecy;
73 Picture logo; 75 Picture logo;
74 Picture photo; 76 Picture photo;
75 Sound sound; 77 Sound sound;
76 Agent agent; 78 Agent agent;
77 QString mExternalId; 79 QString mExternalId;
@@ -352,78 +354,78 @@ QString Addressee::getCsum( const QString & prof)
352{ 354{
353 return KIdManager::getCsum ( mData->mExternalId, prof ); 355 return KIdManager::getCsum ( mData->mExternalId, prof );
354} 356}
355 357
356void Addressee::setIDStr( const QString & s ) 358void Addressee::setIDStr( const QString & s )
357{ 359{
358 detach(); 360 detach();
359 mData->mExternalId = s; 361 mData->mExternalId = s;
360} 362}
361 363
362QString Addressee::IDStr() const 364QString Addressee::IDStr() const
363{ 365{
364 return mData->mExternalId; 366 return mData->mExternalId;
365} 367}
366 368
367void Addressee::setExternalUID( const QString &id ) 369void Addressee::setExternalUID( const QString &id )
368{ 370{
369 if ( id == mData->externalUID ) return; 371 if ( id == mData->externalUID ) return;
370 detach(); 372 detach();
371 mData->empty = false; 373 mData->empty = false;
372 mData->externalUID = id; 374 mData->externalUID = id;
373} 375}
374 376
375QString Addressee::externalUID() const 377QString Addressee::externalUID() const
376{ 378{
377 return mData->externalUID; 379 return mData->externalUID;
378} 380}
379void Addressee::setOriginalExternalUID( const QString &id ) 381void Addressee::setOriginalExternalUID( const QString &id )
380{ 382{
381 if ( id == mData->originalExternalUID ) return; 383 if ( id == mData->originalExternalUID ) return;
382 detach(); 384 detach();
383 mData->empty = false; 385 mData->empty = false;
384 qDebug("*******Set orig uid %s ", id.latin1()); 386 //qDebug("*******Set orig uid %s ", id.latin1());
385 mData->originalExternalUID = id; 387 mData->originalExternalUID = id;
386} 388}
387 389
388QString Addressee::originalExternalUID() const 390QString Addressee::originalExternalUID() const
389{ 391{
390 return mData->originalExternalUID; 392 return mData->originalExternalUID;
391} 393}
392 394
393void Addressee::setUid( const QString &id ) 395void Addressee::setUid( const QString &id )
394{ 396{
395 if ( id == mData->uid ) return; 397 if ( id == mData->uid ) return;
396 detach(); 398 detach();
397 qDebug("****setuid %s ", id.latin1()); 399 //qDebug("****setuid %s ", id.latin1());
398 mData->empty = false; 400 mData->empty = false;
399 mData->uid = id; 401 mData->uid = id;
400} 402}
401 403
402QString Addressee::uid() const 404QString Addressee::uid() const
403{ 405{
404 if ( mData->uid.isEmpty() ) 406 if ( mData->uid.isEmpty() )
405 mData->uid = KApplication::randomString( 10 ); 407 mData->uid = KApplication::randomString( 10 );
406 408
407 return mData->uid; 409 return mData->uid;
408} 410}
409 411
410QString Addressee::uidLabel() 412QString Addressee::uidLabel()
411{ 413{
412 return i18n("Unique Identifier"); 414 return i18n("Unique Identifier");
413} 415}
414 416
415void Addressee::setName( const QString &name ) 417void Addressee::setName( const QString &name )
416{ 418{
417 if ( name == mData->name ) return; 419 if ( name == mData->name ) return;
418 detach(); 420 detach();
419 mData->empty = false; 421 mData->empty = false;
420 mData->name = name; 422 mData->name = name;
421} 423}
422 424
423QString Addressee::name() const 425QString Addressee::name() const
424{ 426{
425 return mData->name; 427 return mData->name;
426} 428}
427 429
428QString Addressee::nameLabel() 430QString Addressee::nameLabel()
429{ 431{
@@ -1261,65 +1263,65 @@ void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1261{ 1263{
1262 detach(); 1264 detach();
1263 mData->empty = false; 1265 mData->empty = false;
1264 1266
1265 PhoneNumber::List::Iterator it; 1267 PhoneNumber::List::Iterator it;
1266 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1268 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1267 if ( (*it).id() == phoneNumber.id() ) { 1269 if ( (*it).id() == phoneNumber.id() ) {
1268 *it = phoneNumber; 1270 *it = phoneNumber;
1269 return; 1271 return;
1270 } 1272 }
1271 } 1273 }
1272 mData->phoneNumbers.append( phoneNumber ); 1274 mData->phoneNumbers.append( phoneNumber );
1273} 1275}
1274 1276
1275void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1277void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1276{ 1278{
1277 detach(); 1279 detach();
1278 1280
1279 PhoneNumber::List::Iterator it; 1281 PhoneNumber::List::Iterator it;
1280 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1282 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1281 if ( (*it).id() == phoneNumber.id() ) { 1283 if ( (*it).id() == phoneNumber.id() ) {
1282 mData->phoneNumbers.remove( it ); 1284 mData->phoneNumbers.remove( it );
1283 return; 1285 return;
1284 } 1286 }
1285 } 1287 }
1286} 1288}
1287 1289
1288PhoneNumber Addressee::phoneNumber( int type ) const 1290PhoneNumber Addressee::phoneNumber( int type ) const
1289{ 1291{
1290 PhoneNumber phoneNumber( "", type ); 1292 PhoneNumber phoneNumber( "", type );
1291 PhoneNumber::List::ConstIterator it; 1293 PhoneNumber::List::ConstIterator it;
1292 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1294 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1293 if ( matchBinaryPattern( (*it).type(), type ) ) { 1295 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1294 if ( (*it).type() & PhoneNumber::Pref ) 1296 if ( (*it).type() & PhoneNumber::Pref )
1295 return (*it); 1297 return (*it);
1296 else if ( phoneNumber.number().isEmpty() ) 1298 else if ( phoneNumber.number().isEmpty() )
1297 phoneNumber = (*it); 1299 phoneNumber = (*it);
1298 } 1300 }
1299 } 1301 }
1300 1302
1301 return phoneNumber; 1303 return phoneNumber;
1302} 1304}
1303 1305
1304PhoneNumber::List Addressee::phoneNumbers() const 1306PhoneNumber::List Addressee::phoneNumbers() const
1305{ 1307{
1306 return mData->phoneNumbers; 1308 return mData->phoneNumbers;
1307} 1309}
1308 1310
1309PhoneNumber::List Addressee::phoneNumbers( int type ) const 1311PhoneNumber::List Addressee::phoneNumbers( int type ) const
1310{ 1312{
1311 PhoneNumber::List list; 1313 PhoneNumber::List list;
1312 1314
1313 PhoneNumber::List::ConstIterator it; 1315 PhoneNumber::List::ConstIterator it;
1314 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1316 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1315 if ( matchBinaryPattern( (*it).type(), type ) ) { 1317 if ( matchBinaryPattern( (*it).type(), type ) ) {
1316 list.append( *it ); 1318 list.append( *it );
1317 } 1319 }
1318 } 1320 }
1319 return list; 1321 return list;
1320} 1322}
1321 1323
1322PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1324PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1323{ 1325{
1324 PhoneNumber::List::ConstIterator it; 1326 PhoneNumber::List::ConstIterator it;
1325 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1327 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
@@ -1498,65 +1500,65 @@ void Addressee::insertAddress( const Address &address )
1498{ 1500{
1499 detach(); 1501 detach();
1500 mData->empty = false; 1502 mData->empty = false;
1501 1503
1502 Address::List::Iterator it; 1504 Address::List::Iterator it;
1503 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1505 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1504 if ( (*it).id() == address.id() ) { 1506 if ( (*it).id() == address.id() ) {
1505 *it = address; 1507 *it = address;
1506 return; 1508 return;
1507 } 1509 }
1508 } 1510 }
1509 mData->addresses.append( address ); 1511 mData->addresses.append( address );
1510} 1512}
1511 1513
1512void Addressee::removeAddress( const Address &address ) 1514void Addressee::removeAddress( const Address &address )
1513{ 1515{
1514 detach(); 1516 detach();
1515 1517
1516 Address::List::Iterator it; 1518 Address::List::Iterator it;
1517 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1519 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1518 if ( (*it).id() == address.id() ) { 1520 if ( (*it).id() == address.id() ) {
1519 mData->addresses.remove( it ); 1521 mData->addresses.remove( it );
1520 return; 1522 return;
1521 } 1523 }
1522 } 1524 }
1523} 1525}
1524 1526
1525Address Addressee::address( int type ) const 1527Address Addressee::address( int type ) const
1526{ 1528{
1527 Address address( type ); 1529 Address address( type );
1528 Address::List::ConstIterator it; 1530 Address::List::ConstIterator it;
1529 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1531 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1530 if ( matchBinaryPattern( (*it).type(), type ) ) { 1532 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1531 if ( (*it).type() & Address::Pref ) 1533 if ( (*it).type() & Address::Pref )
1532 return (*it); 1534 return (*it);
1533 else if ( address.isEmpty() ) 1535 else if ( address.isEmpty() )
1534 address = (*it); 1536 address = (*it);
1535 } 1537 }
1536 } 1538 }
1537 1539
1538 return address; 1540 return address;
1539} 1541}
1540 1542
1541Address::List Addressee::addresses() const 1543Address::List Addressee::addresses() const
1542{ 1544{
1543 return mData->addresses; 1545 return mData->addresses;
1544} 1546}
1545 1547
1546Address::List Addressee::addresses( int type ) const 1548Address::List Addressee::addresses( int type ) const
1547{ 1549{
1548 Address::List list; 1550 Address::List list;
1549 1551
1550 Address::List::ConstIterator it; 1552 Address::List::ConstIterator it;
1551 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1553 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1552 if ( matchBinaryPattern( (*it).type(), type ) ) { 1554 if ( matchBinaryPattern( (*it).type(), type ) ) {
1553 list.append( *it ); 1555 list.append( *it );
1554 } 1556 }
1555 } 1557 }
1556 1558
1557 return list; 1559 return list;
1558} 1560}
1559 1561
1560Address Addressee::findAddress( const QString &id ) const 1562Address Addressee::findAddress( const QString &id ) const
1561{ 1563{
1562 Address::List::ConstIterator it; 1564 Address::List::ConstIterator it;
@@ -1806,46 +1808,62 @@ QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
1806 s >> a.mData->additionalName; 1808 s >> a.mData->additionalName;
1807 s >> a.mData->prefix; 1809 s >> a.mData->prefix;
1808 s >> a.mData->suffix; 1810 s >> a.mData->suffix;
1809 s >> a.mData->nickName; 1811 s >> a.mData->nickName;
1810 s >> a.mData->birthday; 1812 s >> a.mData->birthday;
1811 s >> a.mData->mailer; 1813 s >> a.mData->mailer;
1812 s >> a.mData->timeZone; 1814 s >> a.mData->timeZone;
1813 s >> a.mData->geo; 1815 s >> a.mData->geo;
1814 s >> a.mData->title; 1816 s >> a.mData->title;
1815 s >> a.mData->role; 1817 s >> a.mData->role;
1816 s >> a.mData->organization; 1818 s >> a.mData->organization;
1817 s >> a.mData->note; 1819 s >> a.mData->note;
1818 s >> a.mData->productId; 1820 s >> a.mData->productId;
1819 s >> a.mData->revision; 1821 s >> a.mData->revision;
1820 s >> a.mData->sortString; 1822 s >> a.mData->sortString;
1821 s >> a.mData->url; 1823 s >> a.mData->url;
1822 s >> a.mData->secrecy; 1824 s >> a.mData->secrecy;
1823 s >> a.mData->logo; 1825 s >> a.mData->logo;
1824 s >> a.mData->photo; 1826 s >> a.mData->photo;
1825 s >> a.mData->sound; 1827 s >> a.mData->sound;
1826 s >> a.mData->agent; 1828 s >> a.mData->agent;
1827 s >> a.mData->phoneNumbers; 1829 s >> a.mData->phoneNumbers;
1828 s >> a.mData->addresses; 1830 s >> a.mData->addresses;
1829 s >> a.mData->emails; 1831 s >> a.mData->emails;
1830 s >> a.mData->categories; 1832 s >> a.mData->categories;
1831 s >> a.mData->custom; 1833 s >> a.mData->custom;
1832 s >> a.mData->keys; 1834 s >> a.mData->keys;
1833 1835
1834 a.mData->empty = false; 1836 a.mData->empty = false;
1835 1837
1836 return s; 1838 return s;
1837} 1839}
1838
1839bool matchBinaryPattern( int value, int pattern ) 1840bool matchBinaryPattern( int value, int pattern )
1840{ 1841{
1841 /** 1842 /**
1842 We want to match all telephonnumbers/addresses which have the bits in the 1843 We want to match all telephonnumbers/addresses which have the bits in the
1843 pattern set. More are allowed. 1844 pattern set. More are allowed.
1844 if pattern == 0 we have a special handling, then we want only those with 1845 if pattern == 0 we have a special handling, then we want only those with
1845 exactly no bit set. 1846 exactly no bit set.
1846 */ 1847 */
1847 if ( pattern == 0 ) 1848 if ( pattern == 0 )
1848 return ( value == 0 ); 1849 return ( value == 0 );
1849 else 1850 else
1850 return ( pattern == ( pattern & value ) ); 1851 return ( pattern == ( pattern & value ) );
1851} 1852}
1853
1854bool matchBinaryPatternP( int value, int pattern )
1855{
1856
1857 if ( pattern == 0 )
1858 return ( value == 0 );
1859 else
1860 return ( (pattern |PhoneNumber::Pref ) == ( value |PhoneNumber::Pref ) );
1861}
1862bool matchBinaryPatternA( int value, int pattern )
1863{
1864
1865 if ( pattern == 0 )
1866 return ( value == 0 );
1867 else
1868 return ( (pattern | Address::Pref) == ( value | Address::Pref ) );
1869}