00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "ldifconverter.h"
00036 #include "vcardconverter.h"
00037 #include "address.h"
00038 #include "addressee.h"
00039
00040 #include "kldap/ldif.h"
00041
00042 #include <kdebug.h>
00043 #include <klocale.h>
00044
00045 #include <QtCore/QRegExp>
00046 #include <QtCore/QStringList>
00047 #include <QtCore/QTextCodec>
00048 #include <QtCore/QTextStream>
00049
00050 using namespace KABC;
00051
00052
00053
00054 bool LDIFConverter::addresseeToLDIF( const AddresseeList &addrList, QString &str )
00055 {
00056 AddresseeList::ConstIterator it;
00057 for ( it = addrList.begin(); it != addrList.end(); ++it ) {
00058 addresseeToLDIF( *it, str );
00059 }
00060 return true;
00061 }
00062
00063 static void ldif_out( QTextStream &t, const QString &formatStr,
00064 const QString &value )
00065 {
00066 if ( value.isEmpty() ) {
00067 return;
00068 }
00069
00070 QByteArray txt = KLDAP::Ldif::assembleLine( formatStr, value, 72 );
00071
00072
00073 t << QString::fromUtf8( txt ) << "\n";
00074 }
00075
00076 bool LDIFConverter::addresseeToLDIF( const Addressee &addr, QString &str )
00077 {
00078 if ( addr.isEmpty() ) {
00079 return false;
00080 }
00081
00082 QTextStream t( &str, QIODevice::WriteOnly|QIODevice::Append );
00083 t.setCodec( QTextCodec::codecForName( "UTF-8" ) );
00084
00085 const Address homeAddr = addr.address( Address::Home );
00086 const Address workAddr = addr.address( Address::Work );
00087
00088 ldif_out( t, "dn", QString( "cn=%1,mail=%2" ).
00089 arg( addr.formattedName().simplified() ).
00090 arg( addr.preferredEmail() ) );
00091 ldif_out( t, "givenname", addr.givenName() );
00092 ldif_out( t, "sn", addr.familyName() );
00093 ldif_out( t, "cn", addr.formattedName().simplified() );
00094 ldif_out( t, "uid", addr.uid() );
00095 ldif_out( t, "nickname", addr.nickName() );
00096 ldif_out( t, "xmozillanickname", addr.nickName() );
00097
00098 ldif_out( t, "mail", addr.preferredEmail() );
00099 if ( addr.emails().count() > 1 ) {
00100 ldif_out( t, "mozillasecondemail", addr.emails()[ 1 ] );
00101 }
00102
00103
00104 ldif_out( t, "telephonenumber", addr.phoneNumber( PhoneNumber::Work ).number() );
00105 ldif_out( t, "facsimiletelephonenumber", addr.phoneNumber( PhoneNumber::Fax ).number() );
00106 ldif_out( t, "homephone", addr.phoneNumber( PhoneNumber::Home ).number() );
00107 ldif_out( t, "mobile", addr.phoneNumber( PhoneNumber::Cell ).number() );
00108 ldif_out( t, "cellphone", addr.phoneNumber( PhoneNumber::Cell ).number() );
00109 ldif_out( t, "pager", addr.phoneNumber( PhoneNumber::Pager ).number() );
00110 ldif_out( t, "pagerphone", addr.phoneNumber( PhoneNumber::Pager ).number() );
00111
00112 ldif_out( t, "streethomeaddress", homeAddr.street() );
00113 ldif_out( t, "postalcode", workAddr.postalCode() );
00114 ldif_out( t, "postofficebox", workAddr.postOfficeBox() );
00115
00116 QStringList streets = homeAddr.street().split( '\n' );
00117 if ( streets.count() > 0 ) {
00118 ldif_out( t, "homepostaladdress", streets[ 0 ] );
00119 }
00120 if ( streets.count() > 1 ) {
00121 ldif_out( t, "mozillahomepostaladdress2", streets[ 1 ] );
00122 }
00123 ldif_out( t, "mozillahomelocalityname", homeAddr.locality() );
00124 ldif_out( t, "mozillahomestate", homeAddr.region() );
00125 ldif_out( t, "mozillahomepostalcode", homeAddr.postalCode() );
00126 ldif_out( t, "mozillahomecountryname", Address::ISOtoCountry( homeAddr.country() ) );
00127 ldif_out( t, "locality", workAddr.locality() );
00128 ldif_out( t, "streetaddress", workAddr.street() );
00129
00130 streets = workAddr.street().split( '\n' );
00131 if ( streets.count() > 0 ) {
00132 ldif_out( t, "postaladdress", streets[ 0 ] );
00133 }
00134 if ( streets.count() > 1 ) {
00135 ldif_out( t, "mozillapostaladdress2", streets[ 1 ] );
00136 }
00137 ldif_out( t, "countryname", Address::ISOtoCountry( workAddr.country() ) );
00138 ldif_out( t, "l", workAddr.locality() );
00139 ldif_out( t, "c", Address::ISOtoCountry( workAddr.country() ) );
00140 ldif_out( t, "st", workAddr.region() );
00141
00142 ldif_out( t, "title", addr.title() );
00143 ldif_out( t, "vocation", addr.prefix() );
00144 ldif_out( t, "ou", addr.role() );
00145 ldif_out( t, "o", addr.organization() );
00146 ldif_out( t, "organization", addr.organization() );
00147 ldif_out( t, "organizationname", addr.organization() );
00148
00149
00150 if ( !addr.department().isEmpty() ) {
00151 ldif_out( t, "department", addr.department() );
00152 } else {
00153 ldif_out( t, "department", addr.custom( "KADDRESSBOOK", "X-Department" ) );
00154 }
00155
00156 ldif_out( t, "workurl", addr.url().prettyUrl() );
00157 ldif_out( t, "homeurl", addr.url().prettyUrl() );
00158 ldif_out( t, "description", addr.note() );
00159 if ( addr.revision().isValid() ) {
00160 ldif_out( t, "modifytimestamp", dateToVCardString( addr.revision() ) );
00161 }
00162
00163 t << "objectclass: top\n";
00164 t << "objectclass: person\n";
00165 t << "objectclass: organizationalPerson\n";
00166
00167 t << "\n";
00168
00169 return true;
00170 }
00171
00172
00173
00174 bool LDIFConverter::LDIFToAddressee( const QString &str, AddresseeList &addrList,
00175 const QDateTime &dt )
00176 {
00177 if ( str.isEmpty() ) {
00178 return true;
00179 }
00180
00181 bool endldif = false, end = false;
00182 KLDAP::Ldif ldif;
00183 KLDAP::Ldif::ParseValue ret;
00184 Addressee a;
00185 Address homeAddr, workAddr;
00186
00187 ldif.setLdif( str.toLatin1() );
00188 QDateTime qdt = dt;
00189 if ( !qdt.isValid() ) {
00190 qdt = QDateTime::currentDateTime();
00191 }
00192 a.setRevision( qdt );
00193 homeAddr = Address( Address::Home );
00194 workAddr = Address( Address::Work );
00195
00196 do {
00197 ret = ldif.nextItem();
00198 switch ( ret ) {
00199 case KLDAP::Ldif::Item:
00200 {
00201 QString fieldname = ldif.attr().toLower();
00202 QString value = QString::fromUtf8( ldif.value(), ldif.value().size() );
00203 evaluatePair( a, homeAddr, workAddr, fieldname, value );
00204 break;
00205 }
00206 case KLDAP::Ldif::EndEntry:
00207
00208 if ( !a.formattedName().isEmpty() || !a.name().isEmpty() ||
00209 !a.familyName().isEmpty() ) {
00210 if ( !homeAddr.isEmpty() ) {
00211 a.insertAddress( homeAddr );
00212 }
00213 if ( !workAddr.isEmpty() ) {
00214 a.insertAddress( workAddr );
00215 }
00216 addrList.append( a );
00217 }
00218 a = Addressee();
00219 a.setRevision( qdt );
00220 homeAddr = Address( Address::Home );
00221 workAddr = Address( Address::Work );
00222 break;
00223 case KLDAP::Ldif::MoreData:
00224 {
00225 if ( endldif ) {
00226 end = true;
00227 } else {
00228 ldif.endLdif();
00229 endldif = true;
00230 break;
00231 }
00232 }
00233 default:
00234 break;
00235 }
00236 } while ( !end );
00237
00238 return true;
00239 }
00240
00241 bool LDIFConverter::evaluatePair( Addressee &a, Address &homeAddr,
00242 Address &workAddr,
00243 QString &fieldname, QString &value )
00244 {
00245 if ( fieldname == QLatin1String( "dn" ) ) {
00246 return false;
00247 }
00248
00249 if ( fieldname.startsWith( '#' ) ) {
00250 return true;
00251 }
00252
00253 if ( fieldname.isEmpty() && !a.note().isEmpty() ) {
00254
00255
00256 a.setNote( a.note() + '\n' + value );
00257 return true;
00258 }
00259
00260 if ( fieldname == QLatin1String( "givenname" ) ) {
00261 a.setGivenName( value );
00262 return true;
00263 }
00264
00265 if ( fieldname == QLatin1String( "xmozillanickname" ) ||
00266 fieldname == QLatin1String( "nickname" ) ) {
00267 a.setNickName( value );
00268 return true;
00269 }
00270
00271 if ( fieldname == QLatin1String( "sn" ) ) {
00272 a.setFamilyName( value );
00273 return true;
00274 }
00275
00276 if ( fieldname == QLatin1String( "uid" ) ) {
00277 a.setUid( value );
00278 return true;
00279 }
00280 if ( fieldname == QLatin1String( "mail" ) ||
00281 fieldname == QLatin1String( "mozillasecondemail" ) ) {
00282 if ( a.emails().indexOf( value ) == -1 ) {
00283 a.insertEmail( value );
00284 }
00285 return true;
00286 }
00287
00288 if ( fieldname == QLatin1String( "title" ) ) {
00289 a.setTitle( value );
00290 return true;
00291 }
00292
00293 if ( fieldname == QLatin1String( "vocation" ) ) {
00294 a.setPrefix( value );
00295 return true;
00296 }
00297
00298 if ( fieldname == QLatin1String( "cn" ) ) {
00299 a.setFormattedName( value );
00300 return true;
00301 }
00302
00303 if ( fieldname == QLatin1String( "o" ) ||
00304 fieldname == QLatin1String( "organization" ) ||
00305 fieldname == QLatin1String( "organizationname" ) ) {
00306 a.setOrganization( value );
00307 return true;
00308 }
00309
00310 if ( fieldname == QLatin1String( "description" ) ) {
00311 addComment:
00312 if ( !a.note().isEmpty() ) {
00313 a.setNote( a.note() + '\n' );
00314 }
00315 a.setNote( a.note() + value );
00316 return true;
00317 }
00318
00319 if ( fieldname == QLatin1String( "custom1" ) ||
00320 fieldname == QLatin1String( "custom2" ) ||
00321 fieldname == QLatin1String( "custom3" ) ||
00322 fieldname == QLatin1String( "custom4" ) ) {
00323 goto addComment;
00324 }
00325
00326 if ( fieldname == QLatin1String( "homeurl" ) ||
00327 fieldname == QLatin1String( "workurl" ) ) {
00328 if ( a.url().isEmpty() ) {
00329 a.setUrl( KUrl( value ) );
00330 return true;
00331 }
00332 if ( a.url().prettyUrl() == KUrl( value ).prettyUrl() ) {
00333 return true;
00334 }
00335
00336
00337 }
00338
00339 if ( fieldname == QLatin1String( "homephone" ) ) {
00340 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Home ) );
00341 return true;
00342 }
00343
00344 if ( fieldname == QLatin1String( "telephonenumber" ) ) {
00345 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Work ) );
00346 return true;
00347 }
00348
00349 if ( fieldname == QLatin1String( "mobile" ) ) {
00350 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Cell ) );
00351 return true;
00352 }
00353
00354 if ( fieldname == QLatin1String( "cellphone" ) ) {
00355 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Cell ) );
00356 return true;
00357 }
00358
00359 if ( fieldname == QLatin1String( "pager" ) ||
00360 fieldname == QLatin1String( "pagerphone" ) ) {
00361 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Pager ) );
00362 return true;
00363 }
00364
00365 if ( fieldname == QLatin1String( "facsimiletelephonenumber" ) ) {
00366 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Fax ) );
00367 return true;
00368 }
00369
00370 if ( fieldname == QLatin1String( "xmozillaanyphone" ) ) {
00371 a.insertPhoneNumber( PhoneNumber( value, PhoneNumber::Work ) );
00372 return true;
00373 }
00374
00375 if ( fieldname == QLatin1String( "street" ) ||
00376 fieldname == QLatin1String( "streethomeaddress" ) ) {
00377 homeAddr.setStreet( value );
00378 return true;
00379 }
00380
00381 if ( fieldname == QLatin1String( "postaladdress" ) ) {
00382 workAddr.setStreet( value );
00383 return true;
00384 }
00385
00386 if ( fieldname == QLatin1String( "mozillapostaladdress2" ) ) {
00387 workAddr.setStreet( workAddr.street() + QLatin1String( "\n" ) + value );
00388 return true;
00389 }
00390
00391 if ( fieldname == QLatin1String( "postalcode" ) ) {
00392 workAddr.setPostalCode( value );
00393 return true;
00394 }
00395
00396 if ( fieldname == QLatin1String( "postofficebox" ) ) {
00397 workAddr.setPostOfficeBox( value );
00398 return true;
00399 }
00400
00401 if ( fieldname == QLatin1String( "homepostaladdress" ) ) {
00402 homeAddr.setStreet( value );
00403 return true;
00404 }
00405
00406 if ( fieldname == QLatin1String( "mozillahomepostaladdress2" ) ) {
00407 homeAddr.setStreet( homeAddr.street() + QLatin1String( "\n" ) + value );
00408 return true;
00409 }
00410
00411 if ( fieldname == QLatin1String( "mozillahomelocalityname" ) ) {
00412 homeAddr.setLocality( value );
00413 return true;
00414 }
00415
00416 if ( fieldname == QLatin1String( "mozillahomestate" ) ) {
00417 homeAddr.setRegion( value );
00418 return true;
00419 }
00420
00421 if ( fieldname == QLatin1String( "mozillahomepostalcode" ) ) {
00422 homeAddr.setPostalCode( value );
00423 return true;
00424 }
00425
00426 if ( fieldname == QLatin1String( "mozillahomecountryname" ) ) {
00427 if ( value.length() <= 2 ) {
00428 value = Address::ISOtoCountry( value );
00429 }
00430 homeAddr.setCountry( value );
00431 return true;
00432 }
00433
00434 if ( fieldname == QLatin1String( "locality" ) ) {
00435 workAddr.setLocality( value );
00436 return true;
00437 }
00438
00439 if ( fieldname == QLatin1String( "streetaddress" ) ) {
00440 workAddr.setStreet( value );
00441 return true;
00442 }
00443
00444 if ( fieldname == QLatin1String( "countryname" ) ||
00445 fieldname == QLatin1String( "c" ) ) {
00446 if ( value.length() <= 2 ) {
00447 value = Address::ISOtoCountry( value );
00448 }
00449 workAddr.setCountry( value );
00450 return true;
00451 }
00452
00453 if ( fieldname == QLatin1String( "l" ) ) {
00454 workAddr.setLocality( value );
00455 return true;
00456 }
00457
00458 if ( fieldname == QLatin1String( "st" ) ) {
00459 workAddr.setRegion( value );
00460 return true;
00461 }
00462
00463 if ( fieldname == QLatin1String( "ou" ) ) {
00464 a.setRole( value );
00465 return true;
00466 }
00467
00468 if ( fieldname == QLatin1String( "department" ) ) {
00469 a.setDepartment( value );
00470 return true;
00471 }
00472
00473 if ( fieldname == QLatin1String( "member" ) ) {
00474
00475 QStringList list = value.split( ',' );
00476 QString name, email;
00477
00478 QStringList::Iterator it;
00479 for ( it = list.begin(); it != list.end(); ++it ) {
00480 if ( (*it).startsWith( "cn=" ) ) {
00481 name = (*it).mid( 3 ).trimmed();
00482 }
00483 if ( (*it).startsWith( "mail=" ) ) {
00484 email = (*it).mid( 5 ).trimmed();
00485 }
00486 }
00487 if ( !name.isEmpty() && !email.isEmpty() ) {
00488 email = " <" + email + '>';
00489 }
00490 a.insertEmail( name + email );
00491 a.insertCategory( i18n( "List of Emails" ) );
00492 return true;
00493 }
00494
00495 if ( fieldname == QLatin1String( "modifytimestamp" ) ) {
00496 if ( value == QLatin1String( "0Z" ) ) {
00497 return true;
00498 }
00499 QDateTime dt = VCardStringToDate( value );
00500 if ( dt.isValid() ) {
00501 a.setRevision( dt );
00502 return true;
00503 }
00504 }
00505
00506 if ( fieldname == QLatin1String( "objectclass" ) ) {
00507 return true;
00508 }
00509
00510 kWarning(5700) << QString( "LDIFConverter: Unknown field for '%1': '%2=%3'\n" ).
00511 arg( a.formattedName() ).arg( fieldname ).arg( value );
00512
00513 return true;
00514 }