• 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 
28 using namespace TDEABC;
29 
30 bool 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 
194 VCard21Parser::VCard21Parser()
195 {
196 }
197 
198 VCard21Parser::~VCard21Parser()
199 {
200 }
201 
202 void VCard21Parser::readFromString(TDEABC::AddressBook *addressbook, const TQString &data)
203 {
204  TDEABC::Addressee mAddressee = readFromString(data);
205  addressbook->insertAddressee(mAddressee);
206 }
207 
208 TDEABC::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 
372 TDEABC::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 
396 VCard21ParserImpl *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 
536 VCard21ParserImpl::VCard21ParserImpl()
537  : _vcdata( 0 )
538 {
539 }
540 
541 VCard21ParserImpl::VCard21ParserImpl(TQValueList<VCardLineX> *_vcd)
542  : _vcdata(_vcd)
543 {
544 }
545 
546 VCard21ParserImpl::~VCard21ParserImpl()
547 {
548  delete _vcdata;
549  _vcdata = 0;
550 }
551 
552 TQString 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 
569 TQString 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 
585 TQStringList 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 
596 TQStringList 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::VCard21Parser
VCard21Parser()
Constructor.
Definition: vcard21parser.cpp:194
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.1
This website is maintained by Timothy Pearson.