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

kabc

  • kabc
  • plugins
  • ldapkio
resourceldapkio.cpp
1// -*- c-basic-offset: 2 -*-
2/*
3 This file is part of libkabc.
4 Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
5 Copyright (c) 2004 Szombathelyi György <gyurco@freemail.hu>
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21*/
22#include "resourceldapkio.h"
23#include "resourceldapkioconfig.h"
24
25#include "kldap/ldif.h"
26#include "kldap/ldapdn.h"
27#include "kldap/ldapurl.h"
28
29#include <kio/netaccess.h>
30#include <kio/udsentry.h>
31#include <kdebug.h>
32#include <kde_file.h>
33#include <kglobal.h>
34#include <kstandarddirs.h>
35#include <klineedit.h>
36#include <klocalizedstring.h>
37#include <kconfig.h>
38#include <kstringhandler.h>
39#include <ktemporaryfile.h>
40
41#include <QtCore/QBuffer>
42#include <QtCore/QEventLoop>
43#include <QtCore/QFile>
44
45#include <stdlib.h>
46
47using namespace KABC;
48
49class ResourceLDAPKIO::Private
50{
51 public:
52 Private( ResourceLDAPKIO *parent )
53 : mParent( parent ), mPort( 389 ), mAnonymous( true ), mTLS( false ),
54 mSSL( false ), mSubTree( false ), mSASL( false ), mVer( 3 ),
55 mRDNPrefix( 0 ), mTimeLimit( 0 ), mSizeLimit( 0 ),
56 mCachePolicy( Cache_No ), mAutoCache( true )
57 {
58 KGlobal::locale()->insertCatalog( QLatin1String( "libkldap" ) );
59 }
60
61 KIO::TransferJob *loadFromCache();
62 void createCache();
63 void activateCache();
64 void enter_loop();
65 QByteArray addEntry( const QString &attr, const QString &value, bool mod );
66 QString findUid( const QString &uid );
67 bool AddresseeToLDIF( QByteArray &ldif, const Addressee &addr, const QString &olddn );
68
69 ResourceLDAPKIO *mParent;
70 QString mUser;
71 QString mPassword;
72 QString mDn;
73 QString mHost;
74 QString mFilter;
75 int mPort;
76 bool mAnonymous;
77 QMap<QString, QString> mAttributes;
78
79 QString mErrorMsg;
80
81 KLDAP::Ldif mLdif;
82 bool mTLS, mSSL, mSubTree;
83 QString mResultDn;
84 Addressee mAddr;
85 Address mAd;
86 Resource::Iterator mSaveIt;
87 bool mSASL;
88 QString mMech;
89 QString mRealm, mBindDN;
90 KLDAP::LdapUrl mLDAPUrl;
91 int mVer;
92 int mRDNPrefix;
93 int mTimeLimit;
94 int mSizeLimit;
95 int mError;
96 int mCachePolicy;
97 bool mReadOnly;
98 bool mAutoCache;
99 QString mCacheDst;
100 KTemporaryFile *mTmp;
101};
102
103ResourceLDAPKIO::ResourceLDAPKIO()
104 : Resource(), d( new Private( this ) )
105{
106 d->mCacheDst = KGlobal::dirs()->saveLocation( "cache", QLatin1String( "ldapkio" ) ) +
107 QLatin1Char( '/' ) + type() + QLatin1Char( '_' ) + identifier();
108 init();
109}
110
111ResourceLDAPKIO::ResourceLDAPKIO( const KConfigGroup &group )
112 : Resource( group ), d( new Private( this ) )
113{
114 QMap<QString, QString> attrList;
115 QStringList attributes = group.readEntry( "LdapAttributes", QStringList() );
116 for ( int pos = 0; pos < attributes.count(); pos += 2 ) {
117 d->mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
118 }
119
120 d->mUser = group.readEntry( "LdapUser" );
121 d->mPassword = KStringHandler::obscure( group.readEntry( "LdapPassword" ) );
122 d->mDn = group.readEntry( "LdapDn" );
123 d->mHost = group.readEntry( "LdapHost" );
124 d->mPort = group.readEntry( "LdapPort", 389 );
125 d->mFilter = group.readEntry( "LdapFilter" );
126 d->mAnonymous = group.readEntry( "LdapAnonymous", false );
127 d->mTLS = group.readEntry( "LdapTLS", false );
128 d->mSSL = group.readEntry( "LdapSSL", false );
129 d->mSubTree = group.readEntry( "LdapSubTree", false );
130 d->mSASL = group.readEntry( "LdapSASL", false );
131 d->mMech = group.readEntry( "LdapMech" );
132 d->mRealm = group.readEntry( "LdapRealm" );
133 d->mBindDN = group.readEntry( "LdapBindDN" );
134 d->mVer = group.readEntry( "LdapVer", 3 );
135 d->mTimeLimit = group.readEntry( "LdapTimeLimit", 0 );
136 d->mSizeLimit = group.readEntry( "LdapSizeLimit", 0 );
137 d->mRDNPrefix = group.readEntry( "LdapRDNPrefix", 0 );
138 d->mCachePolicy = group.readEntry( "LdapCachePolicy", 0 );
139 d->mAutoCache = group.readEntry( "LdapAutoCache", true );
140 d->mCacheDst = KGlobal::dirs()->saveLocation(
141 "cache", QLatin1String( "ldapkio" ) ) + QLatin1Char( '/' ) +
142 type() + QLatin1Char( '_' ) + identifier();
143 init();
144}
145
146ResourceLDAPKIO::~ResourceLDAPKIO()
147{
148 delete d;
149}
150
151void ResourceLDAPKIO::Private::enter_loop()
152{
153 QEventLoop eventLoop;
154 mParent->connect( mParent, SIGNAL(leaveModality()), &eventLoop, SLOT(quit()) );
155 eventLoop.exec( QEventLoop::ExcludeUserInputEvents );
156}
157
158void ResourceLDAPKIO::entries( KIO::Job *, const KIO::UDSEntryList &list )
159{
160 KIO::UDSEntryList::ConstIterator it = list.begin();
161 KIO::UDSEntryList::ConstIterator end = list.end();
162 for ( ; it != end; ++it ) {
163 const QString urlStr = ( *it ).stringValue( KIO::UDSEntry::UDS_URL );
164 if ( !urlStr.isEmpty() ) {
165 KUrl tmpurl( urlStr );
166 d->mResultDn = tmpurl.path();
167 kDebug() << "findUid():" << d->mResultDn;
168 if ( d->mResultDn.startsWith( QLatin1Char( '/' ) ) ) {
169 d->mResultDn.remove( 0, 1 );
170 }
171 return;
172 }
173 }
174}
175
176void ResourceLDAPKIO::listResult( KJob *job )
177{
178 d->mError = job->error();
179 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
180 d->mErrorMsg = job->errorString();
181 } else {
182 d->mErrorMsg.clear();
183 }
184 emit leaveModality();
185}
186
187QString ResourceLDAPKIO::Private::findUid( const QString &uid )
188{
189 KLDAP::LdapUrl url( mLDAPUrl );
190 KIO::UDSEntry entry;
191
192 mErrorMsg.clear();
193 mResultDn.clear();
194
195 url.setAttributes( QStringList( QLatin1String( "dn" ) ) );
196 url.setFilter( QLatin1Char( '(' ) + mAttributes[ QLatin1String( "uid" ) ] +
197 QLatin1Char( '=' ) + uid + QLatin1Char( ')' ) + mFilter );
198 url.setExtension( QLatin1String( "x-dir" ), QLatin1String( "one" ) );
199
200 kDebug() << uid << "url" << url.prettyUrl();
201
202 KIO::ListJob *listJob = KIO::listDir( url, KIO::HideProgressInfo );
203 mParent->connect( listJob, SIGNAL(entries(KIO::Job*,KIO::UDSEntryList)),
204 SLOT(entries(KIO::Job*,KIO::UDSEntryList)) );
205 mParent->connect( listJob, SIGNAL(result(KJob*)),
206 mParent, SLOT(listResult(KJob*)) );
207
208 enter_loop();
209 return mResultDn;
210}
211
212QByteArray ResourceLDAPKIO::Private::addEntry( const QString &attr, const QString &value, bool mod )
213{
214 QByteArray tmp;
215 if ( !attr.isEmpty() ) {
216 if ( mod ) {
217 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "replace" ), attr ) + '\n';
218 }
219 if ( !value.isEmpty() ) {
220 tmp += KLDAP::Ldif::assembleLine( attr, value ) + '\n';
221 }
222 if ( mod ) {
223 tmp += "-\n";
224 }
225 }
226 return tmp;
227}
228
229bool ResourceLDAPKIO::Private::AddresseeToLDIF( QByteArray &ldif, const Addressee &addr,
230 const QString &olddn )
231{
232 QByteArray tmp;
233 QString dn;
234 QByteArray data;
235 bool mod = false;
236
237 if ( olddn.isEmpty() ) {
238 //insert new entry
239 switch ( mRDNPrefix ) {
240 case 1:
241 dn = mAttributes[ QLatin1String( "uid" ) ] +
242 QLatin1Char( '=' ) + addr.uid() + QLatin1Char( ',' ) + mDn;
243 break;
244 case 0:
245 default:
246 dn = mAttributes[ QLatin1String( "commonName" ) ] +
247 QLatin1Char( '=' ) + addr.assembledName() + QLatin1Char( ',' ) + mDn;
248 break;
249 }
250 } else {
251 //modify existing entry
252 mod = true;
253 if ( olddn.startsWith( mAttributes[ QLatin1String( "uid" ) ] ) ) {
254 dn = mAttributes[ QLatin1String( "uid" ) ] + QLatin1Char( '=' ) + addr.uid() +
255 QLatin1Char( ',' ) + olddn.section( QLatin1Char( ',' ), 1 );
256 } else if ( olddn.startsWith( mAttributes[ QLatin1String( "commonName" ) ] ) ) {
257 dn = mAttributes[ QLatin1String( "commonName" ) ] +
258 QLatin1Char( '=' ) + addr.assembledName()
259 + QLatin1Char( ',' ) + olddn.section( QLatin1Char( ',' ), 1 );
260 } else {
261 dn = olddn;
262 }
263
264 if ( olddn.toLower() != dn.toLower() ) {
265 tmp = KLDAP::Ldif::assembleLine( QLatin1String( "dn" ), olddn ) + '\n';
266 tmp += "changetype: modrdn\n";
267 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "newrdn" ),
268 dn.section( QLatin1Char( ',' ), 0, 0 ) ) + '\n';
269 tmp += "deleteoldrdn: 1\n\n";
270 }
271 }
272
273 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "dn" ), dn ) + '\n';
274 if ( mod ) {
275 tmp += "changetype: modify\n";
276 }
277 if ( !mod ) {
278 tmp += "objectClass: top\n";
279 const QStringList obclass =
280 mAttributes[ QLatin1String( "objectClass" ) ].split( QLatin1Char( ',' ),
281 QString::SkipEmptyParts );
282 for ( QStringList::const_iterator it = obclass.constBegin(); it != obclass.constEnd(); ++it ) {
283 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "objectClass" ), *it ) + '\n';
284 }
285 }
286
287 tmp += addEntry( mAttributes[ QLatin1String( "commonName" ) ], addr.assembledName(), mod );
288 tmp += addEntry( mAttributes[ QLatin1String( "formattedName" ) ], addr.formattedName(), mod );
289 tmp += addEntry( mAttributes[ QLatin1String( "givenName" ) ], addr.givenName(), mod );
290 tmp += addEntry( mAttributes[ QLatin1String( "familyName" ) ], addr.familyName(), mod );
291 tmp += addEntry( mAttributes[ QLatin1String( "uid" ) ], addr.uid(), mod );
292
293 PhoneNumber number;
294 number = addr.phoneNumber( PhoneNumber::Home );
295 tmp += addEntry( mAttributes[ QLatin1String( "phoneNumber" ) ], number.number(), mod );
296 number = addr.phoneNumber( PhoneNumber::Work );
297 tmp += addEntry( mAttributes[ QLatin1String( "telephoneNumber" ) ], number.number(), mod );
298 number = addr.phoneNumber( PhoneNumber::Fax );
299 tmp += addEntry( mAttributes[ QLatin1String( "facsimileTelephoneNumber" ) ],
300 number.number(), mod );
301 number = addr.phoneNumber( PhoneNumber::Cell );
302 tmp += addEntry( mAttributes[ QLatin1String( "mobile" ) ], number.number(), mod );
303 number = addr.phoneNumber( PhoneNumber::Pager );
304 tmp += addEntry( mAttributes[ QLatin1String( "pager" ) ], number.number(), mod );
305
306 tmp += addEntry( mAttributes[ QLatin1String( "description" ) ], addr.note(), mod );
307 tmp += addEntry( mAttributes[ QLatin1String( "title" ) ], addr.title(), mod );
308 tmp += addEntry( mAttributes[ QLatin1String( "organization" ) ], addr.organization(), mod );
309
310 Address ad = addr.address( Address::Home );
311 if ( !ad.isEmpty() ) {
312 tmp += addEntry( mAttributes[ QLatin1String( "street" ) ], ad.street(), mod );
313 tmp += addEntry( mAttributes[ QLatin1String( "state" ) ], ad.region(), mod );
314 tmp += addEntry( mAttributes[ QLatin1String( "city" ) ], ad.locality(), mod );
315 tmp += addEntry( mAttributes[ QLatin1String( "postalcode" ) ], ad.postalCode(), mod );
316 }
317
318 QStringList emails = addr.emails();
319 QStringList::ConstIterator mailIt = emails.constBegin();
320
321 if ( !mAttributes[ QLatin1String( "mail" ) ].isEmpty() ) {
322 if ( mod ) {
323 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "replace" ),
324 mAttributes[ QLatin1String( "mail" ) ] ) + '\n';
325 }
326 if ( mailIt != emails.constEnd() ) {
327 tmp += KLDAP::Ldif::assembleLine( mAttributes[ QLatin1String( "mail" ) ], *mailIt ) + '\n';
328 mailIt ++;
329 }
330 if ( mod &&
331 mAttributes[ QLatin1String( "mail" ) ] != mAttributes[ QLatin1String( "mailAlias" ) ] ) {
332 tmp += "-\n";
333 }
334 }
335
336 if ( !mAttributes[ QLatin1String( "mailAlias" ) ].isEmpty() ) {
337 if ( mod &&
338 mAttributes[ QLatin1String( "mail" ) ] != mAttributes[ QLatin1String( "mailAlias" ) ] ) {
339 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "replace" ),
340 mAttributes[ QLatin1String( "mailAlias" ) ] ) + '\n';
341 }
342 for ( ; mailIt != emails.constEnd(); ++mailIt ) {
343 tmp += KLDAP::Ldif::assembleLine(
344 mAttributes[ QLatin1String( "mailAlias" ) ], *mailIt ) + '\n';
345 }
346 if ( mod ) {
347 tmp += "-\n";
348 }
349 }
350
351 if ( !mAttributes[ QLatin1String( "jpegPhoto" ) ].isEmpty() ) {
352 QByteArray pic;
353 QBuffer buffer( &pic );
354 buffer.open( QIODevice::WriteOnly );
355 addr.photo().data().save( &buffer, "JPEG" );
356
357 if ( mod ) {
358 tmp += KLDAP::Ldif::assembleLine( QLatin1String( "replace" ),
359 mAttributes[ QLatin1String( "jpegPhoto" ) ] ) + '\n';
360 }
361 tmp += KLDAP::Ldif::assembleLine( mAttributes[ QLatin1String( "jpegPhoto" ) ], pic, 76 ) + '\n';
362 if ( mod ) {
363 tmp += "-\n";
364 }
365 }
366
367 tmp += '\n';
368 kDebug() << "ldif:" << QString::fromUtf8( tmp );
369 ldif = tmp;
370 return true;
371}
372
373void ResourceLDAPKIO::setReadOnly( bool value )
374{
375 //save the original readonly flag, because offline using disables writing
376 d->mReadOnly = true;
377 Resource::setReadOnly( value );
378}
379
380void ResourceLDAPKIO::init()
381{
382 if ( d->mPort == 0 ) {
383 d->mPort = 389;
384 }
385
392 if ( !d->mAttributes.contains( QLatin1String( "objectClass" ) ) ) {
393 d->mAttributes.insert( QLatin1String( "objectClass" ), QLatin1String( "inetOrgPerson" ) );
394 }
395 if ( !d->mAttributes.contains( QLatin1String( "commonName" ) ) ) {
396 d->mAttributes.insert( QLatin1String( "commonName" ), QLatin1String( "cn" ) );
397 }
398 if ( !d->mAttributes.contains( QLatin1String( "formattedName" ) ) ) {
399 d->mAttributes.insert( QLatin1String( "formattedName" ), QLatin1String( "displayName" ) );
400 }
401 if ( !d->mAttributes.contains( QLatin1String( "familyName" ) ) ) {
402 d->mAttributes.insert( QLatin1String( "familyName" ), QLatin1String( "sn" ) );
403 }
404 if ( !d->mAttributes.contains( QLatin1String( "givenName" ) ) ) {
405 d->mAttributes.insert( QLatin1String( "givenName" ), QLatin1String( "givenName" ) );
406 }
407 if ( !d->mAttributes.contains( QLatin1String( "mail" ) ) ) {
408 d->mAttributes.insert( QLatin1String( "mail" ), QLatin1String( "mail" ) );
409 }
410 if ( !d->mAttributes.contains( QLatin1String( "mailAlias" ) ) ) {
411 d->mAttributes.insert( QLatin1String( "mailAlias" ), QString() );
412 }
413 if ( !d->mAttributes.contains( QLatin1String( "phoneNumber" ) ) ) {
414 d->mAttributes.insert( QLatin1String( "phoneNumber" ), QLatin1String( "homePhone" ) );
415 }
416 if ( !d->mAttributes.contains( QLatin1String( "telephoneNumber" ) ) ) {
417 d->mAttributes.insert( QLatin1String( "telephoneNumber" ), QLatin1String( "telephoneNumber" ) );
418 }
419 if ( !d->mAttributes.contains( QLatin1String( "facsimileTelephoneNumber" ) ) ) {
420 d->mAttributes.insert( QLatin1String( "facsimileTelephoneNumber" ),
421 QLatin1String( "facsimileTelephoneNumber" ) );
422 }
423 if ( !d->mAttributes.contains( QLatin1String( "mobile" ) ) ) {
424 d->mAttributes.insert( QLatin1String( "mobile" ), QLatin1String( "mobile" ) );
425 }
426 if ( !d->mAttributes.contains( QLatin1String( "pager" ) ) ) {
427 d->mAttributes.insert( QLatin1String( "pager" ), QLatin1String( "pager" ) );
428 }
429 if ( !d->mAttributes.contains( QLatin1String( "description" ) ) ) {
430 d->mAttributes.insert( QLatin1String( "description" ), QLatin1String( "description" ) );
431 }
432 if ( !d->mAttributes.contains( QLatin1String( "title" ) ) ) {
433 d->mAttributes.insert( QLatin1String( "title" ), QLatin1String( "title" ) );
434 }
435 if ( !d->mAttributes.contains( QLatin1String( "street" ) ) ) {
436 d->mAttributes.insert( QLatin1String( "street" ), QLatin1String( "street" ) );
437 }
438 if ( !d->mAttributes.contains( QLatin1String( "state" ) ) ) {
439 d->mAttributes.insert( QLatin1String( "state" ), QLatin1String( "st" ) );
440 }
441 if ( !d->mAttributes.contains( QLatin1String( "city" ) ) ) {
442 d->mAttributes.insert( QLatin1String( "city" ), QLatin1String( "l" ) );
443 }
444 if ( !d->mAttributes.contains( QLatin1String( "organization" ) ) ) {
445 d->mAttributes.insert( QLatin1String( "organization" ), QLatin1String( "o" ) );
446 }
447 if ( !d->mAttributes.contains( QLatin1String( "postalcode" ) ) ) {
448 d->mAttributes.insert( QLatin1String( "postalcode" ), QLatin1String( "postalCode" ) );
449 }
450 if ( !d->mAttributes.contains( QLatin1String( "uid" ) ) ) {
451 d->mAttributes.insert( QLatin1String( "uid" ), QLatin1String( "uid" ) );
452 }
453 if ( !d->mAttributes.contains( QLatin1String( "jpegPhoto" ) ) ) {
454 d->mAttributes.insert( QLatin1String( "jpegPhoto" ), QLatin1String( "jpegPhoto" ) );
455 }
456
457 d->mLDAPUrl = KLDAP::LdapUrl( KUrl() );
458 if ( !d->mAnonymous ) {
459 d->mLDAPUrl.setExtension( QLatin1String( "bindname" ), d->mBindDN );
460 d->mLDAPUrl.setUser( d->mUser );
461 d->mLDAPUrl.setPass( d->mPassword );
462 }
463 d->mLDAPUrl.setProtocol( d->mSSL ? QLatin1String( "ldaps" ) : QLatin1String( "ldap" ) );
464 d->mLDAPUrl.setHost( d->mHost );
465 d->mLDAPUrl.setPort( d->mPort );
466 d->mLDAPUrl.setDn( KLDAP::LdapDN( d->mDn ) );
467
468 if ( !d->mAttributes.empty() ) {
469 QMap<QString,QString>::Iterator it;
470 QStringList attr;
471 for ( it = d->mAttributes.begin(); it != d->mAttributes.end(); ++it ) {
472 if ( !it.value().isEmpty() && it.key() != QLatin1String( "objectClass" ) ) {
473 attr.append( it.value() );
474 }
475 }
476 d->mLDAPUrl.setAttributes( attr );
477 }
478
479 d->mLDAPUrl.setScope( d->mSubTree ? KLDAP::LdapUrl::Sub : KLDAP::LdapUrl::One );
480 if ( !d->mFilter.isEmpty() && d->mFilter != QLatin1String( "(objectClass=*)" ) ) {
481 d->mLDAPUrl.setFilter( d->mFilter );
482 }
483 d->mLDAPUrl.setExtension( QLatin1String( "x-dir" ), QLatin1String( "base" ) );
484 if ( d->mTLS ) {
485 d->mLDAPUrl.setExtension( QLatin1String( "x-tls" ), QString() );
486 }
487 d->mLDAPUrl.setExtension( QLatin1String( "x-ver" ), QString::number( d->mVer ) );
488 if ( d->mSizeLimit ) {
489 d->mLDAPUrl.setExtension( QLatin1String( "x-sizelimit" ), QString::number( d->mSizeLimit ) );
490 }
491 if ( d->mTimeLimit ) {
492 d->mLDAPUrl.setExtension( QLatin1String( "x-timelimit" ), QString::number( d->mTimeLimit ) );
493 }
494 if ( d->mSASL ) {
495 d->mLDAPUrl.setExtension( QLatin1String( "x-sasl" ), QString() );
496 if ( !d->mMech.isEmpty() ) {
497 d->mLDAPUrl.setExtension( QLatin1String( "x-mech" ), d->mMech );
498 }
499 if ( !d->mRealm.isEmpty() ) {
500 d->mLDAPUrl.setExtension( QLatin1String( "x-realm" ), d->mRealm );
501 }
502 }
503
504 d->mReadOnly = readOnly();
505
506 kDebug() << "resource_ldapkio url:" << d->mLDAPUrl.prettyUrl();
507}
508
509void ResourceLDAPKIO::writeConfig( KConfigGroup &group )
510{
511 Resource::writeConfig( group );
512
513 group.writeEntry( "LdapUser", d->mUser );
514 group.writeEntry( "LdapPassword", KStringHandler::obscure( d->mPassword ) );
515 group.writeEntry( "LdapDn", d->mDn );
516 group.writeEntry( "LdapHost", d->mHost );
517 group.writeEntry( "LdapPort", d->mPort );
518 group.writeEntry( "LdapFilter", d->mFilter );
519 group.writeEntry( "LdapAnonymous", d->mAnonymous );
520 group.writeEntry( "LdapTLS", d->mTLS );
521 group.writeEntry( "LdapSSL", d->mSSL );
522 group.writeEntry( "LdapSubTree", d->mSubTree );
523 group.writeEntry( "LdapSASL", d->mSASL );
524 group.writeEntry( "LdapMech", d->mMech );
525 group.writeEntry( "LdapVer", d->mVer );
526 group.writeEntry( "LdapTimeLimit", d->mTimeLimit );
527 group.writeEntry( "LdapSizeLimit", d->mSizeLimit );
528 group.writeEntry( "LdapRDNPrefix", d->mRDNPrefix );
529 group.writeEntry( "LdapRealm", d->mRealm );
530 group.writeEntry( "LdapBindDN", d->mBindDN );
531 group.writeEntry( "LdapCachePolicy", d->mCachePolicy );
532 group.writeEntry( "LdapAutoCache", d->mAutoCache );
533
534 QStringList attributes;
535 QMap<QString, QString>::const_iterator it;
536 for ( it = d->mAttributes.constBegin(); it != d->mAttributes.constEnd(); ++it ) {
537 attributes << it.key() << it.value();
538 }
539
540 group.writeEntry( "LdapAttributes", attributes );
541}
542
543Ticket *ResourceLDAPKIO::requestSaveTicket()
544{
545 if ( !addressBook() ) {
546 kDebug() << "no addressbook";
547 return 0;
548 }
549
550 return createTicket( this );
551}
552
553void ResourceLDAPKIO::releaseSaveTicket( Ticket *ticket )
554{
555 delete ticket;
556}
557
558bool ResourceLDAPKIO::doOpen()
559{
560 return true;
561}
562
563void ResourceLDAPKIO::doClose()
564{
565}
566
567void ResourceLDAPKIO::Private::createCache()
568{
569 mTmp = 0;
570 if ( mCachePolicy == Cache_NoConnection && mAutoCache ) {
571 mTmp = new KTemporaryFile;
572 mTmp->setPrefix( mCacheDst );
573 mTmp->setSuffix( QLatin1String( "tmp" ) );
574 mTmp->open();
575 }
576}
577
578void ResourceLDAPKIO::Private::activateCache()
579{
580 if ( mTmp && mError == 0 ) {
581 QString filename = mTmp->fileName();
582 delete mTmp;
583 mTmp = 0;
584 KDE_rename( QFile::encodeName( filename ), QFile::encodeName( mCacheDst ) );
585 }
586}
587
588KIO::TransferJob *ResourceLDAPKIO::Private::loadFromCache()
589{
590 KIO::TransferJob *job = 0;
591 if ( mCachePolicy == Cache_Always ||
592 ( mCachePolicy == Cache_NoConnection &&
593 mError == KIO::ERR_COULD_NOT_CONNECT ) ) {
594
595 mAddr = Addressee();
596 mAd = Address( Address::Home );
597 //initialize ldif parser
598 mLdif.startParsing();
599
600 mParent->Resource::setReadOnly( true );
601
602 KUrl url( mCacheDst );
603 job = KIO::get( url, KIO::Reload, KIO::HideProgressInfo );
604 mParent->connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
605 mParent, SLOT(data(KIO::Job*,QByteArray)) );
606 }
607
608 return job;
609}
610
611bool ResourceLDAPKIO::load()
612{
613 kDebug();
614 KIO::TransferJob *job;
615
616 clear();
617 //clear the addressee
618 d->mAddr = Addressee();
619 d->mAd = Address( Address::Home );
620 //initialize ldif parser
621 d->mLdif.startParsing();
622
623 //set to original settings, offline use will disable writing
624 Resource::setReadOnly( d->mReadOnly );
625
626 d->createCache();
627 if ( d->mCachePolicy != Cache_Always ) {
628 job = KIO::get( d->mLDAPUrl, KIO::Reload, KIO::HideProgressInfo );
629 connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
630 this, SLOT(data(KIO::Job*,QByteArray)) );
631 connect( job, SIGNAL(result(KJob*)),
632 this, SLOT(syncLoadSaveResult(KJob*)) );
633 d->enter_loop();
634 }
635
636 job = d->loadFromCache();
637 if ( job ) {
638 connect( job, SIGNAL(result(KJob*)),
639 this, SLOT(syncLoadSaveResult(KJob*)) );
640 d->enter_loop();
641 }
642 if ( d->mErrorMsg.isEmpty() ) {
643 kDebug() << "ResourceLDAPKIO load ok!";
644 return true;
645 } else {
646 kDebug() << "ResourceLDAPKIO load finished with error:" << d->mErrorMsg;
647 addressBook()->error( d->mErrorMsg );
648 return false;
649 }
650}
651
652bool ResourceLDAPKIO::asyncLoad()
653{
654 clear();
655 //clear the addressee
656 d->mAddr = Addressee();
657 d->mAd = Address( Address::Home );
658 //initialize ldif parser
659 d->mLdif.startParsing();
660
661 Resource::setReadOnly( d->mReadOnly );
662
663 d->createCache();
664 if ( d->mCachePolicy != Cache_Always ) {
665 KIO::TransferJob *job = KIO::get( d->mLDAPUrl, KIO::Reload, KIO::HideProgressInfo );
666 connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
667 this, SLOT(data(KIO::Job*,QByteArray)) );
668 connect( job, SIGNAL(result(KJob*)),
669 this, SLOT(result(KJob*)) );
670 } else {
671 result( 0 );
672 }
673 return true;
674}
675
676void ResourceLDAPKIO::data( KIO::Job *job, const QByteArray &data )
677{
678 Q_UNUSED( job );
679 if ( data.size() ) {
680 d->mLdif.setLdif( data );
681 if ( d->mTmp ) {
682 d->mTmp->write( data );
683 }
684 } else {
685 d->mLdif.endLdif();
686 }
687
688 KLDAP::Ldif::ParseValue ret;
689 QString name;
690 QByteArray value;
691 do {
692 ret = d->mLdif.nextItem();
693 switch ( ret ) {
694 case KLDAP::Ldif::NewEntry:
695 kDebug() << "new entry:" << d->mLdif.dn().toString();
696 break;
697 case KLDAP::Ldif::Item:
698 name = d->mLdif.attr().toLower();
699 value = d->mLdif.value();
700 if ( name == d->mAttributes[ QLatin1String( "commonName" ) ].toLower() ) {
701 if ( !d->mAddr.formattedName().isEmpty() ) {
702 QString fn = d->mAddr.formattedName();
703 d->mAddr.setNameFromString( QString::fromUtf8( value, value.size() ) );
704 d->mAddr.setFormattedName( fn );
705 } else {
706 d->mAddr.setNameFromString( QString::fromUtf8( value, value.size() ) );
707 }
708 } else if ( name == d->mAttributes[ QLatin1String( "formattedName" ) ].toLower() ) {
709 d->mAddr.setFormattedName( QString::fromUtf8( value, value.size() ) );
710 } else if ( name == d->mAttributes[ QLatin1String( "givenName" ) ].toLower() ) {
711 d->mAddr.setGivenName( QString::fromUtf8( value, value.size() ) );
712 } else if ( name == d->mAttributes[ QLatin1String( "mail" ) ].toLower() ) {
713 d->mAddr.insertEmail( QString::fromUtf8( value, value.size() ), true );
714 } else if ( name == d->mAttributes[ QLatin1String( "mailAlias" ) ].toLower() ) {
715 d->mAddr.insertEmail( QString::fromUtf8( value, value.size() ), false );
716 } else if ( name == d->mAttributes[ QLatin1String( "phoneNumber" ) ].toLower() ) {
717 PhoneNumber phone;
718 phone.setNumber( QString::fromUtf8( value, value.size() ) );
719 d->mAddr.insertPhoneNumber( phone );
720 } else if ( name == d->mAttributes[ QLatin1String( "telephoneNumber" ) ].toLower() ) {
721 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
722 PhoneNumber::Work );
723 d->mAddr.insertPhoneNumber( phone );
724 } else if ( name ==
725 d->mAttributes[ QLatin1String( "facsimileTelephoneNumber" ) ].toLower() ) {
726 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
727 PhoneNumber::Fax );
728 d->mAddr.insertPhoneNumber( phone );
729 } else if ( name == d->mAttributes[ QLatin1String( "mobile" ) ].toLower() ) {
730 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
731 PhoneNumber::Cell );
732 d->mAddr.insertPhoneNumber( phone );
733 } else if ( name == d->mAttributes[ QLatin1String( "pager" ) ].toLower() ) {
734 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
735 PhoneNumber::Pager );
736 d->mAddr.insertPhoneNumber( phone );
737 } else if ( name == d->mAttributes[ QLatin1String( "description" ) ].toLower() ) {
738 d->mAddr.setNote( QString::fromUtf8( value, value.size() ) );
739 } else if ( name == d->mAttributes[ QLatin1String( "title" ) ].toLower() ) {
740 d->mAddr.setTitle( QString::fromUtf8( value, value.size() ) );
741 } else if ( name == d->mAttributes[ QLatin1String( "street" ) ].toLower() ) {
742 d->mAd.setStreet( QString::fromUtf8( value, value.size() ) );
743 } else if ( name == d->mAttributes[ QLatin1String( "state" ) ].toLower() ) {
744 d->mAd.setRegion( QString::fromUtf8( value, value.size() ) );
745 } else if ( name == d->mAttributes[ QLatin1String( "city" ) ].toLower() ) {
746 d->mAd.setLocality( QString::fromUtf8( value, value.size() ) );
747 } else if ( name == d->mAttributes[ QLatin1String( "postalcode" ) ].toLower() ) {
748 d->mAd.setPostalCode( QString::fromUtf8( value, value.size() ) );
749 } else if ( name == d->mAttributes[ QLatin1String( "organization" ) ].toLower() ) {
750 d->mAddr.setOrganization( QString::fromUtf8( value, value.size() ) );
751 } else if ( name == d->mAttributes[ QLatin1String( "familyName" ) ].toLower() ) {
752 d->mAddr.setFamilyName( QString::fromUtf8( value, value.size() ) );
753 } else if ( name == d->mAttributes[ QLatin1String( "uid" ) ].toLower() ) {
754 d->mAddr.setUid( QString::fromUtf8( value, value.size() ) );
755 } else if ( name == d->mAttributes[ QLatin1String( "jpegPhoto" ) ].toLower() ) {
756 if ( !value.isEmpty() ) {
757 KABC::Picture photo;
758 photo.setRawData( value, QLatin1String( "jpeg" ) );
759 d->mAddr.setPhoto( photo );
760 }
761 }
762
763 break;
764 case KLDAP::Ldif::EndEntry:
765 {
766 d->mAddr.setResource( this );
767 d->mAddr.insertAddress( d->mAd );
768 d->mAddr.setChanged( false );
769 insertAddressee( d->mAddr );
770 //clear the addressee
771 d->mAddr = Addressee();
772 d->mAd = Address( Address::Home );
773 }
774 break;
775 default:
776 break;
777 }
778 } while ( ret != KLDAP::Ldif::MoreData );
779}
780
781void ResourceLDAPKIO::loadCacheResult( KJob *job )
782{
783 d->mErrorMsg.clear();
784 d->mError = job->error();
785 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
786 d->mErrorMsg = job->errorString();
787 }
788 if ( !d->mErrorMsg.isEmpty() ) {
789 emit loadingError( this, d->mErrorMsg );
790 } else {
791 emit loadingFinished( this );
792 }
793}
794
795void ResourceLDAPKIO::result( KJob *job )
796{
797 d->mErrorMsg.clear();
798 if ( job ) {
799 d->mError = job->error();
800 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
801 d->mErrorMsg = job->errorString();
802 }
803 } else {
804 d->mError = 0;
805 }
806 d->activateCache();
807
808 KIO::TransferJob *cjob;
809 cjob = d->loadFromCache();
810 if ( cjob ) {
811 connect( cjob, SIGNAL(result(KJob*)),
812 this, SLOT(loadCacheResult(KJob*)) );
813 } else {
814 if ( !d->mErrorMsg.isEmpty() ) {
815 emit loadingError( this, d->mErrorMsg );
816 } else {
817 emit loadingFinished( this );
818 }
819 }
820}
821
822bool ResourceLDAPKIO::save( Ticket *ticket )
823{
824 Q_UNUSED( ticket );
825 kDebug();
826
827 d->mSaveIt = begin();
828 KIO::TransferJob *job = KIO::put( d->mLDAPUrl, -1, KIO::Overwrite | KIO::HideProgressInfo );
829 connect( job, SIGNAL(dataReq(KIO::Job*,QByteArray&)),
830 this, SLOT(saveData(KIO::Job*,QByteArray&)) );
831 connect( job, SIGNAL(result(KJob*)),
832 this, SLOT(syncLoadSaveResult(KJob*)) );
833 d->enter_loop();
834 if ( d->mErrorMsg.isEmpty() ) {
835 kDebug() << "ResourceLDAPKIO save ok!";
836 return true;
837 } else {
838 kDebug() << "ResourceLDAPKIO finished with error:" << d->mErrorMsg;
839 addressBook()->error( d->mErrorMsg );
840 return false;
841 }
842}
843
844bool ResourceLDAPKIO::asyncSave( Ticket *ticket )
845{
846 Q_UNUSED( ticket );
847 kDebug();
848 d->mSaveIt = begin();
849 KIO::TransferJob *job = KIO::put( d->mLDAPUrl, -1, KIO::Overwrite | KIO::HideProgressInfo );
850 connect( job, SIGNAL(dataReq(KIO::Job*,QByteArray&)),
851 this, SLOT(saveData(KIO::Job*,QByteArray&)) );
852 connect( job, SIGNAL(result(KJob*)),
853 this, SLOT(saveResult(KJob*)) );
854 return true;
855}
856
857void ResourceLDAPKIO::syncLoadSaveResult( KJob *job )
858{
859 d->mError = job->error();
860 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
861 d->mErrorMsg = job->errorString();
862 } else {
863 d->mErrorMsg.clear();
864 }
865 d->activateCache();
866
867 emit leaveModality();
868}
869
870void ResourceLDAPKIO::saveResult( KJob *job )
871{
872 d->mError = job->error();
873 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
874 emit savingError( this, job->errorString() );
875 } else {
876 emit savingFinished( this );
877 }
878}
879
880void ResourceLDAPKIO::saveData( KIO::Job *job, QByteArray &data )
881{
882 Q_UNUSED( job );
883 while ( d->mSaveIt != end() && !( *d->mSaveIt ).changed() ) {
884 d->mSaveIt++;
885 }
886
887 if ( d->mSaveIt == end() ) {
888 kDebug() << "ResourceLDAPKIO endData";
889 data.resize( 0 );
890 return;
891 }
892
893 kDebug() << "ResourceLDAPKIO saveData:" << ( *d->mSaveIt ).assembledName();
894
895 d->AddresseeToLDIF( data, *d->mSaveIt, d->findUid( ( *d->mSaveIt ).uid() ) );
896// kDebug() << "ResourceLDAPKIO save LDIF:" << QString::fromUtf8(data);
897 // mark as unchanged
898 ( *d->mSaveIt ).setChanged( false );
899
900 d->mSaveIt++;
901}
902
903void ResourceLDAPKIO::removeAddressee( const Addressee &addr )
904{
905 QString dn = d->findUid( addr.uid() );
906
907 kDebug() << dn;
908
909 if ( !d->mErrorMsg.isEmpty() ) {
910 addressBook()->error( d->mErrorMsg );
911 return;
912 }
913 if ( !dn.isEmpty() ) {
914 kDebug() << "ResourceLDAPKIO: found uid:" << dn;
915 KLDAP::LdapUrl url( d->mLDAPUrl );
916 url.setPath( QLatin1Char( '/' ) + dn );
917 url.setExtension( QLatin1String( "x-dir" ), QLatin1String( "base" ) );
918 url.setScope( KLDAP::LdapUrl::Base );
919 if ( KIO::NetAccess::del( url, 0 ) ) {
920 mAddrMap.remove( addr.uid() );
921 }
922 } else {
923 //maybe it's not saved yet
924 mAddrMap.remove( addr.uid() );
925 }
926}
927
928void ResourceLDAPKIO::setUser( const QString &user )
929{
930 d->mUser = user;
931}
932
933QString ResourceLDAPKIO::user() const
934{
935 return d->mUser;
936}
937
938void ResourceLDAPKIO::setPassword( const QString &password )
939{
940 d->mPassword = password;
941}
942
943QString ResourceLDAPKIO::password() const
944{
945 return d->mPassword;
946}
947
948void ResourceLDAPKIO::setDn( const QString &dn )
949{
950 d->mDn = dn;
951}
952
953QString ResourceLDAPKIO::dn() const
954{
955 return d->mDn;
956}
957
958void ResourceLDAPKIO::setHost( const QString &host )
959{
960 d->mHost = host;
961}
962
963QString ResourceLDAPKIO::host() const
964{
965 return d->mHost;
966}
967
968void ResourceLDAPKIO::setPort( int port )
969{
970 d->mPort = port;
971}
972
973int ResourceLDAPKIO::port() const
974{
975 return d->mPort;
976}
977
978void ResourceLDAPKIO::setVer( int ver )
979{
980 d->mVer = ver;
981}
982
983int ResourceLDAPKIO::ver() const
984{
985 return d->mVer;
986}
987
988void ResourceLDAPKIO::setSizeLimit( int sizelimit )
989{
990 d->mSizeLimit = sizelimit;
991}
992
993int ResourceLDAPKIO::sizeLimit()
994{
995 return d->mSizeLimit;
996}
997
998void ResourceLDAPKIO::setTimeLimit( int timelimit )
999{
1000 d->mTimeLimit = timelimit;
1001}
1002
1003int ResourceLDAPKIO::timeLimit()
1004{
1005 return d->mTimeLimit;
1006}
1007
1008void ResourceLDAPKIO::setFilter( const QString &filter )
1009{
1010 d->mFilter = filter;
1011}
1012
1013QString ResourceLDAPKIO::filter() const
1014{
1015 return d->mFilter;
1016}
1017
1018void ResourceLDAPKIO::setIsAnonymous( bool value )
1019{
1020 d->mAnonymous = value;
1021}
1022
1023bool ResourceLDAPKIO::isAnonymous() const
1024{
1025 return d->mAnonymous;
1026}
1027
1028void ResourceLDAPKIO::setIsTLS( bool value )
1029{
1030 d->mTLS = value;
1031}
1032
1033bool ResourceLDAPKIO::isTLS() const
1034{
1035 return d->mTLS;
1036}
1037void ResourceLDAPKIO::setIsSSL( bool value )
1038{
1039 d->mSSL = value;
1040}
1041
1042bool ResourceLDAPKIO::isSSL() const
1043{
1044 return d->mSSL;
1045}
1046
1047void ResourceLDAPKIO::setIsSubTree( bool value )
1048{
1049 d->mSubTree = value;
1050}
1051
1052bool ResourceLDAPKIO::isSubTree() const
1053{
1054 return d->mSubTree;
1055}
1056
1057void ResourceLDAPKIO::setAttributes( const QMap<QString, QString> &attributes )
1058{
1059 d->mAttributes = attributes;
1060}
1061
1062QMap<QString, QString> ResourceLDAPKIO::attributes() const
1063{
1064 return d->mAttributes;
1065}
1066
1067void ResourceLDAPKIO::setRDNPrefix( int value )
1068{
1069 d->mRDNPrefix = value;
1070}
1071
1072int ResourceLDAPKIO::RDNPrefix() const
1073{
1074 return d->mRDNPrefix;
1075}
1076
1077void ResourceLDAPKIO::setIsSASL( bool value )
1078{
1079 d->mSASL = value;
1080}
1081
1082bool ResourceLDAPKIO::isSASL() const
1083{
1084 return d->mSASL;
1085}
1086
1087void ResourceLDAPKIO::setMech( const QString &mech )
1088{
1089 d->mMech = mech;
1090}
1091
1092QString ResourceLDAPKIO::mech() const
1093{
1094 return d->mMech;
1095}
1096
1097void ResourceLDAPKIO::setRealm( const QString &realm )
1098{
1099 d->mRealm = realm;
1100}
1101
1102QString ResourceLDAPKIO::realm() const
1103{
1104 return d->mRealm;
1105}
1106
1107void ResourceLDAPKIO::setBindDN( const QString &binddn )
1108{
1109 d->mBindDN = binddn;
1110}
1111
1112QString ResourceLDAPKIO::bindDN() const
1113{
1114 return d->mBindDN;
1115}
1116
1117void ResourceLDAPKIO::setCachePolicy( int pol )
1118{
1119 d->mCachePolicy = pol;
1120}
1121
1122int ResourceLDAPKIO::cachePolicy() const
1123{
1124 return d->mCachePolicy;
1125}
1126
1127void ResourceLDAPKIO::setAutoCache( bool value )
1128{
1129 d->mAutoCache = value;
1130}
1131
1132bool ResourceLDAPKIO::autoCache()
1133{
1134 return d->mAutoCache;
1135}
1136
1137QString ResourceLDAPKIO::cacheDst() const
1138{
1139 return d->mCacheDst;
1140}
1141
KABC::Address
Postal address information.
Definition: address.h:38
KABC::Address::street
QString street() const
Returns the street.
Definition: address.cpp:394
KABC::Address::isEmpty
bool isEmpty() const
Returns true, if the address is empty.
Definition: address.cpp:301
KABC::Address::Home
@ Home
home address
Definition: address.h:56
KABC::Address::region
QString region() const
Returns the region.
Definition: address.cpp:426
KABC::Address::locality
QString locality() const
Returns the locality.
Definition: address.cpp:410
KABC::Address::postalCode
QString postalCode() const
Returns the postal code.
Definition: address.cpp:442
KABC::Addressee
address book entry
Definition: addressee.h:79
KABC::Addressee::familyName
QString familyName() const
Return family name.
Definition: addressee.cpp:599
KABC::Addressee::emails
QStringList emails() const
Return list of all email addresses.
Definition: addressee.cpp:1442
KABC::Addressee::organization
QString organization() const
Return organization.
Definition: addressee.cpp:977
KABC::Addressee::photo
Picture photo() const
Return photo.
Definition: addressee.cpp:1157
KABC::Addressee::address
Address address(Address::Type type) const
Return address, which matches the given type.
Definition: addressee.cpp:1802
KABC::Addressee::note
QString note() const
Return note.
Definition: addressee.cpp:1017
KABC::Addressee::phoneNumber
PhoneNumber phoneNumber(PhoneNumber::Type type) const
Return phone number, which matches the given type.
Definition: addressee.cpp:1551
KABC::Addressee::title
QString title() const
Return title.
Definition: addressee.cpp:937
KABC::Addressee::assembledName
QString assembledName() const
Return the name that consists of all name parts.
Definition: addressee.cpp:1357
KABC::Addressee::formattedName
QString formattedName() const
Return formatted name.
Definition: addressee.cpp:579
KABC::Addressee::givenName
QString givenName() const
Return given name.
Definition: addressee.cpp:619
KABC::Addressee::uid
QString uid() const
Return unique identifier.
Definition: addressee.cpp:442
KABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:39
KABC::PhoneNumber::setNumber
void setNumber(const QString &number)
Sets the phone number.
Definition: phonenumber.cpp:123
KABC::PhoneNumber::Fax
@ Fax
Fax machine.
Definition: phonenumber.h:53
KABC::PhoneNumber::Work
@ Work
Office number.
Definition: phonenumber.h:49
KABC::PhoneNumber::Cell
@ Cell
Cell phone.
Definition: phonenumber.h:54
KABC::PhoneNumber::Home
@ Home
Home number.
Definition: phonenumber.h:48
KABC::PhoneNumber::Pager
@ Pager
Pager.
Definition: phonenumber.h:61
KABC::PhoneNumber::number
QString number() const
Returns the phone number.
Definition: phonenumber.cpp:128
KABC::Picture
A class to store a picture of an addressee.
Definition: picture.h:40
KABC::Picture::data
QImage data() const
Returns the image data of this picture.
Definition: picture.cpp:194
KABC::Picture::setRawData
void setRawData(const QByteArray &rawData, const QString &type)
Sets the raw data of the picture.
Definition: picture.cpp:171
KABC::Resource
Definition: resource.h:65
KABC::Resource::writeConfig
virtual void writeConfig(KConfigGroup &group)
Writes the resource specific config to file.
Definition: resource.cpp:264
KABC::Ticket
Helper class for handling coordinated save of address books.
Definition: resource.h:38
KABC
Class that holds a Calendar Url (FBURL/CALADRURI/CALURI)
Definition: address.h:29
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Thu Jul 21 2022 00:00:00 by doxygen 1.9.5 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.10 API Reference

Skip menu "kdepimlibs-4.14.10 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