• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeabc
 

tdeabc

  • tdeabc
  • scripts
addressee.src.cpp
1/*
2 This file is part of libtdeabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 Copyright (c) 2003 Carsten Pfeiffer <pfeiffer@kde.org>
5 Copyright (c) 2005 Ingo Kloecker <kloecker@kde.org>
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21*/
22
23#include <tqregexp.h>
24
25#include <ksharedptr.h>
26#include <kdebug.h>
27#include <tdeapplication.h>
28#include <tdelocale.h>
29
30#include "addresseehelper.h"
31#include "field.h"
32#include "resource.h"
33#include "sortmode.h"
34
35#include "addressee.h"
36
37using namespace TDEABC;
38
39static bool matchBinaryPattern( int value, int pattern );
40
41template <class L>
42static bool listEquals( const TQValueList<L>&, const TQValueList<L>& );
43static bool emailsEquals( const TQStringList&, const TQStringList& );
44
45TDEABC::SortMode *Addressee::mSortMode = 0;
46
47struct Addressee::AddresseeData : public TDEShared
48{
49 TQString uid;
50 TQString uri;
51 --VARIABLES--
52
53 PhoneNumber::List phoneNumbers;
54 Address::List addresses;
55 Key::List keys;
56 TQStringList emails;
57 TQStringList categories;
58 TQStringList custom;
59
60 Resource *resource;
61
62 bool empty :1;
63 bool changed :1;
64};
65
66Addressee::AddresseeData* Addressee::shared_null = 0;
67
68Addressee::AddresseeData* Addressee::makeSharedNull()
69{
70 Addressee::shared_null = new AddresseeData;
71 shared_null->_TDEShared_ref(); //just in case (we should add KSD)
72 shared_null->empty = true;
73 shared_null->changed = false;
74 shared_null->resource = 0;
75 return shared_null;
76}
77
78Addressee::Addressee()
79{
80 mData = shared_null ? shared_null : makeSharedNull();
81}
82
83Addressee::~Addressee()
84{
85}
86
87Addressee::Addressee( const Addressee &a )
88{
89 mData = a.mData;
90}
91
92Addressee &Addressee::operator=( const Addressee &a )
93{
94 if ( this == &a )
95 return (*this);
96
97 mData = a.mData;
98 return (*this);
99}
100
101void Addressee::detach()
102{
103 if ( mData.data() == shared_null ) {
104 mData = new AddresseeData;
105 mData->empty = true;
106 mData->changed = false;
107 mData->resource = 0;
108 mData->uid = TDEApplication::randomString( 10 );
109 return;
110 } else if ( mData.count() == 1 ) return;
111
112 AddresseeData data = *mData;
113 mData = new AddresseeData( data );
114}
115
116bool Addressee::operator==( const Addressee &a ) const
117{
118 if ( uid() != a.uid() ) {
119 kdDebug(5700) << "uid differs" << endl;
120 return false;
121 }
122 --EQUALSTEST--
123 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
124 ( mData->url != a.mData->url ) ) {
125 kdDebug(5700) << "url differs" << endl;
126 return false;
127 }
128 if ( !listEquals( mData->phoneNumbers, a.mData->phoneNumbers ) ) {
129 kdDebug(5700) << "phoneNumbers differs" << endl;
130 return false;
131 }
132 if ( !listEquals( mData->addresses, a.mData->addresses ) ) {
133 kdDebug(5700) << "addresses differs" << endl;
134 return false;
135 }
136 if ( !listEquals( mData->keys, a.mData->keys ) ) {
137 kdDebug(5700) << "keys differs" << endl;
138 return false;
139 }
140 if ( !emailsEquals( mData->emails, a.mData->emails ) ) {
141 kdDebug(5700) << "emails differs" << endl;
142 return false;
143 }
144 if ( !listEquals( mData->categories, a.mData->categories ) ) {
145 kdDebug(5700) << "categories differs" << endl;
146 return false;
147 }
148 if ( !listEquals( mData->custom, a.mData->custom ) ) {
149 kdDebug(5700) << "custom differs" << endl;
150 return false;
151 }
152
153 return true;
154}
155
156bool Addressee::operator!=( const Addressee &a ) const
157{
158 return !( a == *this );
159}
160
161bool Addressee::isEmpty() const
162{
163 return mData->empty;
164}
165
166void Addressee::setUid( const TQString &id )
167{
168 if ( id == mData->uid ) return;
169 detach();
170 mData->empty = false;
171 mData->uid = id;
172}
173
174TQString Addressee::uid() const
175{
176 return mData->uid;
177}
178
179TQString Addressee::uidLabel()
180{
181 return i18n("Unique Identifier");
182}
183
184void Addressee::setUri( const TQString &id )
185{
186 if ( id == mData->uri ) return;
187 detach();
188 mData->empty = false;
189 mData->uri = id;
190}
191
192TQString Addressee::uri() const
193{
194 return mData->uri;
195}
196
197TQString Addressee::uriLabel()
198{
199 return i18n("Unique Resource Identifier");
200}
201
202--DEFINITIONS--
203
204void Addressee::setNameFromString( const TQString &s )
205{
206 TQString str = s;
207 //remove enclosing quotes from string
208 if ( str.length() > 1 && s[ 0 ] == '"' && s[ s.length() - 1 ] == '"' )
209 str = s.mid( 1, s.length() - 2 );
210
211 setFormattedName( str );
212 setName( str );
213
214 // clear all name parts
215 setPrefix( TQString() );
216 setGivenName( TQString() );
217 setAdditionalName( TQString() );
218 setFamilyName( TQString() );
219 setSuffix( TQString() );
220
221 if ( str.isEmpty() )
222 return;
223
224 TQString spaceStr = " ";
225 TQString emptyStr = "";
226 AddresseeHelper *helper = AddresseeHelper::self();
227
228 int i = str.find( ',' );
229 if( i < 0 ) {
230 TQStringList parts = TQStringList::split( spaceStr, str );
231 int leftOffset = 0;
232 int rightOffset = parts.count() - 1;
233
234 TQString suffix;
235 while ( rightOffset >= 0 ) {
236 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
237 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
238 rightOffset--;
239 } else
240 break;
241 }
242 setSuffix( suffix );
243
244 if ( rightOffset < 0 )
245 return;
246
247 TQStringList inclusionList;
248 for ( int n = 1; (rightOffset - n >= 0) && (n < 4); ++n ) {
249 if ( helper->containsPrefix( parts[ rightOffset - n ].lower() ) ) {
250 inclusionList.prepend( parts[ rightOffset - n ] );
251 } else
252 break;
253 }
254
255 if ( !inclusionList.isEmpty() ) {
256 setFamilyName( inclusionList.join( " " ) + spaceStr + parts[ rightOffset ] );
257 rightOffset -= inclusionList.count();
258 } else {
259 if ( helper->tradeAsFamilyName() )
260 setFamilyName( parts[ rightOffset ] );
261 else
262 setGivenName( parts[ rightOffset ] );
263 }
264
265 TQString prefix;
266 while ( leftOffset < rightOffset ) {
267 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
268 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
269 leftOffset++;
270 } else
271 break;
272 }
273 setPrefix( prefix );
274
275 if ( leftOffset < rightOffset ) {
276 setGivenName( parts[ leftOffset ] );
277 leftOffset++;
278 }
279
280 TQString additionalName;
281 while ( leftOffset < rightOffset ) {
282 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
283 leftOffset++;
284 }
285 setAdditionalName( additionalName );
286 } else {
287 TQString part1 = str.left( i );
288 TQString part2 = str.mid( i + 1 );
289
290 TQStringList parts = TQStringList::split( spaceStr, part1 );
291 int leftOffset = 0;
292 int rightOffset = parts.count() - 1;
293
294 if ( parts.count() > 0 ) {
295
296 TQString suffix;
297 while ( rightOffset >= 0 ) {
298 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
299 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
300 rightOffset--;
301 } else
302 break;
303 }
304 setSuffix( suffix );
305
306 if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
307 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
308 rightOffset--;
309 } else
310 setFamilyName( parts[ rightOffset ] );
311
312 TQString prefix;
313 while ( leftOffset < rightOffset ) {
314 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
315 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
316 leftOffset++;
317 } else
318 break;
319 }
320 } else {
321 setPrefix( "" );
322 setFamilyName( "" );
323 setSuffix( "" );
324 }
325
326 parts = TQStringList::split( spaceStr, part2 );
327
328 leftOffset = 0;
329 rightOffset = parts.count();
330
331 if ( parts.count() > 0 ) {
332
333 TQString prefix;
334 while ( leftOffset < rightOffset ) {
335 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
336 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
337 leftOffset++;
338 } else
339 break;
340 }
341 setPrefix( prefix );
342
343 if ( leftOffset < rightOffset ) {
344 setGivenName( parts[ leftOffset ] );
345 leftOffset++;
346 }
347
348 TQString additionalName;
349 while ( leftOffset < rightOffset ) {
350 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
351 leftOffset++;
352 }
353 setAdditionalName( additionalName );
354 } else {
355 setGivenName( "" );
356 setAdditionalName( "" );
357 }
358 }
359}
360
361TQString Addressee::realName() const
362{
363 TQString n( formattedName() );
364 if ( !n.isEmpty() )
365 return n;
366
367 n = assembledName();
368 if ( !n.isEmpty() )
369 return n;
370
371 n = name();
372 if ( !n.isEmpty() )
373 return n;
374
375 return organization();
376}
377
378TQString Addressee::assembledName() const
379{
380 TQString name = prefix() + " " + givenName() + " " + additionalName() + " " +
381 familyName() + " " + suffix();
382
383 return name.simplifyWhiteSpace();
384}
385
386TQString Addressee::fullEmail( const TQString &email ) const
387{
388 TQString e;
389 if ( email.isNull() ) {
390 e = preferredEmail();
391 } else {
392 e = email;
393 }
394 if ( e.isEmpty() ) return TQString();
395
396 TQString text;
397 if ( realName().isEmpty() )
398 text = e;
399 else {
400 TQRegExp needQuotes( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
401 if ( realName().find( needQuotes ) != -1 ) {
402 TQString name = realName();
403 name.replace( "\"", "\\\"" );
404 text = "\"" + name + "\" <" + e + ">";
405 } else
406 text = realName() + " <" + e + ">";
407 }
408
409 return text;
410}
411
412void Addressee::insertEmail( const TQString &email, bool preferred )
413{
414 if ( email.simplifyWhiteSpace().isEmpty() )
415 return;
416
417 detach();
418 mData->empty = false;
419
420 TQStringList::Iterator it = mData->emails.find( email );
421
422 if ( it != mData->emails.end() ) {
423 if ( !preferred || it == mData->emails.begin() ) return;
424 mData->emails.remove( it );
425 mData->emails.prepend( email );
426 } else {
427 if ( preferred ) {
428 mData->emails.prepend( email );
429 } else {
430 mData->emails.append( email );
431 }
432 }
433}
434
435void Addressee::removeEmail( const TQString &email )
436{
437 detach();
438
439 TQStringList::Iterator it = mData->emails.find( email );
440 if ( it == mData->emails.end() ) return;
441
442 mData->emails.remove( it );
443}
444
445TQString Addressee::preferredEmail() const
446{
447 if ( mData->emails.count() == 0 ) return TQString();
448 else return mData->emails.first();
449}
450
451TQStringList Addressee::emails() const
452{
453 return mData->emails;
454}
455void Addressee::setEmails( const TQStringList& emails ) {
456 detach();
457
458 mData->emails = emails;
459}
460void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
461{
462 detach();
463 mData->empty = false;
464
465 PhoneNumber::List::Iterator it;
466 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
467 if ( (*it).id() == phoneNumber.id() ) {
468 *it = phoneNumber;
469 return;
470 }
471 }
472 if ( !phoneNumber.number().simplifyWhiteSpace().isEmpty() )
473 mData->phoneNumbers.append( phoneNumber );
474}
475
476void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
477{
478 detach();
479
480 PhoneNumber::List::Iterator it;
481 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
482 if ( (*it).id() == phoneNumber.id() ) {
483 mData->phoneNumbers.remove( it );
484 return;
485 }
486 }
487}
488
489PhoneNumber Addressee::phoneNumber( int type ) const
490{
491 PhoneNumber phoneNumber( "", type );
492 PhoneNumber::List::ConstIterator it;
493 for( it = mData->phoneNumbers.constBegin(); it != mData->phoneNumbers.constEnd(); ++it ) {
494 if ( matchBinaryPattern( (*it).type(), type ) ) {
495 if ( (*it).type() & PhoneNumber::Pref )
496 return (*it);
497 else if ( phoneNumber.number().isEmpty() )
498 phoneNumber = (*it);
499 }
500 }
501
502 return phoneNumber;
503}
504
505PhoneNumber::List Addressee::phoneNumbers() const
506{
507 return mData->phoneNumbers;
508}
509
510PhoneNumber::List Addressee::phoneNumbers( int type ) const
511{
512 PhoneNumber::List list;
513
514 PhoneNumber::List::ConstIterator it;
515 for( it = mData->phoneNumbers.constBegin(); it != mData->phoneNumbers.constEnd(); ++it ) {
516 if ( matchBinaryPattern( (*it).type(), type ) ) {
517 list.append( *it );
518 }
519 }
520 return list;
521}
522
523PhoneNumber Addressee::findPhoneNumber( const TQString &id ) const
524{
525 PhoneNumber::List::ConstIterator it;
526 for( it = mData->phoneNumbers.constBegin(); it != mData->phoneNumbers.constEnd(); ++it ) {
527 if ( (*it).id() == id ) {
528 return *it;
529 }
530 }
531 return PhoneNumber();
532}
533
534void Addressee::insertKey( const Key &key )
535{
536 detach();
537 mData->empty = false;
538
539 Key::List::Iterator it;
540 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
541 if ( (*it).id() == key.id() ) {
542 *it = key;
543 return;
544 }
545 }
546 mData->keys.append( key );
547}
548
549void Addressee::removeKey( const Key &key )
550{
551 detach();
552
553 Key::List::Iterator it;
554 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
555 if ( (*it).id() == key.id() ) {
556 mData->keys.remove( key );
557 return;
558 }
559 }
560}
561
562Key Addressee::key( int type, TQString customTypeString ) const
563{
564 Key::List::ConstIterator it;
565 for( it = mData->keys.constBegin(); it != mData->keys.constEnd(); ++it ) {
566 if ( (*it).type() == type ) {
567 if ( type == Key::Custom ) {
568 if ( customTypeString.isEmpty() ) {
569 return *it;
570 } else {
571 if ( (*it).customTypeString() == customTypeString )
572 return (*it);
573 }
574 } else {
575 return *it;
576 }
577 }
578 }
579 return Key( TQString(), type );
580}
581
582void Addressee::setKeys( const Key::List& list )
583{
584 detach();
585 mData->keys = list;
586}
587
588Key::List Addressee::keys() const
589{
590 return mData->keys;
591}
592
593Key::List Addressee::keys( int type, TQString customTypeString ) const
594{
595 Key::List list;
596
597 Key::List::ConstIterator it;
598 for( it = mData->keys.constBegin(); it != mData->keys.constEnd(); ++it ) {
599 if ( (*it).type() == type ) {
600 if ( type == Key::Custom ) {
601 if ( customTypeString.isEmpty() ) {
602 list.append( *it );
603 } else {
604 if ( (*it).customTypeString() == customTypeString )
605 list.append( *it );
606 }
607 } else {
608 list.append( *it );
609 }
610 }
611 }
612 return list;
613}
614
615Key Addressee::findKey( const TQString &id ) const
616{
617 Key::List::ConstIterator it;
618 for( it = mData->keys.constBegin(); it != mData->keys.constEnd(); ++it ) {
619 if ( (*it).id() == id ) {
620 return *it;
621 }
622 }
623 return Key();
624}
625
626TQString Addressee::asString() const
627{
628 return "Smith, agent Smith...";
629}
630
631void Addressee::dump() const
632{
633 kdDebug(5700) << "Addressee {" << endl;
634
635 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
636
637 --DEBUG--
638
639 kdDebug(5700) << " Emails {" << endl;
640 const TQStringList e = emails();
641 TQStringList::ConstIterator it;
642 for( it = e.begin(); it != e.end(); ++it ) {
643 kdDebug(5700) << " " << (*it) << endl;
644 }
645 kdDebug(5700) << " }" << endl;
646
647 kdDebug(5700) << " PhoneNumbers {" << endl;
648 const PhoneNumber::List p = phoneNumbers();
649 PhoneNumber::List::ConstIterator it2;
650 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
651 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
652 }
653 kdDebug(5700) << " }" << endl;
654
655 const Address::List a = addresses();
656 Address::List::ConstIterator it3;
657 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
658 (*it3).dump();
659 }
660
661 kdDebug(5700) << " Keys {" << endl;
662 const Key::List k = keys();
663 Key::List::ConstIterator it4;
664 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
665 kdDebug(5700) << " Type: " << int((*it4).type()) <<
666 " Key: " << (*it4).textData() <<
667 " CustomString: " << (*it4).customTypeString() << endl;
668 }
669 kdDebug(5700) << " }" << endl;
670
671 kdDebug(5700) << "}" << endl;
672}
673
674
675void Addressee::insertAddress( const Address &address )
676{
677 if ( address.isEmpty() )
678 return;
679
680 detach();
681 mData->empty = false;
682
683 Address::List::Iterator it;
684 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
685 if ( (*it).id() == address.id() ) {
686 *it = address;
687 return;
688 }
689 }
690
691 mData->addresses.append( address );
692}
693
694void Addressee::removeAddress( const Address &address )
695{
696 detach();
697
698 Address::List::Iterator it;
699 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
700 if ( (*it).id() == address.id() ) {
701 mData->addresses.remove( it );
702 return;
703 }
704 }
705}
706
707Address Addressee::address( int type ) const
708{
709 Address address( type );
710 Address::List::ConstIterator it;
711 for( it = mData->addresses.constBegin(); it != mData->addresses.constEnd(); ++it ) {
712 if ( matchBinaryPattern( (*it).type(), type ) ) {
713 if ( (*it).type() & Address::Pref )
714 return (*it);
715 else if ( address.isEmpty() )
716 address = (*it);
717 }
718 }
719
720 return address;
721}
722
723Address::List Addressee::addresses() const
724{
725 return mData->addresses;
726}
727
728Address::List Addressee::addresses( int type ) const
729{
730 Address::List list;
731
732 Address::List::ConstIterator it;
733 for( it = mData->addresses.constBegin(); it != mData->addresses.constEnd(); ++it ) {
734 if ( matchBinaryPattern( (*it).type(), type ) ) {
735 list.append( *it );
736 }
737 }
738
739 return list;
740}
741
742Address Addressee::findAddress( const TQString &id ) const
743{
744 Address::List::ConstIterator it;
745 for( it = mData->addresses.constBegin(); it != mData->addresses.constEnd(); ++it ) {
746 if ( (*it).id() == id ) {
747 return *it;
748 }
749 }
750 return Address();
751}
752
753void Addressee::insertCategory( const TQString &c )
754{
755 detach();
756 mData->empty = false;
757
758 if ( mData->categories.findIndex( c ) != -1 ) return;
759
760 mData->categories.append( c );
761}
762
763void Addressee::removeCategory( const TQString &c )
764{
765 detach();
766
767 TQStringList::Iterator it = mData->categories.find( c );
768 if ( it == mData->categories.end() ) return;
769
770 mData->categories.remove( it );
771}
772
773bool Addressee::hasCategory( const TQString &c ) const
774{
775 return ( mData->categories.findIndex( c ) != -1 );
776}
777
778void Addressee::setCategories( const TQStringList &c )
779{
780 detach();
781 mData->empty = false;
782
783 mData->categories = c;
784}
785
786TQStringList Addressee::categories() const
787{
788 return mData->categories;
789}
790
791void Addressee::insertCustom( const TQString &app, const TQString &name,
792 const TQString &value )
793{
794 if ( value.isEmpty() || name.isEmpty() || app.isEmpty() ) return;
795
796 detach();
797 mData->empty = false;
798
799 TQString qualifiedName = app + "-" + name + ":";
800
801 TQStringList::Iterator it;
802 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
803 if ( (*it).startsWith( qualifiedName ) ) {
804 (*it) = qualifiedName + value;
805 return;
806 }
807 }
808
809 mData->custom.append( qualifiedName + value );
810}
811
812void Addressee::removeCustom( const TQString &app, const TQString &name)
813{
814 detach();
815
816 TQString qualifiedName = app + "-" + name + ":";
817
818 TQStringList::Iterator it;
819 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
820 if ( (*it).startsWith( qualifiedName ) ) {
821 mData->custom.remove( it );
822 return;
823 }
824 }
825}
826
827TQString Addressee::custom( const TQString &app, const TQString &name ) const
828{
829 TQString qualifiedName = app + "-" + name + ":";
830 TQString value;
831
832 TQStringList::ConstIterator it;
833 for( it = mData->custom.constBegin(); it != mData->custom.constEnd(); ++it ) {
834 if ( (*it).startsWith( qualifiedName ) ) {
835 value = (*it).mid( (*it).find( ":" ) + 1 );
836 break;
837 }
838 }
839
840 return value;
841}
842
843void Addressee::setCustoms( const TQStringList &l )
844{
845 detach();
846 mData->empty = false;
847
848 mData->custom = l;
849}
850
851TQStringList Addressee::customs() const
852{
853 return mData->custom;
854}
855
856void Addressee::parseEmailAddress( const TQString &rawEmail, TQString &fullName,
857 TQString &email)
858{
859 // This is a simplified version of KPIM::splitAddress().
860
861 fullName = "";
862 email = "";
863 if ( rawEmail.isEmpty() )
864 return; // KPIM::AddressEmpty;
865
866 // The code works on 8-bit strings, so convert the input to UTF-8.
867 TQCString address = rawEmail.utf8();
868
869 TQCString displayName;
870 TQCString addrSpec;
871 TQCString comment;
872
873 // The following is a primitive parser for a mailbox-list (cf. RFC 2822).
874 // The purpose is to extract a displayable string from the mailboxes.
875 // Comments in the addr-spec are not handled. No error checking is done.
876
877 enum { TopLevel, InComment, InAngleAddress } context = TopLevel;
878 bool inQuotedString = false;
879 int commentLevel = 0;
880 bool stop = false;
881
882 for ( char* p = address.data(); *p && !stop; ++p ) {
883 switch ( context ) {
884 case TopLevel : {
885 switch ( *p ) {
886 case '"' : inQuotedString = !inQuotedString;
887 displayName += *p;
888 break;
889 case '(' : if ( !inQuotedString ) {
890 context = InComment;
891 commentLevel = 1;
892 }
893 else
894 displayName += *p;
895 break;
896 case '<' : if ( !inQuotedString ) {
897 context = InAngleAddress;
898 }
899 else
900 displayName += *p;
901 break;
902 case '\\' : // quoted character
903 displayName += *p;
904 ++p; // skip the '\'
905 if ( *p )
906 displayName += *p;
907 else
908 //return KPIM::UnexpectedEnd;
909 goto ABORT_PARSING;
910 break;
911 case ',' : if ( !inQuotedString ) {
912 //if ( allowMultipleAddresses )
913 // stop = true;
914 //else
915 // return KPIM::UnexpectedComma;
916 goto ABORT_PARSING;
917 }
918 else
919 displayName += *p;
920 break;
921 default : displayName += *p;
922 }
923 break;
924 }
925 case InComment : {
926 switch ( *p ) {
927 case '(' : ++commentLevel;
928 comment += *p;
929 break;
930 case ')' : --commentLevel;
931 if ( commentLevel == 0 ) {
932 context = TopLevel;
933 comment += ' '; // separate the text of several comments
934 }
935 else
936 comment += *p;
937 break;
938 case '\\' : // quoted character
939 comment += *p;
940 ++p; // skip the '\'
941 if ( *p )
942 comment += *p;
943 else
944 //return KPIM::UnexpectedEnd;
945 goto ABORT_PARSING;
946 break;
947 default : comment += *p;
948 }
949 break;
950 }
951 case InAngleAddress : {
952 switch ( *p ) {
953 case '"' : inQuotedString = !inQuotedString;
954 addrSpec += *p;
955 break;
956 case '>' : if ( !inQuotedString ) {
957 context = TopLevel;
958 }
959 else
960 addrSpec += *p;
961 break;
962 case '\\' : // quoted character
963 addrSpec += *p;
964 ++p; // skip the '\'
965 if ( *p )
966 addrSpec += *p;
967 else
968 //return KPIM::UnexpectedEnd;
969 goto ABORT_PARSING;
970 break;
971 default : addrSpec += *p;
972 }
973 break;
974 }
975 } // switch ( context )
976 }
977
978ABORT_PARSING:
979 displayName = displayName.stripWhiteSpace();
980 comment = comment.stripWhiteSpace();
981 addrSpec = addrSpec.stripWhiteSpace();
982
983 fullName = TQString::fromUtf8( displayName );
984 email = TQString::fromUtf8( addrSpec );
985
986 // check for errors
987 if ( inQuotedString )
988 return; // KPIM::UnbalancedQuote;
989 if ( context == InComment )
990 return; // KPIM::UnbalancedParens;
991 if ( context == InAngleAddress )
992 return; // KPIM::UnclosedAngleAddr;
993
994 if ( addrSpec.isEmpty() ) {
995 if ( displayName.isEmpty() )
996 return; // KPIM::NoAddressSpec;
997 else {
998 //addrSpec = displayName;
999 //displayName.truncate( 0 );
1000 // Address of the form "foo@bar" or "foo@bar (Name)".
1001 email = fullName;
1002 fullName = TQString::fromUtf8( comment );
1003 }
1004 }
1005
1006 // Check that we do not have any extra characters on the end of the
1007 // strings
1008 unsigned int len = fullName.length();
1009 if ( fullName[ 0 ] == '"' && fullName[ len - 1 ] == '"' )
1010 fullName = fullName.mid( 1, len - 2 );
1011}
1012
1013void Addressee::setResource( Resource *resource )
1014{
1015 detach();
1016 mData->resource = resource;
1017}
1018
1019Resource *Addressee::resource() const
1020{
1021 return mData->resource;
1022}
1023
1024void Addressee::setChanged( bool value )
1025{
1026 detach();
1027 mData->changed = value;
1028}
1029
1030bool Addressee::changed() const
1031{
1032 return mData->changed;
1033}
1034
1035void Addressee::setSortMode( TDEABC::SortMode *mode )
1036{
1037 mSortMode = mode;
1038}
1039
1040bool Addressee::operator< ( const Addressee &addr )
1041{
1042 if ( !mSortMode )
1043 return false;
1044 else
1045 return mSortMode->lesser( *this, addr );
1046}
1047
1048TQDataStream &TDEABC::operator<<( TQDataStream &s, const Addressee &a )
1049{
1050 if (!a.mData) return s;
1051
1052 s << a.uid();
1053
1054 --STREAMOUT--
1055 s << a.mData->phoneNumbers;
1056 s << a.mData->addresses;
1057 s << a.mData->emails;
1058 s << a.mData->categories;
1059 s << a.mData->custom;
1060 s << a.mData->keys;
1061 return s;
1062}
1063
1064TQDataStream &TDEABC::operator>>( TQDataStream &s, Addressee &a )
1065{
1066 if (!a.mData)
1067 return s;
1068
1069 a.detach();
1070
1071 s >> a.mData->uid;
1072
1073 --STREAMIN--
1074 s >> a.mData->phoneNumbers;
1075 s >> a.mData->addresses;
1076 s >> a.mData->emails;
1077 s >> a.mData->categories;
1078 s >> a.mData->custom;
1079 s >> a.mData->keys;
1080
1081 a.mData->empty = false;
1082
1083 return s;
1084}
1085
1086bool matchBinaryPattern( int value, int pattern )
1087{
1094 if ( pattern == 0 )
1095 return ( value == 0 );
1096 else
1097 return ( pattern == ( pattern & value ) );
1098}
1099
1100template <class L>
1101bool listEquals( const TQValueList<L> &list, const TQValueList<L> &pattern )
1102{
1103 if ( list.count() != pattern.count() )
1104 return false;
1105
1106 for ( uint i = 0; i < list.count(); ++i )
1107 if ( pattern.find( list[ i ] ) == pattern.end() )
1108 return false;
1109
1110 return true;
1111}
1112
1113bool emailsEquals( const TQStringList &list, const TQStringList &pattern )
1114{
1115 if ( list.count() != pattern.count() )
1116 return false;
1117
1118 if ( list.first() != pattern.first() )
1119 return false;
1120
1121 TQStringList::ConstIterator it;
1122 for ( it = list.begin(); it != list.end(); ++it )
1123 if ( pattern.find( *it ) == pattern.end() )
1124 return false;
1125
1126 return true;
1127}
TDEABC::Address
Postal address information.
Definition: address.h:56
TDEABC::Address::isEmpty
bool isEmpty() const
Returns true, if the address is empty.
Definition: address.cpp:68
TDEABC::Address::List
TQValueList< Address > List
List of addresses.
Definition: address.h:64
TDEABC::Addressee
address book entry
Definition: addressee.src.h:75
TDEABC::Addressee::uidLabel
static TQString uidLabel()
Return translated label for uid field.
Definition: addressee.src.cpp:179
TDEABC::Addressee::removeCustom
void removeCustom(const TQString &app, const TQString &name)
Remove custom entry.
Definition: addressee.src.cpp:812
TDEABC::Addressee::removeKey
void removeKey(const Key &key)
Remove a key.
Definition: addressee.src.cpp:549
TDEABC::Addressee::setUid
void setUid(const TQString &uid)
Set unique identifier.
Definition: addressee.src.cpp:166
TDEABC::Addressee::removeEmail
void removeEmail(const TQString &email)
Remove email address.
Definition: addressee.src.cpp:435
TDEABC::Addressee::categories
TQStringList categories() const
Return list of all set categories.
Definition: addressee.src.cpp:786
TDEABC::Addressee::setCategories
void setCategories(const TQStringList &)
Set categories to given value.
Definition: addressee.src.cpp:778
TDEABC::Addressee::removePhoneNumber
void removePhoneNumber(const PhoneNumber &phoneNumber)
Remove phone number.
Definition: addressee.src.cpp:476
TDEABC::Addressee::setKeys
void setKeys(const Key::List &keys)
Set the list of keys.
Definition: addressee.src.cpp:582
TDEABC::Addressee::emails
TQStringList emails() const
Return list of all email addresses.
Definition: addressee.src.cpp:451
TDEABC::Addressee::insertPhoneNumber
void insertPhoneNumber(const PhoneNumber &phoneNumber)
Insert a phone number.
Definition: addressee.src.cpp:460
TDEABC::Addressee::insertCustom
void insertCustom(const TQString &app, const TQString &name, const TQString &value)
Insert custom entry.
Definition: addressee.src.cpp:791
TDEABC::Addressee::keys
Key::List keys() const
Return list of all keys.
Definition: addressee.src.cpp:588
TDEABC::Addressee::findAddress
Address findAddress(const TQString &id) const
Return address with the given id.
Definition: addressee.src.cpp:742
TDEABC::Addressee::setUri
void setUri(const TQString &uid)
Set unique resource identifier.
Definition: addressee.src.cpp:184
TDEABC::Addressee::removeAddress
void removeAddress(const Address &address)
Remove address.
Definition: addressee.src.cpp:694
TDEABC::Addressee::fullEmail
TQString fullEmail(const TQString &email=TQString::null) const
Return email address including real name.
Definition: addressee.src.cpp:386
TDEABC::Addressee::Addressee
Addressee()
Construct an empty address book entry.
Definition: addressee.src.cpp:78
TDEABC::Addressee::customs
TQStringList customs() const
Return list of all custom entries.
Definition: addressee.src.cpp:851
TDEABC::Addressee::uri
TQString uri() const
Return unique resource identifier.
Definition: addressee.src.cpp:192
TDEABC::Addressee::isEmpty
bool isEmpty() const
Return, if the address book entry is empty.
Definition: addressee.src.cpp:161
TDEABC::Addressee::removeCategory
void removeCategory(const TQString &)
Remove category.
Definition: addressee.src.cpp:763
TDEABC::Addressee::dump
void dump() const
Debug output.
Definition: addressee.src.cpp:631
TDEABC::Addressee::assembledName
TQString assembledName() const
Return the name that consists of all name parts.
Definition: addressee.src.cpp:378
TDEABC::Addressee::setChanged
void setChanged(bool value)
Mark addressee as changed.
Definition: addressee.src.cpp:1024
TDEABC::Addressee::setCustoms
void setCustoms(const TQStringList &)
Set all custom entries.
Definition: addressee.src.cpp:843
TDEABC::Addressee::realName
TQString realName() const
Return the name of the addressee.
Definition: addressee.src.cpp:361
TDEABC::Addressee::insertCategory
void insertCategory(const TQString &)
Insert category.
Definition: addressee.src.cpp:753
TDEABC::Addressee::hasCategory
bool hasCategory(const TQString &) const
Return, if addressee has the given category.
Definition: addressee.src.cpp:773
TDEABC::Addressee::address
Address address(int type) const
Return address, which matches the given type.
Definition: addressee.src.cpp:707
TDEABC::Addressee::findKey
Key findKey(const TQString &id) const
Return key with the given id.
Definition: addressee.src.cpp:615
TDEABC::Addressee::insertEmail
void insertEmail(const TQString &email, bool preferred=false)
Insert an email address.
Definition: addressee.src.cpp:412
TDEABC::Addressee::setEmails
void setEmails(const TQStringList &list)
Set the emails to list.
Definition: addressee.src.cpp:455
TDEABC::Addressee::insertAddress
void insertAddress(const Address &address)
Insert an address.
Definition: addressee.src.cpp:675
TDEABC::Addressee::addresses
Address::List addresses() const
Return list of all addresses.
Definition: addressee.src.cpp:723
TDEABC::Addressee::setNameFromString
DECLARATIONS void setNameFromString(const TQString &)
Set name fields by parsing the given string and trying to associate the parts of the string with acco...
Definition: addressee.src.cpp:204
TDEABC::Addressee::changed
bool changed() const
Return whether the addressee is changed.
Definition: addressee.src.cpp:1030
TDEABC::Addressee::parseEmailAddress
static void parseEmailAddress(const TQString &rawEmail, TQString &fullName, TQString &email)
Parse full email address.
Definition: addressee.src.cpp:856
TDEABC::Addressee::insertKey
void insertKey(const Key &key)
Insert a key.
Definition: addressee.src.cpp:534
TDEABC::Addressee::phoneNumber
PhoneNumber phoneNumber(int type) const
Return phone number, which matches the given type.
Definition: addressee.src.cpp:489
TDEABC::Addressee::asString
TQString asString() const
Returns string representation of the addressee.
Definition: addressee.src.cpp:626
TDEABC::Addressee::setResource
void setResource(Resource *resource)
Set resource where the addressee is from.
Definition: addressee.src.cpp:1013
TDEABC::Addressee::custom
TQString custom(const TQString &app, const TQString &name) const
Return value of custom entry, identified by app and entry name.
Definition: addressee.src.cpp:827
TDEABC::Addressee::resource
Resource * resource() const
Return pointer to resource.
Definition: addressee.src.cpp:1019
TDEABC::Addressee::uid
TQString uid() const
Return unique identifier.
Definition: addressee.src.cpp:174
TDEABC::Addressee::preferredEmail
TQString preferredEmail() const
Return preferred email address.
Definition: addressee.src.cpp:445
TDEABC::Addressee::uriLabel
static TQString uriLabel()
Return translated label for uri field.
Definition: addressee.src.cpp:197
TDEABC::Addressee::phoneNumbers
PhoneNumber::List phoneNumbers() const
Return list of all phone numbers.
Definition: addressee.src.cpp:505
TDEABC::Addressee::key
Key key(int type, TQString customTypeString=TQString::null) const
Return key, which matches the given type.
Definition: addressee.src.cpp:562
TDEABC::Addressee::findPhoneNumber
PhoneNumber findPhoneNumber(const TQString &id) const
Return phone number with the given id.
Definition: addressee.src.cpp:523
TDEABC::Key
A class to store an encryption key.
Definition: key.h:34
TDEABC::Key::id
TQString id() const
Returns the unique identifier.
Definition: key.cpp:61
TDEABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:39
TDEABC::PhoneNumber::number
TQString number() const
Returns the number.
Definition: phonenumber.cpp:88
TDEABC::PhoneNumber::id
TQString id() const
Returns the unique identifier.
Definition: phonenumber.cpp:78
TDEABC::SortMode
Sort method for sorting an addressee list.
Definition: sortmode.h:37
TDEABC::SortMode::lesser
virtual bool lesser(const TDEABC::Addressee &first, const TDEABC::Addressee &second) const =0
Reimplement this method and return whether the first contact is 'smaller' than the second.
TDEApplication::randomString
static TQString randomString(int length)
TDESharedPtr::count
int count() const
TDESharedPtr::data
T * data()
TDEShared
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)
TDEABC
static data, shared by ALL addressee objects
Definition: address.h:48
tdelocale.h

tdeabc

Skip menu "tdeabc"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdeabc

Skip menu "tdeabc"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeabc by doxygen 1.9.4
This website is maintained by Timothy Pearson.