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

tdeabc

  • tdeabc
vcard21parser.cpp
1/*
2 This file is part of libtdeabc.
3 Copyright (c) 2001 Mark Westcott <mark@houseoffish.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include <tqmap.h>
22#include <tqregexp.h>
23#include <kmdcodec.h>
24
25#include "vcard21parser.h"
26#include "vcardconverter.h"
27
28using namespace TDEABC;
29
30bool VCardLineX::isValid() const
31{
32 // Invalid: if it is "begin:vcard" or "end:vcard"
33 if ( name == VCARD_BEGIN_N || name == VCARD_END_N )
34 return false;
35
36 if ( name[0] == 'x' && name[1] == '-' ) // A custom x- line
37 return true;
38
39 // This is long but it makes it a bit faster (and saves me from using
40 // a tree which is probably the ideal situation, but a bit memory heavy)
41 switch( name[0] ) {
42 case 'a':
43 if ( name == VCARD_ADR && qualified &&
44 (qualifiers.contains(VCARD_ADR_DOM) ||
45 qualifiers.contains(VCARD_ADR_INTL) ||
46 qualifiers.contains(VCARD_ADR_POSTAL) ||
47 qualifiers.contains(VCARD_ADR_HOME) ||
48 qualifiers.contains(VCARD_ADR_WORK) ||
49 qualifiers.contains(VCARD_ADR_PREF)
50 ) )
51 return true;
52
53 if ( name == VCARD_AGENT )
54 return true;
55 break;
56
57 case 'b':
58 if ( name == VCARD_BDAY )
59 return true;
60 break;
61
62 case 'c':
63 if ( name == VCARD_CATEGORIES )
64 return true;
65 if ( name == VCARD_CLASS && qualified &&
66 (qualifiers.contains(VCARD_CLASS_PUBLIC) ||
67 qualifiers.contains(VCARD_CLASS_PRIVATE) ||
68 qualifiers.contains(VCARD_CLASS_CONFIDENTIAL)
69 ) )
70 return true;
71 break;
72
73 case 'e':
74 if ( name == VCARD_EMAIL && qualified &&
75 (qualifiers.contains(VCARD_EMAIL_INTERNET) ||
76 qualifiers.contains(VCARD_EMAIL_PREF) ||
77 qualifiers.contains(VCARD_EMAIL_X400)
78 ) )
79 return true;
80 break;
81
82 case 'f':
83 if ( name == VCARD_FN )
84 return true;
85 break;
86
87 case 'g':
88 if ( name == VCARD_GEO )
89 return true;
90 break;
91
92 case 'k':
93 if ( name == VCARD_KEY && qualified &&
94 (qualifiers.contains(VCARD_KEY_X509) ||
95 qualifiers.contains(VCARD_KEY_PGP)
96 ) )
97 return true;
98 break;
99
100 case 'l':
101 if ( name == VCARD_LABEL )
102 return true;
103 if ( name == VCARD_LOGO )
104 return true;
105 break;
106
107 case 'm':
108 if ( name == VCARD_MAILER )
109 return true;
110 break;
111
112 case 'n':
113 if ( name == VCARD_N )
114 return true;
115 if ( name == VCARD_NAME )
116 return true;
117 if ( name == VCARD_NICKNAME )
118 return true;
119 if ( name == VCARD_NOTE )
120 return true;
121 break;
122
123 case 'o':
124 if ( name == VCARD_ORG )
125 return true;
126 break;
127
128 case 'p':
129 if ( name == VCARD_PHOTO )
130 return true;
131 if ( name == VCARD_PROFILE )
132 return true;
133 if ( name == VCARD_PRODID )
134 return true;
135 break;
136
137 case 'r':
138 if ( name == VCARD_ROLE )
139 return true;
140 if ( name == VCARD_REV )
141 return true;
142 break;
143
144 case 's':
145 if ( name == VCARD_SOURCE )
146 return true;
147 if ( name == VCARD_SOUND )
148 return true;
149 break;
150
151 case 't':
152 if ( name == VCARD_TEL && qualified &&
153 (qualifiers.contains(VCARD_TEL_HOME) ||
154 qualifiers.contains(VCARD_TEL_WORK) ||
155 qualifiers.contains(VCARD_TEL_PREF) ||
156 qualifiers.contains(VCARD_TEL_VOICE) ||
157 qualifiers.contains(VCARD_TEL_FAX) ||
158 qualifiers.contains(VCARD_TEL_MSG) ||
159 qualifiers.contains(VCARD_TEL_CELL) ||
160 qualifiers.contains(VCARD_TEL_PAGER) ||
161 qualifiers.contains(VCARD_TEL_BBS) ||
162 qualifiers.contains(VCARD_TEL_MODEM) ||
163 qualifiers.contains(VCARD_TEL_CAR) ||
164 qualifiers.contains(VCARD_TEL_ISDN) ||
165 qualifiers.contains(VCARD_TEL_VIDEO) ||
166 qualifiers.contains(VCARD_TEL_PCS)
167 ) )
168 return true;
169 if ( name == VCARD_TZ )
170 return true;
171 if ( name == VCARD_TITLE )
172 return true;
173 break;
174
175 case 'u':
176 if ( name == VCARD_URL )
177 return true;
178 if ( name == VCARD_UID )
179 return true;
180 break;
181
182 case 'v':
183 if ( name == VCARD_VERSION )
184 return true;
185 break;
186 default:
187 break;
188 }
189
190 return false;
191}
192
193
194VCard21Parser::VCard21Parser()
195{
196}
197
198VCard21Parser::~VCard21Parser()
199{
200}
201
202void VCard21Parser::readFromString(TDEABC::AddressBook *addressbook, const TQString &data)
203{
204 TDEABC::Addressee mAddressee = readFromString(data);
205 addressbook->insertAddressee(mAddressee);
206}
207
208TDEABC::Addressee VCard21Parser::readFromString( const TQString &data)
209{
210 TDEABC::Addressee addressee;
211 VCard21ParserImpl *vCard = VCard21ParserImpl::parseVCard(data);
212 TQString tmpStr;
213
214 // Check if parsing failed
215 if (vCard == 0)
216 {
217 kdDebug() << "Parsing failed" << endl;
218 return addressee;
219 }
220 //set the addressees name and formated name
221 TQStringList tmpList = vCard->getValues(VCARD_N);
222 TQString formattedName = "";
223 if (tmpList.count() > 0)
224 addressee.setFamilyName(tmpList[0]);
225 if (tmpList.count() > 1)
226 addressee.setGivenName(tmpList[1]);
227 if (tmpList.count() > 2)
228 addressee.setAdditionalName(tmpList[2]);
229 if (tmpList.count() > 3)
230 addressee.setPrefix(tmpList[3]);
231 if (tmpList.count() > 4)
232 addressee.setSuffix(tmpList[4]);
233
234 tmpStr = (vCard->getValue(VCARD_FN));
235 if (!tmpStr.isEmpty())
236 addressee.setFormattedName(tmpStr);
237
238 //set the addressee's nick name
239 tmpStr = vCard->getValue(VCARD_NICKNAME);
240 addressee.setNickName(tmpStr);
241 //set the addressee's organization
242 tmpStr = vCard->getValue(VCARD_ORG);
243 addressee.setOrganization(tmpStr);
244 //set the addressee's title
245 tmpStr = vCard->getValue(VCARD_TITLE);
246 addressee.setTitle(tmpStr);
247 //set the addressee's email - we can only deal with two. The preferenced one and one other.
248 tmpStr = vCard->getValue(VCARD_EMAIL, VCARD_EMAIL_INTERNET);
249 addressee.insertEmail(tmpStr, false);
250 tmpStr = vCard->getValue(VCARD_EMAIL,VCARD_EMAIL_PREF);
251 addressee.insertEmail(tmpStr, true);
252 //set the addressee's url
253 tmpStr = vCard->getValue(VCARD_URL);
254 if (tmpStr.isEmpty()) tmpStr = vCard->getValue(VCARD_URL, VCARD_ADR_WORK);
255 if (tmpStr.isEmpty()) tmpStr = vCard->getValue(VCARD_URL, VCARD_ADR_HOME);
256 if (!tmpStr.isEmpty()) {
257 addressee.setUrl(KURL(tmpStr));
258 }
259
260 //set the addressee's birthday
261 tmpStr = vCard->getValue(VCARD_BDAY);
262 addressee.setBirthday(VCardStringToDate(tmpStr));
263
264 //set the addressee's phone numbers
265 for ( TQValueListIterator<VCardLineX> i = vCard->_vcdata->begin();i != vCard->_vcdata->end(); ++i ) {
266 if ( (*i).name == VCARD_TEL ) {
267 int type = 0;
268 if ( (*i).qualified ) {
269 if ( (*i).qualifiers.contains( VCARD_TEL_HOME ) )
270 type |= PhoneNumber::Home;
271 if ( (*i).qualifiers.contains( VCARD_TEL_WORK ) )
272 type |= PhoneNumber::Work;
273 if ( (*i).qualifiers.contains( VCARD_TEL_PREF ) )
274 type |= PhoneNumber::Pref;
275 // if ( (*i).qualifiers.contains( VCARD_TEL_VOICE ) )
276 // type |= PhoneNumber::Voice;
277 if ( (*i).qualifiers.contains( VCARD_TEL_FAX ) )
278 type |= PhoneNumber::Fax;
279 if ( (*i).qualifiers.contains( VCARD_TEL_MSG ) )
280 type |= PhoneNumber::Msg;
281 if ( (*i).qualifiers.contains( VCARD_TEL_CELL ) )
282 type |= PhoneNumber::Cell;
283 if ( (*i).qualifiers.contains( VCARD_TEL_PAGER ) )
284 type |= PhoneNumber::Pager;
285 if ( (*i).qualifiers.contains( VCARD_TEL_BBS ) )
286 type |= PhoneNumber::Bbs;
287 if ( (*i).qualifiers.contains( VCARD_TEL_MODEM ) )
288 type |= PhoneNumber::Modem;
289 if ( (*i).qualifiers.contains( VCARD_TEL_CAR ) )
290 type |= PhoneNumber::Car;
291 if ( (*i).qualifiers.contains( VCARD_TEL_ISDN ) )
292 type |= PhoneNumber::Isdn;
293 if ( (*i).qualifiers.contains( VCARD_TEL_VIDEO ) )
294 type |= PhoneNumber::Video;
295 if ( (*i).qualifiers.contains( VCARD_TEL_PCS ) )
296 type |= PhoneNumber::Pcs;
297 }
298 addressee.insertPhoneNumber( PhoneNumber( (*i).parameters[ 0 ], type ) );
299 }
300 }
301
302 //set the addressee's addresses
303 for ( TQValueListIterator<VCardLineX> i = vCard->_vcdata->begin();i != vCard->_vcdata->end(); ++i ) {
304 if ( (*i).name == VCARD_ADR ) {
305 int type = 0;
306 if ( (*i).qualified ) {
307 if ( (*i).qualifiers.contains( VCARD_ADR_DOM ) )
308 type |= Address::Dom;
309 if ( (*i).qualifiers.contains( VCARD_ADR_INTL ) )
310 type |= Address::Intl;
311 if ( (*i).qualifiers.contains( VCARD_ADR_POSTAL ) )
312 type |= Address::Postal;
313 if ( (*i).qualifiers.contains( VCARD_ADR_PARCEL ) )
314 type |= Address::Parcel;
315 if ( (*i).qualifiers.contains( VCARD_ADR_HOME ) )
316 type |= Address::Home;
317 if ( (*i).qualifiers.contains( VCARD_ADR_WORK ) )
318 type |= Address::Work;
319 if ( (*i).qualifiers.contains( VCARD_ADR_PREF ) )
320 type |= Address::Pref;
321 }
322 addressee.insertAddress( readAddressFromQStringList( (*i).parameters, type ) );
323 }
324 }
325
326 //set the addressee's delivery label
327 tmpStr = vCard->getValue(VCARD_LABEL);
328 if (!tmpStr.isEmpty()) {
329 tmpStr.replace("\r\n","\n");
330 Address tmpAddress;
331 tmpAddress.setLabel(tmpStr);
332 addressee.insertAddress(tmpAddress);
333 }
334
335 //set the addressee's notes
336 tmpStr = vCard->getValue(VCARD_NOTE);
337 tmpStr.replace("\r\n","\n");
338 addressee.setNote(tmpStr);
339
340 //set the addressee's timezone
341 tmpStr = vCard->getValue(VCARD_TZ);
342 TimeZone tmpZone(tmpStr.toInt());
343 addressee.setTimeZone(tmpZone);
344
345 //set the addressee's geographical position
346 tmpList = vCard->getValues(VCARD_GEO);
347 if (tmpList.count()==2)
348 {
349 tmpStr = tmpList[0];
350 float glat = tmpStr.toFloat();
351 tmpStr = tmpList[1];
352 float glong = tmpStr.toFloat();
353 Geo tmpGeo(glat,glong);
354 addressee.setGeo(tmpGeo);
355 }
356
357 //set the last revision date
358 tmpStr = vCard->getValue(VCARD_REV);
359 addressee.setRevision(VCardStringToDate(tmpStr));
360
361 //set the role of the addressee
362 tmpStr = vCard->getValue(VCARD_ROLE);
363 addressee.setRole(tmpStr);
364
365 delete vCard;
366
367 return addressee;
368}
369
370
371
372TDEABC::Address VCard21Parser::readAddressFromQStringList ( const TQStringList &data, const int type )
373{
374 TDEABC::Address mAddress;
375 mAddress.setType( type );
376
377 if ( data.count() > 0 )
378 mAddress.setPostOfficeBox( data[0] );
379 if ( data.count() > 1 )
380 mAddress.setExtended( data[1] );
381 if ( data.count() > 2 )
382 mAddress.setStreet( data[2] );
383 if ( data.count() > 3 )
384 mAddress.setLocality( data[3] );
385 if ( data.count() > 4 )
386 mAddress.setRegion( data[4] );
387 if ( data.count() > 5 )
388 mAddress.setPostalCode( data[5] );
389 if ( data.count() > 6 )
390 mAddress.setCountry( data[6] );
391
392 return mAddress;
393}
394
395
396VCard21ParserImpl *VCard21ParserImpl::parseVCard( const TQString& vc, int *err )
397{
398 int _err = 0;
399 int _state = VC_STATE_BEGIN;
400
401 TQValueList<VCardLineX> *vcdata;
402 TQValueList<TQString> lines;
403
404 vcdata = new TQValueList<VCardLineX>;
405
406 lines = TQStringList::split( TQRegExp( "[\x0d\x0a]" ), vc );
407
408 // for each line in the vCard
409 for ( TQStringList::Iterator j = lines.begin(); j != lines.end(); ++j ) {
410 VCardLineX _vcl;
411
412 // take spaces off the end - ugly but necessary hack
413 for ( int g = (*j).length()-1; g > 0 && (*j)[g].isSpace(); --g )
414 (*j)[g] = 0;
415
416 // first token:
417 // verify state, update if necessary
418 if ( _state & VC_STATE_BEGIN) {
419 if ( !tqstricmp( (*j).latin1(), VCARD_BEGIN ) ) {
420 _state = VC_STATE_BODY;
421 continue;
422 } else {
423 _err = VC_ERR_NO_BEGIN;
424 break;
425 }
426 } else if ( _state & VC_STATE_BODY ) {
427 if ( !tqstricmp( (*j).latin1(), VCARD_END ) ) {
428 _state |= VC_STATE_END;
429 break;
430 }
431
432 // split into two tokens
433 int colon = (*j).find( ':' );
434 if ( colon < 0 ) {
435 _err = VC_ERR_INVALID_LINE;
436 break;
437 }
438
439 TQString key = (*j).left( colon );
440 TQString value = (*j).mid( colon + 1 );
441
442 // check for qualifiers and
443 // set name, qualified, qualifier(s)
444 TQStringList keyTokens = TQStringList::split( ';', key );
445 bool qp = false, first_pass = true;
446 bool b64 = false;
447
448 if ( keyTokens.count() > 0 ) {
449 _vcl.qualified = false;
450 _vcl.name = keyTokens[ 0 ].lower();
451
452 for ( TQStringList::Iterator z = keyTokens.begin(); z != keyTokens.end(); ++z ) {
453 TQString zz = (*z).lower();
454 if ( zz == VCARD_QUOTED_PRINTABLE || zz == VCARD_ENCODING_QUOTED_PRINTABLE ) {
455 qp = true;
456 } else if ( zz == VCARD_BASE64 ) {
457 b64 = true;
458 } else if ( !first_pass ) {
459 _vcl.qualified = true;
460 _vcl.qualifiers.append( zz );
461 }
462 first_pass = false;
463 }
464 } else {
465 _err = VC_ERR_INVALID_LINE;
466 }
467
468 if ( _err != 0 )
469 break;
470
471 if ( _vcl.name == VCARD_VERSION )
472 _state |= VC_STATE_HAVE_VERSION;
473
474 if ( _vcl.name == VCARD_N || _vcl.name == VCARD_FN )
475 _state |= VC_STATE_HAVE_N;
476
477 // second token:
478 // split into tokens by ;
479 // add to parameters vector
480 if ( b64 ) {
481 if ( value[ value.length() - 1 ] != '=' )
482 do {
483 value += *( ++j );
484 } while ( (*j)[ (*j).length() - 1 ] != '=' );
485 } else {
486 if ( qp ) { // join any split lines
487 while ( value[ value.length() - 1 ] == '=' ) {
488 value.remove( value.length() - 1, 1 );
489 value.append(*( ++j ));
490 }
491 }
492 _vcl.parameters = TQStringList::split( ';', value, true );
493 if ( qp ) { // decode the quoted printable
494 for ( TQStringList::Iterator z = _vcl.parameters.begin(); z != _vcl.parameters.end(); ++z )
495 *z = KCodecs::quotedPrintableDecode( TQCString((*z).latin1()) );
496 }
497 }
498 } else {
499 _err = VC_ERR_INTERNAL;
500 break;
501 }
502
503 // validate VCardLineX
504 if ( !_vcl.isValid() ) {
505 _err = VC_ERR_INVALID_LINE;
506 break;
507 }
508
509 // add to vector
510 vcdata->append( _vcl );
511 }
512
513 // errors to check at the last minute (exit state related)
514 if ( _err == 0 ) {
515 if ( !( _state & VC_STATE_END ) ) // we have to have an end!!
516 _err = VC_ERR_NO_END;
517
518 if ( !( _state & VC_STATE_HAVE_N ) || // we have to have the mandatories!
519 !( _state & VC_STATE_HAVE_VERSION ) )
520 _err = VC_ERR_MISSING_MANDATORY;
521 }
522
523 // set the error message if we can, and only return an object
524 // if the vCard was valid.
525 if ( err )
526 *err = _err;
527
528 if ( _err != 0 ) {
529 delete vcdata;
530 return 0;
531 }
532
533 return new VCard21ParserImpl( vcdata );
534}
535
536VCard21ParserImpl::VCard21ParserImpl()
537 : _vcdata( 0 )
538{
539}
540
541VCard21ParserImpl::VCard21ParserImpl(TQValueList<VCardLineX> *_vcd)
542 : _vcdata(_vcd)
543{
544}
545
546VCard21ParserImpl::~VCard21ParserImpl()
547{
548 delete _vcdata;
549 _vcdata = 0;
550}
551
552TQString VCard21ParserImpl::getValue(const TQString& name, const TQString& qualifier)
553{
554 TQString failed;
555 const TQString lowname = name.lower();
556 const TQString lowqualifier = qualifier.lower();
557
558 for (TQValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
559 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier)) {
560 if ((*i).parameters.count() > 0)
561 return (*i).parameters[0];
562 else return failed;
563 }
564 }
565 return failed;
566}
567
568
569TQString VCard21ParserImpl::getValue(const TQString& name)
570{
571 TQString failed;
572 const TQString lowname = name.lower();
573
574 for (TQValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
575 if ((*i).name == lowname && !(*i).qualified) {
576 if ((*i).parameters.count() > 0)
577 return (*i).parameters[0];
578 else return failed;
579 }
580 }
581 return failed;
582}
583
584
585TQStringList VCard21ParserImpl::getValues(const TQString& name)
586{
587 const TQString lowname = name.lower();
588 for (TQValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
589 if ((*i).name == lowname && !(*i).qualified)
590 return (*i).parameters;
591 }
592 // failed.
593 return TQStringList();
594}
595
596TQStringList VCard21ParserImpl::getValues(const TQString& name, const TQString& qualifier)
597{
598 const TQString lowname = name.lower();
599 const TQString lowqualifier = qualifier.lower();
600 for (TQValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
601 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier))
602 return (*i).parameters;
603 }
604 // failed.
605 return TQStringList();
606}
607
608
KCodecs::quotedPrintableDecode
static TQCString quotedPrintableDecode(const TQByteArray &in)
KURL
TDEABC::AddressBook
Address Book.
Definition: addressbook.h:44
TDEABC::AddressBook::insertAddressee
void insertAddressee(const Addressee &addr)
Insert an addressee into the address book.
Definition: addressbook.cpp:518
TDEABC::Address
Postal address information.
Definition: address.h:56
TDEABC::Address::setPostalCode
void setPostalCode(const TQString &)
Sets the postal code.
Definition: address.cpp:221
TDEABC::Address::setExtended
void setExtended(const TQString &)
Sets the extended address information.
Definition: address.cpp:149
TDEABC::Address::setLocality
void setLocality(const TQString &)
Sets the locality, e.g.
Definition: address.cpp:185
TDEABC::Address::setType
void setType(int type)
Sets the type of address.
Definition: address.cpp:100
TDEABC::Address::setRegion
void setRegion(const TQString &)
Sets the region, e.g.
Definition: address.cpp:203
TDEABC::Address::setLabel
void setLabel(const TQString &)
Sets the delivery label.
Definition: address.cpp:257
TDEABC::Address::setStreet
void setStreet(const TQString &)
Sets the street (including number).
Definition: address.cpp:167
TDEABC::Address::setCountry
void setCountry(const TQString &)
Sets the country.
Definition: address.cpp:239
TDEABC::Address::setPostOfficeBox
void setPostOfficeBox(const TQString &)
Sets the post office box.
Definition: address.cpp:131
TDEABC::Addressee
address book entry
Definition: addressee.src.h:75
TDEABC::Addressee::insertPhoneNumber
void insertPhoneNumber(const PhoneNumber &phoneNumber)
Insert a phone number.
Definition: addressee.src.cpp:460
TDEABC::Addressee::insertEmail
void insertEmail(const TQString &email, bool preferred=false)
Insert an email address.
Definition: addressee.src.cpp:412
TDEABC::Addressee::insertAddress
void insertAddress(const Address &address)
Insert an address.
Definition: addressee.src.cpp:675
TDEABC::Geo
Geographic position.
Definition: geo.h:36
TDEABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:39
TDEABC::TimeZone
Time zone information.
Definition: timezone.h:36
TDEABC::VCard21Parser::~VCard21Parser
virtual ~VCard21Parser()
Destructor.
Definition: vcard21parser.cpp:198
TDEABC::VCard21Parser::readFromString
void readFromString(TDEABC::AddressBook *ab, const TQString &str)
Parses a string in vcard2.1 format and saves the single addressees to the address book.
Definition: vcard21parser.cpp:202
TDEABC::VCard21Parser::readAddressFromQStringList
static TDEABC::Address readAddressFromQStringList(const TQStringList &data, const int type)
Helper method to store a address.
Definition: vcard21parser.cpp:372
VCard21ParserImpl
Helper class.
Definition: vcard21parser.h:203
VCardLineX
Helper class.
Definition: vcard21parser.h:190
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)
TDEABC
static data, shared by ALL addressee objects
Definition: address.h:48
TDEABC::VCardStringToDate
KABC_EXPORT TQDateTime VCardStringToDate(const TQString &dateString)
Converts a date string as it is used in VCard and LDIF files to a TQDateTime value.
Definition: vcardconverter.cpp:114
TDEStdAccel::key
int key(StdAccel id)
TDEStdAccel::name
TQString name(StdAccel id)

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.