• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.14.3 API Reference
  • KDE Home
  • Contact Us
 

kabc

  • kabc
vcardtool.cpp
1 /*
2  This file is part of libkabc.
3  Copyright (c) 2003 Tobias Koenig <tokoe@kde.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 "vcardtool.h"
22 #include "key.h"
23 #include "picture.h"
24 #include "secrecy.h"
25 #include "sound.h"
26 
27 #include <QtCore/QString>
28 #include <QtCore/QBuffer>
29 
30 using namespace KABC;
31 
32 static bool needsEncoding( const QString &value )
33 {
34  uint length = value.length();
35  for ( uint i = 0; i < length; ++i ) {
36  char c = value.at( i ).toLatin1();
37  if ( ( c < 33 || c > 126 ) && c != ' ' && c != '=' ) {
38  return true;
39  }
40  }
41 
42  return false;
43 }
44 
45 VCardTool::VCardTool()
46 {
47  mAddressTypeMap.insert( QLatin1String( "dom" ), Address::Dom );
48  mAddressTypeMap.insert( QLatin1String( "intl" ), Address::Intl );
49  mAddressTypeMap.insert( QLatin1String( "postal" ), Address::Postal );
50  mAddressTypeMap.insert( QLatin1String( "parcel" ), Address::Parcel );
51  mAddressTypeMap.insert( QLatin1String( "home" ), Address::Home );
52  mAddressTypeMap.insert( QLatin1String( "work" ), Address::Work );
53  mAddressTypeMap.insert( QLatin1String( "pref" ), Address::Pref );
54 
55  mPhoneTypeMap.insert( QLatin1String( "HOME" ), PhoneNumber::Home );
56  mPhoneTypeMap.insert( QLatin1String( "WORK" ), PhoneNumber::Work );
57  mPhoneTypeMap.insert( QLatin1String( "MSG" ), PhoneNumber::Msg );
58  mPhoneTypeMap.insert( QLatin1String( "PREF" ), PhoneNumber::Pref );
59  mPhoneTypeMap.insert( QLatin1String( "VOICE" ), PhoneNumber::Voice );
60  mPhoneTypeMap.insert( QLatin1String( "FAX" ), PhoneNumber::Fax );
61  mPhoneTypeMap.insert( QLatin1String( "CELL" ), PhoneNumber::Cell );
62  mPhoneTypeMap.insert( QLatin1String( "VIDEO" ), PhoneNumber::Video );
63  mPhoneTypeMap.insert( QLatin1String( "BBS" ), PhoneNumber::Bbs );
64  mPhoneTypeMap.insert( QLatin1String( "MODEM" ), PhoneNumber::Modem );
65  mPhoneTypeMap.insert( QLatin1String( "CAR" ), PhoneNumber::Car );
66  mPhoneTypeMap.insert( QLatin1String( "ISDN" ), PhoneNumber::Isdn );
67  mPhoneTypeMap.insert( QLatin1String( "PCS" ), PhoneNumber::Pcs );
68  mPhoneTypeMap.insert( QLatin1String( "PAGER" ), PhoneNumber::Pager );
69 }
70 
71 VCardTool::~VCardTool()
72 {
73 }
74 
75 QByteArray VCardTool::exportVCards( const Addressee::List &list, VCard::Version version ) const
76 {
77  return createVCards( list, version, true /*export vcard*/);
78 }
79 
80 QByteArray VCardTool::createVCards( const Addressee::List &list, VCard::Version version ) const
81 {
82  return createVCards( list, version, false /*don't export*/);
83 }
84 
85 QByteArray VCardTool::createVCards( const Addressee::List &list,
86  VCard::Version version, bool exportVcard ) const
87 {
88  VCard::List vCardList;
89 
90  Addressee::List::ConstIterator addrIt;
91  Addressee::List::ConstIterator listEnd( list.constEnd() );
92  for ( addrIt = list.constBegin(); addrIt != listEnd; ++addrIt ) {
93  VCard card;
94  QStringList::ConstIterator strIt;
95 
96  // ADR + LABEL
97  const Address::List addresses = ( *addrIt ).addresses();
98  for ( Address::List::ConstIterator it = addresses.begin(); it != addresses.end(); ++it ) {
99  QStringList address;
100 
101  const bool isEmpty = ( ( *it ).postOfficeBox().isEmpty() &&
102  ( *it ).extended().isEmpty() &&
103  ( *it ).street().isEmpty() &&
104  ( *it ).locality().isEmpty() &&
105  ( *it ).region().isEmpty() &&
106  ( *it ).postalCode().isEmpty() &&
107  ( *it ).country().isEmpty() );
108 
109  address.append( ( *it ).postOfficeBox().replace( QLatin1Char( ';' ),
110  QLatin1String( "\\;" ) ) );
111 
112  address.append( ( *it ).extended().replace( QLatin1Char( ';' ),
113  QLatin1String( "\\;" ) ) );
114 
115  address.append( ( *it ).street().replace( QLatin1Char( ';' ),
116  QLatin1String( "\\;" ) ) );
117 
118  address.append( ( *it ).locality().replace( QLatin1Char( ';' ),
119  QLatin1String( "\\;" ) ) );
120 
121  address.append( ( *it ).region().replace( QLatin1Char( ';' ),
122  QLatin1String( "\\;" ) ) );
123 
124  address.append( ( *it ).postalCode().replace( QLatin1Char( ';' ),
125  QLatin1String( "\\;" ) ) );
126 
127  address.append( ( *it ).country().replace( QLatin1Char( ';' ),
128  QLatin1String( "\\;" ) ) );
129 
130  VCardLine adrLine( QLatin1String( "ADR" ), address.join( QLatin1String( ";" ) ) );
131  if ( version == VCard::v2_1 && needsEncoding( address.join( QLatin1String( ";" ) ) ) ) {
132  adrLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
133  adrLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
134  }
135 
136  VCardLine labelLine( QLatin1String( "LABEL" ), ( *it ).label() );
137  if ( version == VCard::v2_1 && needsEncoding( ( *it ).label() ) ) {
138  labelLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
139  labelLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
140  }
141 
142  const bool hasLabel = !( *it ).label().isEmpty();
143  QMap<QString, Address::TypeFlag>::ConstIterator typeIt;
144  for ( typeIt = mAddressTypeMap.constBegin();
145  typeIt != mAddressTypeMap.constEnd(); ++typeIt ) {
146  if ( typeIt.value() & ( *it ).type() ) {
147  adrLine.addParameter( QLatin1String( "TYPE" ), typeIt.key() );
148  if ( hasLabel ) {
149  labelLine.addParameter( QLatin1String( "TYPE" ), typeIt.key() );
150  }
151  }
152  }
153 
154  if ( !isEmpty ) {
155  card.addLine( adrLine );
156  }
157  if ( hasLabel ) {
158  card.addLine( labelLine );
159  }
160  }
161 
162  // BDAY
163  card.addLine( VCardLine( QLatin1String( "BDAY" ), createDateTime( ( *addrIt ).birthday() ) ) );
164 
165  // CATEGORIES only > 2.1
166  if ( version != VCard::v2_1 ) {
167  QStringList categories = ( *addrIt ).categories();
168  QStringList::Iterator catIt;
169  QStringList::Iterator catEnd( categories.end() );
170  for ( catIt = categories.begin(); catIt != catEnd; ++catIt ) {
171  ( *catIt ).replace( QLatin1Char( ',' ), QLatin1String( "\\," ) );
172  }
173 
174  VCardLine catLine( QLatin1String( "CATEGORIES" ), categories.join( QLatin1String( "," ) ) );
175  card.addLine( catLine );
176  }
177 
178  // CLASS only for version == 3.0
179  if ( version == VCard::v3_0 ) {
180  card.addLine( createSecrecy( ( *addrIt ).secrecy() ) );
181  }
182 
183  // EMAIL
184  const QStringList emails = ( *addrIt ).emails();
185  bool pref = true;
186  for ( strIt = emails.begin(); strIt != emails.end(); ++strIt ) {
187  VCardLine line( QLatin1String( "EMAIL" ), *strIt );
188  if ( pref == true && emails.count() > 1 ) {
189  line.addParameter( QLatin1String( "TYPE" ), QLatin1String( "PREF" ) );
190  pref = false;
191  }
192  card.addLine( line );
193  }
194 
195  // FN required for only version > 2.1
196  VCardLine fnLine( QLatin1String( "FN" ), ( *addrIt ).formattedName() );
197  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).formattedName() ) ) {
198  fnLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
199  fnLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
200  }
201  card.addLine( fnLine );
202 
203  // GEO
204  const Geo geo = ( *addrIt ).geo();
205  if ( geo.isValid() ) {
206  QString str;
207  str.sprintf( "%.6f;%.6f", geo.latitude(), geo.longitude() );
208  card.addLine( VCardLine( QLatin1String( "GEO" ), str ) );
209  }
210 
211  // KEY
212  const Key::List keys = ( *addrIt ).keys();
213  Key::List::ConstIterator keyIt;
214  Key::List::ConstIterator keyEnd( keys.end() );
215  for ( keyIt = keys.begin(); keyIt != keyEnd; ++keyIt ) {
216  card.addLine( createKey( *keyIt ) );
217  }
218 
219  // LOGO
220  card.addLine( createPicture( QLatin1String( "LOGO" ), ( *addrIt ).logo() ) );
221 
222  // MAILER only for version < 4.0
223  if ( version != VCard::v4_0 ) {
224  VCardLine mailerLine( QLatin1String( "MAILER" ), ( *addrIt ).mailer() );
225  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).mailer() ) ) {
226  mailerLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
227  mailerLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
228  }
229  card.addLine( mailerLine );
230  }
231 
232  // N required for only version < 4.0
233  QStringList name;
234  name.append( ( *addrIt ).familyName().replace( QLatin1Char( ';' ),
235  QLatin1String( "\\;" ) ) );
236 
237  name.append( ( *addrIt ).givenName().replace( QLatin1Char( ';' ),
238  QLatin1String( "\\;" ) ) );
239 
240  name.append( ( *addrIt ).additionalName().replace( QLatin1Char( ';' ),
241  QLatin1String( "\\;" ) ) );
242 
243  name.append( ( *addrIt ).prefix().replace( QLatin1Char( ';' ),
244  QLatin1String( "\\;" ) ) );
245 
246  name.append( ( *addrIt ).suffix().replace( QLatin1Char( ';' ),
247  QLatin1String( "\\;" ) ) );
248 
249  VCardLine nLine( QLatin1String( "N" ), name.join( QLatin1String( ";" ) ) );
250  if ( version == VCard::v2_1 && needsEncoding( name.join( QLatin1String( ";" ) ) ) ) {
251  nLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
252  nLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
253  }
254  if ( version == VCard::v4_0 && !( *addrIt ).sortString().isEmpty() ) {
255  nLine.addParameter( QLatin1String( "SORT-AS" ), ( *addrIt ).sortString() );
256  }
257 
258  card.addLine( nLine );
259 
260  // NAME only for version < 4.0
261  if ( version != VCard::v4_0 ) {
262  VCardLine nameLine( QLatin1String( "NAME" ), ( *addrIt ).name() );
263  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).name() ) ) {
264  nameLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
265  nameLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
266  }
267  card.addLine( nameLine );
268  }
269 
270  // NICKNAME only for version > 2.1
271  if ( version != VCard::v2_1 ) {
272  card.addLine( VCardLine( QLatin1String( "NICKNAME" ), ( *addrIt ).nickName() ) );
273  }
274 
275  // NOTE
276  VCardLine noteLine( QLatin1String( "NOTE" ), ( *addrIt ).note() );
277  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).note() ) ) {
278  noteLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
279  noteLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
280  }
281  card.addLine( noteLine );
282 
283  // ORG
284  QStringList organization;
285  organization.append( ( *addrIt ).organization().replace( QLatin1Char( ';' ),
286  QLatin1String( "\\;" ) ) );
287  if ( !( *addrIt ).department().isEmpty() ) {
288  organization.append( ( *addrIt ).department().replace( QLatin1Char( ';' ),
289  QLatin1String( "\\;" ) ) );
290  }
291  VCardLine orgLine( QLatin1String( "ORG" ), organization.join( QLatin1String( ";" ) ) );
292  if ( version == VCard::v2_1 && needsEncoding( organization.join( QLatin1String( ";" ) ) ) ) {
293  orgLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
294  orgLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
295  }
296  card.addLine( orgLine );
297 
298  // PHOTO
299  card.addLine( createPicture( QLatin1String( "PHOTO" ), ( *addrIt ).photo() ) );
300 
301  // PROID only for version > 2.1
302  if ( version != VCard::v2_1 ) {
303  card.addLine( VCardLine( QLatin1String( "PRODID" ), ( *addrIt ).productId() ) );
304  }
305 
306  // REV
307  card.addLine( VCardLine( QLatin1String( "REV" ), createDateTime( ( *addrIt ).revision() ) ) );
308 
309  // ROLE
310  VCardLine roleLine( QLatin1String( "ROLE" ), ( *addrIt ).role() );
311  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).role() ) ) {
312  roleLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
313  roleLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
314  }
315  card.addLine( roleLine );
316 
317  // SORT-STRING
318  if ( version == VCard::v3_0 ) {
319  card.addLine( VCardLine( QLatin1String( "SORT-STRING" ), ( *addrIt ).sortString() ) );
320  }
321 
322  // SOUND
323  card.addLine( createSound( ( *addrIt ).sound() ) );
324 
325  // TEL
326  const PhoneNumber::List phoneNumbers = ( *addrIt ).phoneNumbers();
327  PhoneNumber::List::ConstIterator phoneIt;
328  PhoneNumber::List::ConstIterator phoneEnd( phoneNumbers.end() );
329  for ( phoneIt = phoneNumbers.begin(); phoneIt != phoneEnd; ++phoneIt ) {
330  VCardLine line( QLatin1String( "TEL" ), ( *phoneIt ).number() );
331 
332  QMap<QString, PhoneNumber::TypeFlag>::ConstIterator typeIt;
333  QMap<QString, PhoneNumber::TypeFlag>::ConstIterator typeEnd( mPhoneTypeMap.constEnd() );
334  for ( typeIt = mPhoneTypeMap.constBegin(); typeIt != typeEnd; ++typeIt ) {
335  if ( typeIt.value() & ( *phoneIt ).type() ) {
336  line.addParameter( QLatin1String( "TYPE" ), typeIt.key() );
337  }
338  }
339 
340  card.addLine( line );
341  }
342 
343  // TITLE
344  VCardLine titleLine( QLatin1String( "TITLE" ), ( *addrIt ).title() );
345  if ( version == VCard::v2_1 && needsEncoding( ( *addrIt ).title() ) ) {
346  titleLine.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
347  titleLine.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
348  }
349  card.addLine( titleLine );
350 
351  // TZ
352  const TimeZone timeZone = ( *addrIt ).timeZone();
353  if ( timeZone.isValid() ) {
354  QString str;
355 
356  int neg = 1;
357  if ( timeZone.offset() < 0 ) {
358  neg = -1;
359  }
360 
361  str.sprintf( "%c%02d:%02d", ( timeZone.offset() >= 0 ? '+' : '-' ),
362  ( timeZone.offset() / 60 ) * neg,
363  ( timeZone.offset() % 60 ) * neg );
364 
365  card.addLine( VCardLine( QLatin1String( "TZ" ), str ) );
366  }
367 
368  // UID
369  card.addLine( VCardLine( QLatin1String( "UID" ), ( *addrIt ).uid() ) );
370 
371  // URL
372  card.addLine( VCardLine( QLatin1String( "URL" ), ( *addrIt ).url().url() ) );
373 
374  // VERSION
375  if ( version == VCard::v2_1 ) {
376  card.addLine( VCardLine( QLatin1String( "VERSION" ), QLatin1String( "2.1" ) ) );
377  } else if ( version == VCard::v3_0 ) {
378  card.addLine( VCardLine( QLatin1String( "VERSION" ), QLatin1String( "3.0" ) ) );
379  } else if ( version == VCard::v4_0 ) {
380  card.addLine( VCardLine( QLatin1String( "VERSION" ), QLatin1String( "4.0" ) ) );
381  }
382 
383  // X-
384  const QStringList customs = ( *addrIt ).customs();
385  for ( strIt = customs.begin(); strIt != customs.end(); ++strIt ) {
386  QString identifier = QLatin1String( "X-" ) +
387  ( *strIt ).left( ( *strIt ).indexOf( QLatin1Char( ':' ) ) );
388  const QString value = ( *strIt ).mid( ( *strIt ).indexOf( QLatin1Char( ':' ) ) + 1 );
389  if ( value.isEmpty() ) {
390  continue;
391  }
392  //Convert to standard identifier
393  if ( exportVcard ) {
394  if ( identifier == QLatin1String( "X-messaging/aim-All" ) ) {
395  identifier = QLatin1String( "X-AIM" );
396  } else if ( identifier == QLatin1String( "X-messaging/icq-All" ) ) {
397  identifier = QLatin1String( "X-ICQ" );
398  } else if ( identifier == QLatin1String( "X-messaging/xmpp-All" ) ) {
399  identifier = QLatin1String( "X-JABBER" );
400  } else if ( identifier == QLatin1String( "X-messaging/msn-All" ) ) {
401  identifier = QLatin1String( "X-MSN" );
402  } else if ( identifier == QLatin1String( "X-messaging/yahoo-All" ) ) {
403  identifier = QLatin1String( "X-YAHOO" );
404  } else if ( identifier == QLatin1String( "X-messaging/gadu-All" ) ) {
405  identifier = QLatin1String( "X-GADUGADU" );
406  } else if ( identifier == QLatin1String( "X-messaging/skype-All" ) ) {
407  identifier = QLatin1String( "X-SKYPE" );
408  } else if ( identifier == QLatin1String( "X-messaging/groupwise-All" ) ) {
409  identifier = QLatin1String( "X-GROUPWISE" );
410  } else if ( identifier == QLatin1String( "X-messaging/sms-All" ) ) {
411  identifier = QLatin1String( "X-SMS" );
412  } else if ( identifier == QLatin1String( "X-messaging/meanwhile-All" ) ) {
413  identifier = QLatin1String( "X-MEANWHILE" );
414  } else if ( identifier == QLatin1String( "X-messaging/irc-All" ) ) {
415  identifier = QLatin1String( "X-IRC" ); //Not defined by rfc but need for fixing #300869
416  } else if ( identifier == QLatin1String( "X-messaging/googletalk-All" ) ) {
417  //Not defined by rfc but need for fixing #300869
418  identifier = QLatin1String( "X-GOOGLETALK" );
419  }
420  }
421 
422  VCardLine line( identifier, value );
423  if ( version == VCard::v2_1 && needsEncoding( value ) ) {
424  line.addParameter( QLatin1String( "charset" ), QLatin1String( "UTF-8" ) );
425  line.addParameter( QLatin1String( "encoding" ), QLatin1String( "QUOTED-PRINTABLE" ) );
426  }
427  card.addLine( line );
428  }
429 
430  vCardList.append( card );
431  }
432 
433  return VCardParser::createVCards( vCardList );
434 }
435 
436 Addressee::List VCardTool::parseVCards( const QByteArray &vcard ) const
437 {
438  static const QLatin1Char semicolonSep( ';' );
439  static const QLatin1Char commaSep( ',' );
440  QString identifier;
441 
442  Addressee::List addrList;
443  const VCard::List vCardList = VCardParser::parseVCards( vcard );
444 
445  VCard::List::ConstIterator cardIt;
446  VCard::List::ConstIterator listEnd( vCardList.end() );
447  for ( cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt ) {
448  Addressee addr;
449 
450  const QStringList idents = ( *cardIt ).identifiers();
451  QStringList::ConstIterator identIt;
452  QStringList::ConstIterator identEnd( idents.end() );
453  for ( identIt = idents.begin(); identIt != identEnd; ++identIt ) {
454  const VCardLine::List lines = ( *cardIt ).lines( ( *identIt ) );
455  VCardLine::List::ConstIterator lineIt;
456 
457  // iterate over the lines
458  for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) {
459  identifier = ( *lineIt ).identifier().toLower();
460  // ADR
461  if ( identifier == QLatin1String( "adr" ) ) {
462  Address address;
463  const QStringList addrParts = splitString( semicolonSep, ( *lineIt ).value().toString() );
464  if ( addrParts.count() > 0 ) {
465  address.setPostOfficeBox( addrParts.at(0) );
466  }
467  if ( addrParts.count() > 1 ) {
468  address.setExtended( addrParts.at(1) );
469  }
470  if ( addrParts.count() > 2 ) {
471  address.setStreet( addrParts.at(2) );
472  }
473  if ( addrParts.count() > 3 ) {
474  address.setLocality( addrParts.at(3) );
475  }
476  if ( addrParts.count() > 4 ) {
477  address.setRegion( addrParts.at(4) );
478  }
479  if ( addrParts.count() > 5 ) {
480  address.setPostalCode( addrParts.at(5) );
481  }
482  if ( addrParts.count() > 6 ) {
483  address.setCountry( addrParts.at(6) );
484  }
485 
486  Address::Type type;
487 
488  const QStringList types = ( *lineIt ).parameters( QLatin1String( "type" ) );
489  QStringList::ConstIterator end(types.end());
490  for ( QStringList::ConstIterator it = types.begin(); it != end; ++it ) {
491  type |= mAddressTypeMap[ ( *it ).toLower() ];
492  }
493 
494  address.setType( type );
495  if ( !( *lineIt ).parameter( QLatin1String( "label" ) ).isEmpty() ) {
496  address.setLabel( ( *lineIt ).parameter( QLatin1String( "label" ) ) );
497  }
498  addr.insertAddress( address );
499  }
500 
501  // BDAY
502  else if ( identifier == QLatin1String( "bday" ) ) {
503  addr.setBirthday( parseDateTime( ( *lineIt ).value().toString() ) );
504  }
505 
506  // CATEGORIES
507  else if ( identifier == QLatin1String( "categories" ) ) {
508  const QStringList categories = splitString( commaSep, ( *lineIt ).value().toString() );
509  addr.setCategories( categories );
510  }
511 
512  // CLASS
513  else if ( identifier == QLatin1String( "class" ) ) {
514  addr.setSecrecy( parseSecrecy( *lineIt ) );
515  }
516 
517  // EMAIL
518  else if ( identifier == QLatin1String( "email" ) ) {
519  const QStringList types = ( *lineIt ).parameters( QLatin1String( "type" ) );
520  addr.insertEmail( ( *lineIt ).value().toString(),
521  types.contains( QLatin1String( "PREF" ) ) );
522  }
523 
524  // FN
525  else if ( identifier == QLatin1String( "fn" ) ) {
526  addr.setFormattedName( ( *lineIt ).value().toString() );
527  }
528 
529  // GEO
530  else if ( identifier == QLatin1String( "geo" ) ) {
531  Geo geo;
532 
533  const QStringList geoParts =
534  ( *lineIt ).value().toString().split( QLatin1Char( ';' ), QString::KeepEmptyParts );
535  if ( geoParts.size() >= 2 ) {
536  geo.setLatitude( geoParts.at( 0 ).toFloat() );
537  geo.setLongitude( geoParts.at( 1 ).toFloat() );
538  addr.setGeo( geo );
539  }
540  }
541 
542  // KEY
543  else if ( identifier == QLatin1String( "key" ) ) {
544  addr.insertKey( parseKey( *lineIt ) );
545  }
546 
547  // LABEL
548  else if ( identifier == QLatin1String( "label" ) ) {
549  Address::Type type;
550 
551  const QStringList types = ( *lineIt ).parameters( QLatin1String( "type" ) );
552  QStringList::ConstIterator end(types.end());
553  for ( QStringList::ConstIterator it = types.begin(); it != end; ++it ) {
554  type |= mAddressTypeMap[ ( *it ).toLower() ];
555  }
556 
557  bool available = false;
558  KABC::Address::List addressList = addr.addresses();
559  for ( KABC::Address::List::Iterator it = addressList.begin();
560  it != addressList.end(); ++it ) {
561  if ( ( *it ).type() == type ) {
562  ( *it ).setLabel( ( *lineIt ).value().toString() );
563  addr.insertAddress( *it );
564  available = true;
565  break;
566  }
567  }
568 
569  if ( !available ) { // a standalone LABEL tag
570  KABC::Address address( type );
571  address.setLabel( ( *lineIt ).value().toString() );
572  addr.insertAddress( address );
573  }
574  }
575 
576  // LOGO
577  else if ( identifier == QLatin1String( "logo" ) ) {
578  addr.setLogo( parsePicture( *lineIt ) );
579  }
580 
581  // MAILER
582  else if ( identifier == QLatin1String( "mailer" ) ) {
583  addr.setMailer( ( *lineIt ).value().toString() );
584  }
585 
586  // N
587  else if ( identifier == QLatin1String( "n" ) ) {
588  const QStringList nameParts = splitString( semicolonSep, ( *lineIt ).value().toString() );
589  const int numberOfParts( nameParts.count() );
590  if ( numberOfParts > 0 ) {
591  addr.setFamilyName( nameParts.at( 0 ) );
592  }
593  if ( numberOfParts > 1 ) {
594  addr.setGivenName( nameParts.at( 1 ) );
595  }
596  if ( numberOfParts > 2 ) {
597  addr.setAdditionalName( nameParts.at( 2 ) );
598  }
599  if ( numberOfParts > 3 ) {
600  addr.setPrefix( nameParts.at( 3 ) );
601  }
602  if ( numberOfParts > 4 ) {
603  addr.setSuffix( nameParts.at( 4 ) );
604  }
605  if ( !( *lineIt ).parameter( QLatin1String( "sort-as" ) ).isEmpty() ) {
606  addr.setSortString( ( *lineIt ).parameter( QLatin1String( "sort-as" ) ) );
607  }
608  }
609 
610  // NAME
611  else if ( identifier == QLatin1String( "name" ) ) {
612  addr.setName( ( *lineIt ).value().toString() );
613  }
614 
615  // NICKNAME
616  else if ( identifier == QLatin1String( "nickname" ) ) {
617  addr.setNickName( ( *lineIt ).value().toString() );
618  }
619 
620  // NOTE
621  else if ( identifier == QLatin1String( "note" ) ) {
622  addr.setNote( ( *lineIt ).value().toString() );
623  }
624 
625  // ORGANIZATION
626  else if ( identifier == QLatin1String( "org" ) ) {
627  const QStringList orgParts = splitString( semicolonSep, ( *lineIt ).value().toString() );
628  if ( orgParts.count() > 0 ) {
629  addr.setOrganization( orgParts.at( 0 ) );
630  }
631  if ( orgParts.count() > 1 ) {
632  addr.setDepartment( orgParts.at( 1 ) );
633  }
634  if ( !( *lineIt ).parameter( QLatin1String( "sort-as" ) ).isEmpty() ) {
635  addr.setSortString( ( *lineIt ).parameter( QLatin1String( "sort-as" ) ) );
636  }
637  }
638 
639  // PHOTO
640  else if ( identifier == QLatin1String( "photo" ) ) {
641  addr.setPhoto( parsePicture( *lineIt ) );
642  }
643 
644  // PROID
645  else if ( identifier == QLatin1String( "prodid" ) ) {
646  addr.setProductId( ( *lineIt ).value().toString() );
647  }
648 
649  // REV
650  else if ( identifier == QLatin1String( "rev" ) ) {
651  addr.setRevision( parseDateTime( ( *lineIt ).value().toString() ) );
652  }
653 
654  // ROLE
655  else if ( identifier == QLatin1String( "role" ) ) {
656  addr.setRole( ( *lineIt ).value().toString() );
657  }
658 
659  // SORT-STRING
660  else if ( identifier == QLatin1String( "sort-string" ) ) {
661  addr.setSortString( ( *lineIt ).value().toString() );
662  }
663 
664  // SOUND
665  else if ( identifier == QLatin1String( "sound" ) ) {
666  addr.setSound( parseSound( *lineIt ) );
667  }
668 
669  // TEL
670  else if ( identifier == QLatin1String( "tel" ) ) {
671  PhoneNumber phone;
672  phone.setNumber( ( *lineIt ).value().toString() );
673 
674  PhoneNumber::Type type;
675 
676  const QStringList types = ( *lineIt ).parameters( QLatin1String( "type" ) );
677  QStringList::ConstIterator typeEnd( types.end() );
678  for ( QStringList::ConstIterator it = types.begin(); it != typeEnd; ++it ) {
679  type |= mPhoneTypeMap[( *it ).toUpper()];
680  }
681 
682  phone.setType( type );
683 
684  addr.insertPhoneNumber( phone );
685  }
686 
687  // TITLE
688  else if ( identifier == QLatin1String( "title" ) ) {
689  addr.setTitle( ( *lineIt ).value().toString() );
690  }
691 
692  // TZ
693  else if ( identifier == QLatin1String( "tz" ) ) {
694  TimeZone tz;
695  const QString date = ( *lineIt ).value().toString();
696 
697  if ( !date.isEmpty() ) {
698  int hours = date.mid( 1, 2 ).toInt();
699  int minutes = date.mid( 4, 2 ).toInt();
700  int offset = ( hours * 60 ) + minutes;
701  offset = offset * ( date[ 0 ] == QLatin1Char( '+' ) ? 1 : -1 );
702 
703  tz.setOffset( offset );
704  addr.setTimeZone( tz );
705  }
706  }
707 
708  // UID
709  else if ( identifier == QLatin1String( "uid" ) ) {
710  addr.setUid( ( *lineIt ).value().toString() );
711  }
712 
713  // URL
714  else if ( identifier == QLatin1String( "url" ) ) {
715  addr.setUrl( KUrl( ( *lineIt ).value().toString() ) );
716  }
717 
718  // X-
719  else if ( identifier.startsWith( QLatin1String( "x-" ) ) ) {
720  QString ident = ( *lineIt ).identifier();
721  //X-Evolution
722  if ( identifier == QLatin1String( "x-evolution-spouse" ) ||
723  identifier == QLatin1String( "x-spouse" ) ) {
724  ident = QLatin1String( "X-KADDRESSBOOK-X-SpousesName" );
725  } else if ( identifier == QLatin1String( "x-evolution-blog-url" ) ) {
726  ident = QLatin1String( "X-KADDRESSBOOK-BlogFeed" );
727  } else if ( identifier == QLatin1String( "x-evolution-assistant" ) ||
728  identifier == QLatin1String( "x-assistant" ) ) {
729  ident = QLatin1String( "X-KADDRESSBOOK-X-AssistantsName" );
730  } else if ( identifier == QLatin1String( "x-evolution-anniversary" ) ||
731  identifier == QLatin1String( "x-anniversary" ) ) {
732  ident = QLatin1String( "X-KADDRESSBOOK-X-Anniversary" );
733  } else if ( identifier == QLatin1String( "x-evolution-manager" ) ||
734  identifier == QLatin1String( "x-manager" ) ) {
735  ident = QLatin1String( "X-KADDRESSBOOK-X-ManagersName" );
736  } else if ( identifier == QLatin1String( "x-aim" ) ) {
737  ident = QLatin1String( "X-messaging/aim-All" );
738  } else if ( identifier == QLatin1String( "x-icq" ) ) {
739  ident = QLatin1String( "X-messaging/icq-All" );
740  } else if ( identifier == QLatin1String( "x-jabber" ) ) {
741  ident = QLatin1String( "X-messaging/xmpp-All" );
742  } else if ( identifier == QLatin1String( "x-jabber" ) ) {
743  ident = QLatin1String( "X-messaging/xmpp-All" );
744  } else if ( identifier == QLatin1String( "x-msn" ) ) {
745  ident = QLatin1String( "X-messaging/msn-All" );
746  } else if ( identifier == QLatin1String( "x-yahoo" ) ) {
747  ident = QLatin1String( "X-messaging/yahoo-All" );
748  } else if ( identifier == QLatin1String( "x-gadugadu" ) ) {
749  ident = QLatin1String( "X-messaging/gadu-All" );
750  } else if ( identifier == QLatin1String( "x-skype" ) ) {
751  ident = QLatin1String( "X-messaging/skype-All" );
752  } else if ( identifier == QLatin1String( "x-groupwise" ) ) {
753  ident = QLatin1String( "X-messaging/groupwise-All" );
754  } else if ( identifier == QLatin1String( "x-sms" ) ) {
755  ident = QLatin1String( "X-messaging/sms-All" );
756  } else if ( identifier == QLatin1String( "x-meanwhile" ) ) {
757  ident = QLatin1String( "X-messaging/meanwhile-All" );
758  } else if ( identifier == QLatin1String( "x-irc" ) ) {
759  ident = QLatin1String( "X-messaging/irc-All" );
760  } else if ( identifier == QLatin1String( "x-googletalk" ) ) {
761  ident = QLatin1String( "X-messaging/googletalk-All" );
762  }
763 
764  const QString key = ident.mid( 2 );
765  const int dash = key.indexOf( QLatin1Char( '-' ) );
766  addr.insertCustom( key.left( dash ), key.mid( dash + 1 ),
767  ( *lineIt ).value().toString() );
768  }
769  }
770  }
771 
772  addrList.append( addr );
773  }
774 
775  return addrList;
776 }
777 
778 QDateTime VCardTool::parseDateTime( const QString &str ) const
779 {
780  QDate date;
781  QTime time;
782 
783  if ( str.indexOf( QLatin1Char( '-' ) ) == -1 ) { // is base format (yyyymmdd)
784  date = QDate( str.left( 4 ).toInt(), str.mid( 4, 2 ).toInt(),
785  str.mid( 6, 2 ).toInt() );
786  } else { // is extended format yyyy-mm-dd
787  date = QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(),
788  str.mid( 8, 2 ).toInt() );
789  }
790 
791  // does it also contain a time ? (Note: mm, ss are optional according ISO-8601)
792  int timeStart = str.indexOf( QLatin1Char( 'T' ) );
793  if ( timeStart >= 0 ) {
794  int hour = 0, minute = 0, second = 0;
795 
796  hour = str.mid( timeStart + 1, 2 ).toInt(); // hour must always be given
797 
798  if ( str.indexOf( QLatin1Char( ':' ), timeStart + 1 ) > 0 ) { // extended format (hh:mm:ss)
799  if ( str.length() >= ( timeStart + 5 ) ) {
800  minute = str.mid( timeStart + 4, 2 ).toInt();
801  if ( str.length() >= ( timeStart + 8 ) ) {
802  second = str.mid( timeStart + 7, 2 ).toInt();
803  }
804  }
805  } else { // basic format (hhmmss)
806  if ( str.length() >= ( timeStart + 4 ) ) {
807  minute = str.mid( timeStart + 3, 2 ).toInt();
808  if ( str.length() >= ( timeStart + 6 ) ) {
809  second = str.mid( timeStart + 5, 2 ).toInt();
810  }
811  }
812  }
813 
814  time = QTime( hour, minute, second );
815  }
816 
817  Qt::TimeSpec spec = ( str.right( 1 ) == QLatin1String( "Z" ) ) ? Qt::UTC : Qt::LocalTime;
818 
819  QDateTime dateTime( date );
820 
821  // explicitly set the time, which might be invalid, to keep the information
822  // that the time is invalid. In createDateTime() the time/invalid flag is
823  // checked which omits then to print the timestamp
824  // This is needed to reproduce the given string in input
825  // e.g. BDAY:2008-12-30
826  // without time shall also result in a string without a time
827  dateTime.setTime( time );
828 
829  dateTime.setTimeSpec( spec );
830  return dateTime;
831 }
832 
833 QString VCardTool::createDateTime( const QDateTime &dateTime ) const
834 {
835  QString str;
836 
837  if ( dateTime.date().isValid() ) {
838  str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(),
839  dateTime.date().day() );
840  if ( dateTime.time().isValid() ) {
841  QString tmp;
842  tmp.sprintf( "T%02d:%02d:%02d", dateTime.time().hour(), dateTime.time().minute(),
843  dateTime.time().second() );
844  str += tmp;
845 
846  if ( dateTime.timeSpec() == Qt::UTC ) {
847  str += QLatin1Char( 'Z' );
848  }
849  }
850  }
851 
852  return str;
853 }
854 
855 Picture VCardTool::parsePicture( const VCardLine &line ) const
856 {
857  Picture pic;
858 
859  const QStringList params = line.parameterList();
860  QString type;
861  if ( params.contains( QLatin1String( "type" ) ) ) {
862  type = line.parameter( QLatin1String( "type" ) );
863  }
864  if ( params.contains( QLatin1String( "encoding" ) ) ) {
865  pic.setRawData( line.value().toByteArray(), type );
866  } else if ( params.contains( QLatin1String( "value" ) ) ) {
867  if ( line.parameter( QLatin1String( "value" ) ).toLower() == QLatin1String( "uri" ) ) {
868  pic.setUrl( line.value().toString() );
869  }
870  }
871 
872  return pic;
873 }
874 
875 VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic ) const
876 {
877  VCardLine line( identifier );
878 
879  if ( pic.isEmpty() ) {
880  return line;
881  }
882 
883  if ( pic.isIntern() ) {
884  line.setValue( pic.rawData() );
885  line.addParameter( QLatin1String( "encoding" ), QLatin1String( "b" ) );
886  line.addParameter( QLatin1String( "type" ), pic.type() );
887  } else {
888  line.setValue( pic.url() );
889  line.addParameter( QLatin1String( "value" ), QLatin1String( "URI" ) );
890  }
891 
892  return line;
893 }
894 
895 Sound VCardTool::parseSound( const VCardLine &line ) const
896 {
897  Sound snd;
898 
899  const QStringList params = line.parameterList();
900  if ( params.contains( QLatin1String( "encoding" ) ) ) {
901  snd.setData( line.value().toByteArray() );
902  } else if ( params.contains( QLatin1String( "value" ) ) ) {
903  if ( line.parameter( QLatin1String( "value" ) ).toLower() == QLatin1String( "uri" ) ) {
904  snd.setUrl( line.value().toString() );
905  }
906  }
907 
908 /* TODO: support sound types
909  if ( params.contains( "type" ) )
910  snd.setType( line.parameter( "type" ) );
911 */
912 
913  return snd;
914 }
915 
916 VCardLine VCardTool::createSound( const Sound &snd ) const
917 {
918  VCardLine line( QLatin1String( "SOUND" ) );
919 
920  if ( snd.isIntern() ) {
921  if ( !snd.data().isEmpty() ) {
922  line.setValue( snd.data() );
923  line.addParameter( QLatin1String( "encoding" ), QLatin1String( "b" ) );
924  // TODO: need to store sound type!!!
925  }
926  } else if ( !snd.url().isEmpty() ) {
927  line.setValue( snd.url() );
928  line.addParameter( QLatin1String( "value" ), QLatin1String( "URI" ) );
929  }
930 
931  return line;
932 }
933 
934 Key VCardTool::parseKey( const VCardLine &line ) const
935 {
936  Key key;
937 
938  const QStringList params = line.parameterList();
939  if ( params.contains( QLatin1String( "encoding" ) ) ) {
940  key.setBinaryData( line.value().toByteArray() );
941  } else {
942  key.setTextData( line.value().toString() );
943  }
944 
945  if ( params.contains( QLatin1String( "type" ) ) ) {
946  if ( line.parameter( QLatin1String( "type" ) ).toLower() == QLatin1String( "x509" ) ) {
947  key.setType( Key::X509 );
948  } else if ( line.parameter( QLatin1String( "type" ) ).toLower() == QLatin1String( "pgp" ) ) {
949  key.setType( Key::PGP );
950  } else {
951  key.setType( Key::Custom );
952  key.setCustomTypeString( line.parameter( QLatin1String( "type" ) ) );
953  }
954  }
955 
956  return key;
957 }
958 
959 VCardLine VCardTool::createKey( const Key &key ) const
960 {
961  VCardLine line( QLatin1String( "KEY" ) );
962 
963  if ( key.isBinary() ) {
964  if ( !key.binaryData().isEmpty() ) {
965  line.setValue( key.binaryData() );
966  line.addParameter( QLatin1String( "encoding" ), QLatin1String( "b" ) );
967  }
968  } else if ( !key.textData().isEmpty() ) {
969  line.setValue( key.textData() );
970  }
971 
972  if ( key.type() == Key::X509 ) {
973  line.addParameter( QLatin1String( "type" ), QLatin1String( "X509" ) );
974  } else if ( key.type() == Key::PGP ) {
975  line.addParameter( QLatin1String( "type" ), QLatin1String( "PGP" ) );
976  } else if ( key.type() == Key::Custom ) {
977  line.addParameter( QLatin1String( "type" ), key.customTypeString() );
978  }
979 
980  return line;
981 }
982 
983 Secrecy VCardTool::parseSecrecy( const VCardLine &line ) const
984 {
985  Secrecy secrecy;
986 
987  const QString value = line.value().toString().toLower();
988  if ( value == QLatin1String( "public" ) ) {
989  secrecy.setType( Secrecy::Public );
990  } else if ( value == QLatin1String( "private" ) ) {
991  secrecy.setType( Secrecy::Private );
992  } else if ( value == QLatin1String( "confidential" ) ) {
993  secrecy.setType( Secrecy::Confidential );
994  }
995 
996  return secrecy;
997 }
998 
999 VCardLine VCardTool::createSecrecy( const Secrecy &secrecy ) const
1000 {
1001  VCardLine line( QLatin1String( "CLASS" ) );
1002 
1003  int type = secrecy.type();
1004 
1005  if ( type == Secrecy::Public ) {
1006  line.setValue( QLatin1String( "PUBLIC" ) );
1007  } else if ( type == Secrecy::Private ) {
1008  line.setValue( QLatin1String( "PRIVATE" ) );
1009  } else if ( type == Secrecy::Confidential ) {
1010  line.setValue( QLatin1String( "CONFIDENTIAL" ) );
1011  }
1012 
1013  return line;
1014 }
1015 
1016 QStringList VCardTool::splitString( const QChar &sep, const QString &str ) const
1017 {
1018  QStringList list;
1019  QString value( str );
1020 
1021  int start = 0;
1022  int pos = value.indexOf( sep, start );
1023 
1024  while ( pos != -1 ) {
1025  if ( pos == 0 || value[ pos - 1 ] != QLatin1Char( '\\' ) ) {
1026  if ( pos > start && pos <= (int)value.length() ) {
1027  list << value.mid( start, pos - start );
1028  } else {
1029  list << QString();
1030  }
1031 
1032  start = pos + 1;
1033  pos = value.indexOf( sep, start );
1034  } else {
1035  value.replace( pos - 1, 2, sep );
1036  pos = value.indexOf( sep, pos );
1037  }
1038  }
1039 
1040  int l = value.length() - 1;
1041  if ( value.mid( start, l - start + 1 ).length() > 0 ) {
1042  list << value.mid( start, l - start + 1 );
1043  } else {
1044  list << QString();
1045  }
1046 
1047  return list;
1048 }
KABC::Sound
Class that holds a Sound clip for a contact.
Definition: sound.h:58
KABC::PhoneNumber::Pcs
Personal Communication Service.
Definition: phonenumber.h:60
KABC::Key::List
QList< Key > List
List of keys.
Definition: key.h:43
KABC::Address::Dom
domestic
Definition: address.h:52
KABC::Key::textData
QString textData() const
Returns the text data.
Definition: key.cpp:148
KABC::Address::setType
void setType(Type type)
Sets the type of address.
Definition: address.cpp:322
KABC::Address
Postal address information.
Definition: address.h:37
KABC::Addressee::setNickName
void setNickName(const QString &nickName)
Set nick name.
Definition: addressee.cpp:527
KABC::Key::PGP
Pretty Good Privacy key.
Definition: key.h:50
KABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:38
KABC::PhoneNumber::Voice
Voice.
Definition: phonenumber.h:52
KABC::Key::setBinaryData
void setBinaryData(const QByteArray &data)
Sets binary data.
Definition: key.cpp:131
KABC::Sound::setData
void setData(const QByteArray &data)
Sets the raw data of the sound.
Definition: sound.cpp:116
KABC::Picture
A class to store a picture of an addressee.
Definition: picture.h:39
KABC::Addressee::insertEmail
void insertEmail(const QString &email, bool preferred=false)
Insert an email address.
Definition: addressee.cpp:1231
KABC::Sound::setUrl
void setUrl(const QString &url)
Sets a URL for the location of the sound file.
Definition: sound.cpp:110
KABC::Addressee::setMailer
void setMailer(const QString &mailer)
Set mail client.
Definition: addressee.cpp:705
KABC::Addressee::insertPhoneNumber
void insertPhoneNumber(const PhoneNumber &phoneNumber)
Insert a phone number.
Definition: addressee.cpp:1276
KABC::Address::Pref
preferred address
Definition: address.h:58
KABC::Geo::setLongitude
void setLongitude(float longitude)
Sets the longitude.
Definition: geo.cpp:90
KABC::AddresseeList
a QValueList of Addressee, with sorting functionality
Definition: addresseelist.h:288
KABC::Addressee::setSuffix
void setSuffix(const QString &suffix)
Set honorific suffixes.
Definition: addressee.cpp:507
KABC::Addressee::setPhoto
void setPhoto(const Picture &photo)
Set photo.
Definition: addressee.cpp:985
KABC::Addressee::setFormattedName
void setFormattedName(const QString &formattedName)
Set formatted name.
Definition: addressee.cpp:407
KABC::Key::setTextData
void setTextData(const QString &data)
Sets text data.
Definition: key.cpp:142
KABC::Key::binaryData
QByteArray binaryData() const
Returns the binary data.
Definition: key.cpp:137
KABC::Key
A class to store an encryption key.
Definition: key.h:34
KABC::Addressee::setRole
void setRole(const QString &role)
Set role.
Definition: addressee.cpp:785
KABC::TimeZone::setOffset
void setOffset(int offset)
Set time zone offset relative to UTC.
Definition: timezone.cpp:66
KABC::Geo::setLatitude
void setLatitude(float latitude)
Sets the latitude.
Definition: geo.cpp:74
KABC::Geo::longitude
float longitude() const
Returns the longitude.
Definition: geo.cpp:101
KABC::Addressee::setCategories
void setCategories(const QStringList &)
Set categories to given value.
Definition: addressee.cpp:1613
KABC::Addressee::setGivenName
void setGivenName(const QString &givenName)
Set given name.
Definition: addressee.cpp:447
KABC::Key::isBinary
bool isBinary() const
Returns whether the key contains binary or text data.
Definition: key.cpp:153
KABC::TimeZone::isValid
bool isValid() const
Return, if this time zone object is valid.
Definition: timezone.cpp:77
KABC::Key::X509
X509 key.
Definition: key.h:49
KABC::Address::setStreet
void setStreet(const QString &street)
Sets the street (including house number).
Definition: address.cpp:388
KABC::PhoneNumber::Bbs
Mailbox.
Definition: phonenumber.h:56
KABC::Addressee::setSortString
void setSortString(const QString &sortString)
Set sort string.
Definition: addressee.cpp:905
KABC::Addressee::setAdditionalName
void setAdditionalName(const QString &additionalName)
Set additional names.
Definition: addressee.cpp:467
KABC::Addressee::setLogo
void setLogo(const Picture &logo)
Set logo.
Definition: addressee.cpp:965
KABC::Picture::rawData
QByteArray rawData() const
Returns the raw data of this picture.
Definition: picture.cpp:203
KABC::PhoneNumber::Fax
Fax machine.
Definition: phonenumber.h:53
KABC::Addressee::setFamilyName
void setFamilyName(const QString &familyName)
Set family name.
Definition: addressee.cpp:427
KABC::Addressee::addresses
Address::List addresses() const
Return list of all addresses.
Definition: addressee.cpp:1559
KABC::Address::Home
home address
Definition: address.h:56
KABC::Key::Custom
Custom or IANA conform key.
Definition: key.h:51
KABC::Addressee::setPrefix
void setPrefix(const QString &prefix)
Set honorific prefixes.
Definition: addressee.cpp:487
KABC::Address::Parcel
parcel
Definition: address.h:55
KABC::Picture::setRawData
void setRawData(const QByteArray &rawData, const QString &type)
Sets the raw data of the picture.
Definition: picture.cpp:171
KABC::Picture::url
QString url() const
Returns the location URL of this picture.
Definition: picture.cpp:189
KABC::PhoneNumber::Cell
Cell phone.
Definition: phonenumber.h:54
KABC::Address::Postal
postal
Definition: address.h:54
KABC::Addressee::setTitle
void setTitle(const QString &title)
Set title.
Definition: addressee.cpp:765
KABC::PhoneNumber::setType
void setType(Type type)
Sets the type.
Definition: phonenumber.cpp:133
KABC::Addressee::setDepartment
void setDepartment(const QString &department)
Set department.
Definition: addressee.cpp:825
KABC::PhoneNumber::setNumber
void setNumber(const QString &number)
Sets the phone number.
Definition: phonenumber.cpp:123
KABC::PhoneNumber::List
QList< PhoneNumber > List
List of phone numbers.
Definition: phonenumber.h:74
KABC::Geo::latitude
float latitude() const
Returns the latitude.
Definition: geo.cpp:85
KABC::Address::setPostOfficeBox
void setPostOfficeBox(const QString &postOfficeBox)
Sets the post office box.
Definition: address.cpp:356
KABC::Addressee::setSound
void setSound(const Sound &sound)
Set sound.
Definition: addressee.cpp:1005
KABC::TimeZone::offset
int offset() const
Return offset in minutes relative to UTC.
Definition: timezone.cpp:72
KABC::Addressee::setUid
void setUid(const QString &uid)
Set unique identifier.
Definition: addressee.cpp:368
KABC::Addressee::insertKey
void insertKey(const Key &key)
Insert a key.
Definition: addressee.cpp:1350
KABC::Sound::data
QByteArray data() const
Returns the raw data of this sound.
Definition: sound.cpp:138
KABC::Geo::isValid
bool isValid() const
Returns, whether this object contains a valid geographical position.
Definition: geo.cpp:106
KABC::PhoneNumber::Modem
Modem.
Definition: phonenumber.h:57
KABC::TimeZone
Time zone information.
Definition: timezone.h:35
KABC::Addressee::setOrganization
void setOrganization(const QString &organization)
Set organization.
Definition: addressee.cpp:805
KABC::Addressee::setGeo
void setGeo(const Geo &geo)
Set geographic position.
Definition: addressee.cpp:745
KABC::Addressee::setUrl
void setUrl(const KUrl &url)
Set homepage.
Definition: addressee.cpp:925
KABC::PhoneNumber::Msg
Messaging.
Definition: phonenumber.h:50
KABC::Address::List
QList< Address > List
List of addresses.
Definition: address.h:46
KABC::Address::setRegion
void setRegion(const QString &region)
Sets the region, e.g.
Definition: address.cpp:420
KABC::Key::setCustomTypeString
void setCustomTypeString(const QString &type)
Sets custom type string.
Definition: key.cpp:163
KABC::PhoneNumber::Video
Video phone.
Definition: phonenumber.h:55
KABC::PhoneNumber::Home
Home number.
Definition: phonenumber.h:48
KABC::Addressee::setName
void setName(const QString &name)
Set name.
Definition: addressee.cpp:387
KABC::Address::setLabel
void setLabel(const QString &label)
Sets the delivery label.
Definition: address.cpp:468
KABC::Addressee
address book entry
Definition: addressee.h:74
KABC::Addressee::setNote
void setNote(const QString &note)
Set note.
Definition: addressee.cpp:845
KABC::PhoneNumber::Work
Office number.
Definition: phonenumber.h:49
KABC::Addressee::insertAddress
void insertAddress(const Address &address)
Insert an address.
Definition: addressee.cpp:1512
KABC::Address::Intl
international
Definition: address.h:53
KABC::Picture::isEmpty
bool isEmpty() const
Returns true, if the picture is empty.
Definition: picture.cpp:136
KABC::Addressee::insertCustom
void insertCustom(const QString &app, const QString &name, const QString &value)
Insert custom entry.
Definition: addressee.cpp:1625
KABC::Key::setType
void setType(Type type)
Sets the type.
Definition: key.cpp:158
KABC::Address::setCountry
void setCountry(const QString &country)
Sets the country.
Definition: address.cpp:452
KABC::Addressee::setRevision
void setRevision(const QDateTime &revision)
Set revision date.
Definition: addressee.cpp:885
KABC::Geo
Geographic position.
Definition: geo.h:35
KABC::Picture::type
QString type() const
Returns the type of this picture.
Definition: picture.cpp:216
KABC::Addressee::setProductId
void setProductId(const QString &productId)
Set product identifier.
Definition: addressee.cpp:865
KABC
Definition: address.h:29
KABC::Picture::setUrl
void setUrl(const QString &url)
Sets a URL for the location of the picture file.
Definition: picture.cpp:143
KABC::Key::customTypeString
QString customTypeString() const
Returns the custom type string.
Definition: key.cpp:173
KABC::Address::setLocality
void setLocality(const QString &locality)
Sets the locality, e.g.
Definition: address.cpp:404
KABC::PhoneNumber::Pager
Pager.
Definition: phonenumber.h:61
KABC::Address::setPostalCode
void setPostalCode(const QString &code)
Sets the postal code.
Definition: address.cpp:436
KABC::Address::setExtended
void setExtended(const QString &extended)
Sets the extended address information.
Definition: address.cpp:372
KABC::Address::Work
address at work
Definition: address.h:57
KABC::Addressee::setBirthday
void setBirthday(const QDateTime &birthday)
Set birthday.
Definition: addressee.cpp:547
KABC::PhoneNumber::Pref
Preferred number.
Definition: phonenumber.h:51
KABC::Sound::isIntern
bool isIntern() const
Returns whether the sound is described by a URL (extern) or by the raw data (intern).
Definition: sound.cpp:122
KABC::PhoneNumber::Car
Car phone.
Definition: phonenumber.h:58
KABC::Addressee::setTimeZone
void setTimeZone(const TimeZone &timeZone)
Set time zone.
Definition: addressee.cpp:725
KABC::PhoneNumber::Isdn
ISDN connection.
Definition: phonenumber.h:59
KABC::Key::type
Type type() const
Returns the type, see Type.
Definition: key.cpp:168
KABC::Geo::toString
QString toString() const
Returns string representation of geographical position.
Definition: geo.cpp:142
KABC::Picture::isIntern
bool isIntern() const
Returns whether the picture is described by a URL (extern) or by the raw data (intern).
Definition: picture.cpp:184
KABC::Addressee::setSecrecy
void setSecrecy(const Secrecy &secrecy)
Set security class.
Definition: addressee.cpp:945
KABC::Sound::url
QString url() const
Returns the location URL of this sound.
Definition: sound.cpp:133
KABC::TimeZone::toString
QString toString() const
Return string representation of time zone offset.
Definition: timezone.cpp:113
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Fri Nov 14 2014 05:54:38 by doxygen 1.8.8 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kabc

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

kdepimlibs-4.14.3 API Reference

Skip menu "kdepimlibs-4.14.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal