35 #include "ldifconverter.h"
36 #include "vcardconverter.h"
38 #include "addressee.h"
45 #include <QtCore/QRegExp>
46 #include <QtCore/QStringList>
47 #include <QtCore/QTextCodec>
48 #include <QtCore/QTextStream>
56 AddresseeList::ConstIterator it;
57 AddresseeList::ConstIterator end( addrList.constEnd() );
58 for ( it = addrList.constBegin(); it != end; ++it ) {
64 static void ldif_out( QTextStream &t,
const QString &formatStr,
65 const QString &value )
67 if ( value.isEmpty() ) {
74 t << QString::fromUtf8( txt ) <<
"\n";
79 if ( addr.isEmpty() ) {
83 QTextStream t( &str, QIODevice::WriteOnly|QIODevice::Append );
84 t.setCodec( QTextCodec::codecForName(
"UTF-8" ) );
89 ldif_out( t, QLatin1String(
"dn" ), QString::fromLatin1(
"cn=%1,mail=%2" ).
90 arg( addr.formattedName().simplified() ).
91 arg( addr.preferredEmail() ) );
92 ldif_out( t, QLatin1String(
"givenname" ), addr.givenName() );
93 ldif_out( t, QLatin1String(
"sn" ), addr.familyName() );
94 ldif_out( t, QLatin1String(
"cn" ), addr.formattedName().simplified() );
95 ldif_out( t, QLatin1String(
"uid" ), addr.uid() );
96 ldif_out( t, QLatin1String(
"nickname" ), addr.nickName() );
97 ldif_out( t, QLatin1String(
"xmozillanickname" ), addr.nickName() );
98 ldif_out( t, QLatin1String(
"mozillanickname" ), addr.nickName() );
100 ldif_out( t, QLatin1String(
"mail" ), addr.preferredEmail() );
101 if ( addr.emails().count() > 1 ) {
102 ldif_out( t, QLatin1String(
"mozillasecondemail" ), addr.emails()[ 1 ] );
106 ldif_out( t, QLatin1String(
"telephonenumber" ),
108 ldif_out( t, QLatin1String(
"facsimiletelephonenumber" ),
110 ldif_out( t, QLatin1String(
"homephone" ),
112 ldif_out( t, QLatin1String(
"mobile" ),
114 ldif_out( t, QLatin1String(
"cellphone" ),
116 ldif_out( t, QLatin1String(
"pager" ),
118 ldif_out( t, QLatin1String(
"pagerphone" ),
121 ldif_out( t, QLatin1String(
"streethomeaddress" ), homeAddr.
street() );
122 ldif_out( t, QLatin1String(
"postalcode" ), workAddr.
postalCode() );
123 ldif_out( t, QLatin1String(
"postofficebox" ), workAddr.
postOfficeBox() );
125 QStringList streets = homeAddr.
street().split( QLatin1Char(
'\n' ) );
126 const int numberOfStreets( streets.count() );
127 if ( numberOfStreets > 0 ) {
128 ldif_out( t, QLatin1String(
"homepostaladdress" ), streets[ 0 ] );
130 if ( numberOfStreets > 1 ) {
131 ldif_out( t, QLatin1String(
"mozillahomepostaladdress2" ), streets[ 1 ] );
133 ldif_out( t, QLatin1String(
"mozillahomelocalityname" ), homeAddr.
locality() );
134 ldif_out( t, QLatin1String(
"mozillahomestate" ), homeAddr.
region() );
135 ldif_out( t, QLatin1String(
"mozillahomepostalcode" ), homeAddr.
postalCode() );
136 ldif_out( t, QLatin1String(
"mozillahomecountryname" ),
138 ldif_out( t, QLatin1String(
"locality" ), workAddr.
locality() );
139 ldif_out( t, QLatin1String(
"streetaddress" ), workAddr.
street() );
141 streets = workAddr.
street().split( QLatin1Char(
'\n' ) );
142 if ( streets.count() > 0 ) {
143 ldif_out( t, QLatin1String(
"postaladdress" ), streets[ 0 ] );
145 if ( streets.count() > 1 ) {
146 ldif_out( t, QLatin1String(
"mozillapostaladdress2" ), streets[ 1 ] );
149 ldif_out( t, QLatin1String(
"l" ), workAddr.
locality() );
151 ldif_out( t, QLatin1String(
"st" ), workAddr.
region() );
153 ldif_out( t, QLatin1String(
"title" ), addr.title() );
154 ldif_out( t, QLatin1String(
"vocation" ), addr.prefix() );
155 ldif_out( t, QLatin1String(
"ou" ), addr.role() );
156 ldif_out( t, QLatin1String(
"o" ), addr.organization() );
157 ldif_out( t, QLatin1String(
"organization" ), addr.organization() );
158 ldif_out( t, QLatin1String(
"organizationname" ), addr.organization() );
161 if ( !addr.department().isEmpty() ) {
162 ldif_out( t, QLatin1String(
"department" ), addr.department() );
164 ldif_out( t, QLatin1String(
"department" ), addr.custom( QLatin1String(
"KADDRESSBOOK" ),
165 QLatin1String(
"X-Department" ) ) );
168 ldif_out( t, QLatin1String(
"workurl" ), addr.url().prettyUrl() );
169 ldif_out( t, QLatin1String(
"homeurl" ), addr.url().prettyUrl() );
170 ldif_out( t, QLatin1String(
"mozillahomeurl" ), addr.url().prettyUrl() );
172 ldif_out( t, QLatin1String(
"description" ), addr.note() );
173 if ( addr.revision().isValid() ) {
174 ldif_out( t, QLatin1String(
"modifytimestamp" ), dateToVCardString( addr.revision() ) );
177 const QDateTime birthday = addr.birthday();
178 if ( birthday.isValid() ) {
179 const QDate date = birthday.date();
180 ldif_out( t, QLatin1String(
"birthyear" ), QString::number( date.year() ) );
181 ldif_out( t, QLatin1String(
"birthmonth" ), QString::number( date.month() ) );
182 ldif_out( t, QLatin1String(
"birthday" ), QString::number( date.day() ) );
185 t <<
"objectclass: top\n";
186 t <<
"objectclass: person\n";
187 t <<
"objectclass: organizationalPerson\n";
197 const QDateTime &dt )
199 if ( str.isEmpty() ) {
203 bool endldif =
false, end =
false;
205 Ldif::ParseValue ret;
212 ldif.setLdif( str.toLatin1() );
214 if ( !qdt.isValid() ) {
215 qdt = QDateTime::currentDateTime();
217 a.setRevision( qdt );
222 ret = ldif.nextItem();
226 QString fieldname = ldif.attr().toLower();
227 QString value = QString::fromUtf8( ldif.value(), ldif.value().size() );
228 evaluatePair( a, homeAddr, workAddr, fieldname, value, birthday, birthmonth, birthyear );
234 QDateTime birthDate( QDate( birthyear, birthmonth, birthday ) );
235 if ( birthDate.isValid() ) {
236 a.setBirthday( birthDate );
239 if ( !a.formattedName().isEmpty() || !a.name().isEmpty() ||
240 !a.familyName().isEmpty() ) {
242 a.insertAddress( homeAddr );
245 a.insertAddress( workAddr );
247 addrList.append( a );
250 a.setRevision( qdt );
275 QString &fieldname, QString &value,
276 int &birthday,
int &birthmonth,
int &birthyear )
278 if ( fieldname == QLatin1String(
"dn" ) ) {
282 if ( fieldname.startsWith( QLatin1Char(
'#' ) ) ) {
286 if ( fieldname.isEmpty() && !a.note().isEmpty() ) {
289 a.setNote( a.note() + QLatin1Char(
'\n' ) + value );
293 if ( fieldname == QLatin1String(
"givenname" ) ) {
294 a.setGivenName( value );
298 if ( fieldname == QLatin1String(
"xmozillanickname" ) ||
299 fieldname == QLatin1String(
"nickname" ) ||
300 fieldname == QLatin1String(
"mozillanickname" ) ) {
301 a.setNickName( value );
305 if ( fieldname == QLatin1String(
"sn" ) ) {
306 a.setFamilyName( value );
310 if ( fieldname == QLatin1String(
"uid" ) ) {
314 if ( fieldname == QLatin1String(
"mail" ) ||
315 fieldname == QLatin1String(
"mozillasecondemail" ) ) {
316 if ( a.emails().indexOf( value ) == -1 ) {
317 a.insertEmail( value );
322 if ( fieldname == QLatin1String(
"title" ) ) {
327 if ( fieldname == QLatin1String(
"vocation" ) ) {
328 a.setPrefix( value );
332 if ( fieldname == QLatin1String(
"cn" ) ) {
333 a.setFormattedName( value );
337 if ( fieldname == QLatin1String(
"o" ) ||
338 fieldname == QLatin1String(
"organization" ) ||
339 fieldname == QLatin1String(
"organizationname" ) ) {
340 a.setOrganization( value );
344 if ( fieldname == QLatin1String(
"description" ) ) {
346 if ( !a.note().isEmpty() ) {
347 a.setNote( a.note() + QLatin1Char(
'\n' ) );
349 a.setNote( a.note() + value );
353 if ( fieldname == QLatin1String(
"custom1" ) ||
354 fieldname == QLatin1String(
"custom2" ) ||
355 fieldname == QLatin1String(
"custom3" ) ||
356 fieldname == QLatin1String(
"custom4" ) ) {
360 if ( fieldname == QLatin1String(
"homeurl" ) ||
361 fieldname == QLatin1String(
"workurl" ) ||
362 fieldname == QLatin1String(
"mozillahomeurl" ) ) {
363 if ( a.url().isEmpty() ) {
364 a.setUrl( KUrl( value ) );
367 if ( a.url().prettyUrl() == KUrl( value ).prettyUrl() ) {
374 if ( fieldname == QLatin1String(
"homephone" ) ) {
379 if ( fieldname == QLatin1String(
"telephonenumber" ) ) {
384 if ( fieldname == QLatin1String(
"mobile" ) ) {
389 if ( fieldname == QLatin1String(
"cellphone" ) ) {
394 if ( fieldname == QLatin1String(
"pager" ) ||
395 fieldname == QLatin1String(
"pagerphone" ) ) {
400 if ( fieldname == QLatin1String(
"facsimiletelephonenumber" ) ) {
405 if ( fieldname == QLatin1String(
"xmozillaanyphone" ) ) {
410 if ( fieldname == QLatin1String(
"streethomeaddress" ) ||
411 fieldname == QLatin1String(
"mozillahomestreet" ) ) {
416 if ( fieldname == QLatin1String(
"street" ) ||
417 fieldname == QLatin1String(
"postaladdress" ) ) {
422 if ( fieldname == QLatin1String(
"mozillapostaladdress2" ) ) {
423 workAddr.
setStreet( workAddr.
street() + QLatin1String(
"\n" ) + value );
427 if ( fieldname == QLatin1String(
"postalcode" ) ) {
432 if ( fieldname == QLatin1String(
"postofficebox" ) ) {
437 if ( fieldname == QLatin1String(
"homepostaladdress" ) ) {
442 if ( fieldname == QLatin1String(
"mozillahomepostaladdress2" ) ) {
443 homeAddr.
setStreet( homeAddr.
street() + QLatin1String(
"\n" ) + value );
447 if ( fieldname == QLatin1String(
"mozillahomelocalityname" ) ) {
452 if ( fieldname == QLatin1String(
"mozillahomestate" ) ) {
457 if ( fieldname == QLatin1String(
"mozillahomepostalcode" ) ) {
462 if ( fieldname == QLatin1String(
"mozillahomecountryname" ) ) {
463 if ( value.length() <= 2 ) {
470 if ( fieldname == QLatin1String(
"locality" ) ) {
475 if ( fieldname == QLatin1String(
"streetaddress" ) ) {
480 if ( fieldname == QLatin1String(
"countryname" ) ||
481 fieldname == QLatin1String(
"c" ) ) {
482 if ( value.length() <= 2 ) {
489 if ( fieldname == QLatin1String(
"l" ) ) {
494 if ( fieldname == QLatin1String(
"st" ) ) {
499 if ( fieldname == QLatin1String(
"ou" ) ) {
504 if ( fieldname == QLatin1String(
"department" ) ) {
505 a.setDepartment( value );
509 if ( fieldname == QLatin1String(
"member" ) ) {
511 QStringList list = value.split( QLatin1Char(
',' ) );
514 QStringList::Iterator it;
515 for ( it = list.begin(); it != list.end(); ++it ) {
516 if ( ( *it ).startsWith( QLatin1String(
"cn=" ) ) ) {
517 name = ( *it ).mid( 3 ).trimmed();
519 if ( ( *it ).startsWith( QLatin1String(
"mail=" ) ) ) {
520 email = ( *it ).mid( 5 ).trimmed();
523 if ( !name.isEmpty() && !email.isEmpty() ) {
524 email = QLatin1String(
" <" ) + email + QLatin1Char(
'>' );
526 a.insertEmail( name + email );
527 a.insertCategory( i18n(
"List of Emails" ) );
531 if ( fieldname == QLatin1String(
"modifytimestamp" ) ) {
532 if ( value == QLatin1String(
"0Z" ) ) {
535 QDateTime dt = VCardStringToDate( value );
536 if ( dt.isValid() ) {
542 if ( fieldname == QLatin1String(
"objectclass" ) ) {
546 if ( fieldname == QLatin1String(
"birthyear" ) ) {
547 birthyear = value.toInt();
550 if ( fieldname == QLatin1String(
"birthmonth" ) ) {
551 birthmonth = value.toInt();
554 if ( fieldname == QLatin1String(
"birthday" ) ) {
555 birthday = value.toInt();
559 kWarning( 5700 ) << QString::fromLatin1(
"LDIFConverter: Unknown field for '%1': '%2=%3'\n" ).
560 arg( a.formattedName() ).arg( fieldname ).arg( value );