00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <qdom.h>
00023
#include <qfile.h>
00024
00025
#include <kdebug.h>
00026
00027
00028
#include "device.h"
00029
#include "addressbook.h"
00030
00031
00032
using namespace OpieHelper;
00033
00034 AddressBook::AddressBook( CategoryEdit *edit,
00035 KSync::KonnectorUIDHelper* helper,
00036
const QString &tz,
00037
bool meta, Device *dev )
00038 : Base( edit, helper, tz, meta, dev )
00039 {
00040 }
00041 AddressBook::~AddressBook(){
00042 }
00043
00044
KSync::AddressBookSyncee* AddressBook::toKDE(
const QString &fileName, ExtraMap& map )
00045 {
00046
KSync::AddressBookSyncee *syncee =
new KSync::AddressBookSyncee();
00047 syncee->
setSource(
"Opie");
00048
if ( device() )
00049 syncee->
setSupports( device()->supports( Device::Addressbook ) );
00050
00051
00052
QFile file( fileName );
00053
if ( !file.open(IO_ReadOnly ) ) {
00054
00055
return syncee;
00056 }
00057
00058
QDomDocument doc(
"mydocument" );
00059
if ( !doc.setContent( &file ) ) {
00060 file.close();
00061
delete syncee;
00062
return 0;
00063 }
00064
00065
00066
QDomElement docElem = doc.documentElement( );
00067
QDomNode n = docElem.firstChild();
00068
QStringList attr = attributes();
00069
while ( !n.isNull() ) {
00070
QDomElement e = n.toElement();
00071
if ( !e.isNull() ) {
00072 kdDebug(5228) <<
"Tage Name" << e.tagName() << endl;
00073
if ( e.tagName() == QString::fromLatin1(
"Contacts" ) ) {
00074
QDomNode no = e.firstChild();
00075
while ( !no.isNull() ) {
00076
QDomElement el = no.toElement();
00077
if ( !el.isNull() ) {
00078 kdDebug(5228) <<
"Contacts: " << el.tagName() << endl;
00079 KABC::Addressee adr;
00080 adr.setUid( kdeId(
"AddressBookSyncEntry", el.attribute(
"Uid" ) ) );
00081 adr.setFamilyName( el.attribute(
"LastName" ) );
00082 adr.setGivenName( el.attribute(
"FirstName" ) );
00083 adr.setAdditionalName( el.attribute(
"MiddleName" ) );
00084 adr.setSuffix( el.attribute(
"Suffix" ) );
00085 adr.setNickName( el.attribute(
"Nickname" ) );
00086
00087
QDate date = dateFromString( el.attribute(
"Birthday" ) );
00088
if ( date.isValid() )
00089 adr.setBirthday( date );
00090
00091 adr.setRole( el.attribute(
"JobTitle" ) );
00092
if ( !el.attribute(
"FileAs" ).isEmpty() )
00093 adr.setFormattedName( el.attribute(
"FileAs" ) );
00094
00095 adr.setOrganization( el.attribute(
"Company" ) );
00096
00097 KABC::PhoneNumber businessPhoneNum( el.attribute(
"BusinessPhone" ),
00098 KABC::PhoneNumber::Work );
00099 KABC::PhoneNumber businessFaxNum( el.attribute(
"BusinessFax" ),
00100 KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax );
00101 KABC::PhoneNumber businessMobile( el.attribute(
"BusinessMobile" ),
00102 KABC::PhoneNumber::Work | KABC::PhoneNumber::Cell );
00103 KABC::PhoneNumber businessPager( el.attribute(
"BusinessPager" ),
00104 KABC::PhoneNumber::Work | KABC::PhoneNumber::Pager );
00105
if ( !businessPhoneNum.number().isEmpty() )
00106 adr.insertPhoneNumber( businessPhoneNum );
00107
if ( !businessFaxNum.number().isEmpty() )
00108 adr.insertPhoneNumber( businessFaxNum );
00109
if ( !businessMobile.number().isEmpty() )
00110 adr.insertPhoneNumber( businessMobile );
00111
if ( !businessPager.number().isEmpty() )
00112 adr.insertPhoneNumber( businessPager );
00113
00114
00115
QString DefaultEmail = el.attribute(
"DefaultEmail" );
00116
if ( !DefaultEmail.isEmpty() )
00117 adr.insertEmail( DefaultEmail,
true );
00118
00119
QString Emails = el.attribute(
"Emails");
00120
int emailCount = 1;
00121
QString Email = Emails.section(
' ', 1, 1, QString::SectionSkipEmpty );
00122
while ( !Email.isEmpty() ) {
00123
00124
if ( Email != DefaultEmail )
00125 adr.insertEmail( Email,
false );
00126 emailCount++;
00127 Email = Emails.section(
' ', emailCount, emailCount, QString::SectionSkipEmpty );
00128 }
00129
00130
00131 KABC::PhoneNumber homePhoneNum( el.attribute(
"HomePhone" ),
00132 KABC::PhoneNumber::Home );
00133 KABC::PhoneNumber homeFax( el.attribute(
"HomeFax" ),
00134 KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax );
00135
00136 KABC::PhoneNumber homeMobile( el.attribute(
"HomeMobile" ),
00137 KABC::PhoneNumber::Cell );
00138
00139
if ( !homePhoneNum.number().isEmpty() )
00140 adr.insertPhoneNumber( homePhoneNum );
00141
if ( !homeFax.number().isEmpty() )
00142 adr.insertPhoneNumber( homeFax );
00143
if ( !homeMobile.number().isEmpty() )
00144 adr.insertPhoneNumber( homeMobile );
00145
00146 KABC::Address business( KABC::Address::Work );
00147 business.setStreet( el.attribute(
"BusinessStreet" ) );
00148 business.setLocality( el.attribute(
"BusinessCity" ) );
00149 business.setRegion( el.attribute(
"BusinessState" ) );
00150 business.setPostalCode( el.attribute(
"BusinessZip" ) );
00151 business.setCountry( el.attribute(
"BusinessCountry" ) );
00152
00153
if ( !business.isEmpty() )
00154 adr.insertAddress( business );
00155
00156 KABC::Address home( KABC::Address::Home );
00157 home.setStreet( el.attribute(
"HomeStreet" ) );
00158 home.setLocality( el.attribute(
"HomeCity" ) );
00159 home.setRegion( el.attribute(
"HomeState" ) );
00160 home.setPostalCode( el.attribute(
"HomeZip" ) );
00161 home.setCountry( el.attribute(
"HomeCountry" ) );
00162
00163
if ( !home.isEmpty() )
00164 adr.insertAddress( home );
00165
00166 adr.setNickName( el.attribute(
"Nickname" ) );
00167 adr.setNote( el.attribute(
"Notes" ) );
00168
00169 {
00170
QStringList categories = QStringList::split(
";", el.attribute(
"Categories" ) );
00171
QString cat;
00172
QStringList added;
00173
for ( uint i = 0; i < categories.count(); i++ ) {
00174 cat = m_edit->categoryById( categories[ i ],
"Contacts" );
00175
00176
00177
00178
if ( !cat.isEmpty() && !added.contains( cat ) ) {
00179 adr.insertCategory( cat );
00180 added << cat;
00181 }
00182 }
00183 }
00184
00185
if ( !el.attribute(
"Department" ).isEmpty() )
00186 adr.insertCustom(
"KADDRESSBOOK",
"X-Department", el.attribute(
"Department" ) );
00187
if ( !el.attribute(
"HomeWebPage" ).isEmpty() )
00188 adr.insertCustom(
"opie",
"HomeWebPage", el.attribute(
"HomeWebPage" ) );
00189
if ( !el.attribute(
"Spouse" ).isEmpty() )
00190 adr.insertCustom(
"KADDRESSBOOK",
"X-SpousesName", el.attribute(
"Spouse" ) );
00191
if ( !el.attribute(
"Gender" ).isEmpty() )
00192 adr.insertCustom(
"opie",
"Gender", el.attribute(
"Gender" ) );
00193
00194
QDate ann = dateFromString( el.attribute(
"Anniversary" ) );
00195
if ( ann.isValid() ) {
00196 adr.insertCustom(
"KADDRESSBOOK",
"X-Anniversary", ann.toString( Qt::ISODate ) );
00197 }
00198
00199
if ( !el.attribute(
"Children" ).isEmpty() )
00200 adr.insertCustom(
"opie",
"Children", el.attribute(
"Children") );
00201
if ( !el.attribute(
"Office" ).isEmpty() )
00202 adr.insertCustom(
"KADDRESSBOOK",
"X-Office", el.attribute(
"Office") );
00203
if ( !el.attribute(
"Profession" ).isEmpty() )
00204 adr.insertCustom(
"KADDRESSBOOK",
"X-Profession", el.attribute(
"Profession") );
00205
if ( !el.attribute(
"Assistant" ).isEmpty() )
00206 adr.insertCustom(
"KADDRESSBOOK",
"X-AssistantsName", el.attribute(
"Assistant") );
00207
if ( !el.attribute(
"Manager" ).isEmpty() )
00208 adr.insertCustom(
"KADDRESSBOOK",
"X-ManagersName", el.attribute(
"Manager") );
00209
00210 KSync::AddressBookSyncEntry* entry =
new KSync::AddressBookSyncEntry( adr, syncee );
00211 syncee->
addEntry ( entry );
00212
00213
00214 map.add(
"addressbook", el.attribute(
"Uid" ), el.attributes(), attr );
00215 }
00216
00217 no = no.nextSibling();
00218 }
00219 }
00220 }
00221
00222 n = n.nextSibling();
00223 }
00224
00225
return syncee;
00226 }
00227 KTempFile* AddressBook::fromKDE( KSync::AddressBookSyncee *syncee, ExtraMap& map )
00228 {
00229 kdDebug(5228 ) <<
"From KDE " << endl;
00230
00231 m_kde2opie.clear();
00232
Kontainer::ValueList newIds = syncee->
ids(
"AddressBookSyncEntry");
00233
for ( Kontainer::ValueList::ConstIterator idIt = newIds.begin(); idIt != newIds.end(); ++idIt ) {
00234 m_helper->addId(
"AddressBookSyncEntry", (*idIt).first(), (*idIt).second() );
00235 }
00236 KTempFile* tempFile = file();
00237
if ( tempFile->textStream() ) {
00238
QTextStream *stream = tempFile->textStream();
00239 stream->setEncoding( QTextStream::UnicodeUTF8 );
00240 *stream <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>" << endl;
00241 *stream <<
" <Groups>" << endl;
00242 *stream <<
" </Groups>" << endl;
00243 *stream <<
" <Contacts> " << endl;
00244
00245 KABC::Addressee ab;
00246 KSync::AddressBookSyncEntry *entry;
00247
for ( entry = syncee->
firstEntry(); entry != 0l; entry = syncee->
nextEntry() ) {
00248
if (entry->state() == KSync::SyncEntry::Removed )
00249
continue;
00250 ab = entry->addressee();
00251 *stream <<
"<Contact ";
00252 *stream <<
"FirstName=\"" << escape(ab.givenName()) <<
"\" ";
00253 *stream <<
"MiddleName=\"" << escape(ab.additionalName()) <<
"\" ";
00254 *stream <<
"LastName=\"" << escape(ab.familyName()) <<
"\" ";
00255 *stream <<
"Suffix=\"" << escape(ab.suffix()) <<
"\" ";
00256
00257
QString sortStr;
00258 sortStr = ab.formattedName();
00259
00260
if (sortStr.isEmpty() )
00261 sortStr = ab.assembledName();
00262 *stream <<
"FileAs=\"" << escape(sortStr) <<
"\" ";
00263
00264 *stream <<
"JobTitle=\"" << escape(ab.role()) <<
"\" ";
00265 *stream <<
"Department=\"" << escape(ab.custom(
"KADDRESSBOOK",
"X-Department" )) <<
"\" ";
00266 *stream <<
"Company=\"" << escape(ab.organization()) <<
"\" ";
00267
00268 KABC::PhoneNumber businessPhoneNum = ab.phoneNumber(KABC::PhoneNumber::Work );
00269 *stream <<
"BusinessPhone=\"" << escape( businessPhoneNum.number() ) <<
"\" ";
00270
00271 KABC::PhoneNumber businessFaxNum = ab.phoneNumber(KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax );
00272 *stream <<
"BusinessFax=\"" << escape( businessFaxNum.number() )<<
"\" ";
00273
00274 KABC::PhoneNumber businessMobile = ab.phoneNumber(KABC::PhoneNumber::Work | KABC::PhoneNumber::Cell );
00275 *stream <<
"BusinessMobile=\"" << escape( businessMobile.number() ) <<
"\" ";
00276
00277 *stream <<
"DefaultEmail=\"" << escape( ab.preferredEmail() ) <<
"\" ";
00278
QStringList list = ab.emails();
00279
if ( list.count() > 0 ) {
00280 QStringList::Iterator it = list.begin();
00281 *stream <<
"Emails=\"" << escape( *it );
00282
while (++it != list.end())
00283 *stream <<
' ' << escape( *it );
00284 *stream <<
"\" ";
00285 }
00286
00287 KABC::PhoneNumber homePhoneNum = ab.phoneNumber(KABC::PhoneNumber::Home );
00288 *stream <<
"HomePhone=\"" << escape( homePhoneNum.number() ) <<
"\" ";
00289
00290 KABC::PhoneNumber homeFax = ab.phoneNumber( KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax );
00291 *stream <<
"HomeFax=\"" << escape( homeFax.number() ) <<
"\" ";
00292
00293 KABC::PhoneNumber homeMobile = ab.phoneNumber( KABC::PhoneNumber::Cell );
00294 *stream <<
"HomeMobile=\"" << escape( homeMobile.number() ) <<
"\" ";
00295
00296 KABC::Address business = ab.address(KABC::Address::Work );
00297 *stream <<
"BusinessStreet=\"" << escape( business.street() ) <<
"\" ";
00298 *stream <<
"BusinessCity=\"" << escape( business.locality() ) <<
"\" ";
00299 *stream <<
"BusinessZip=\"" << escape( business.postalCode() ) <<
"\" ";
00300 *stream <<
"BusinessCountry=\"" << escape( business.country() ) <<
"\" ";
00301 *stream <<
"BusinessState=\"" << escape( business.region() ) <<
"\" ";
00302
00303 *stream <<
"Office=\"" << escape( ab.custom(
"KADDRESSBOOK",
"X-Office" ) ) <<
"\" ";
00304 *stream <<
"Profession=\"" << escape( ab.custom(
"KADDRESSBOOK",
"X-Profession" ) ) <<
"\" ";
00305 *stream <<
"Assistant=\"" << escape( ab.custom(
"KADDRESSBOOK",
"X-AssistantsName") ) <<
"\" ";
00306 *stream <<
"Manager=\"" << escape( ab.custom(
"KADDRESSBOOK",
"X-ManagersName" ) ) <<
"\" ";
00307
00308 KABC::Address home = ab.address( KABC::Address::Home );
00309 *stream <<
"HomeStreet=\"" << escape( home.street() ) <<
"\" ";
00310 *stream <<
"HomeCity=\"" << escape( home.locality() ) <<
"\" ";
00311 *stream <<
"HomeState=\"" << escape( home.region() ) <<
"\" ";
00312 *stream <<
"HomeZip=\"" << escape( home.postalCode() ) <<
"\" ";
00313 *stream <<
"HomeCountry=\"" << escape( home.country() ) <<
"\" ";
00314
00315 *stream <<
"HomeWebPage=\"" << escape( ab.custom(
"opie",
"HomeWebPage" ) ) <<
"\" ";
00316 *stream <<
"Spouse=\"" << escape( ab.custom(
"KADDRESSBOOK",
"X-SpousesName") ) <<
"\" ";
00317 *stream <<
"Gender=\"" << escape( ab.custom(
"opie",
"Gender") ) <<
"\" ";
00318
00319
if ( ab.birthday().date().isValid() )
00320 *stream <<
"Birthday=\"" << escape( dateToString(ab.birthday().date() ) ) <<
"\" ";
00321
00322
00323
00324
00325
00326 {
00327
QDate ann = QDate::fromString( ab.custom(
"KADDRESSBOOK",
"X-Anniversary"), Qt::ISODate );
00328
if (ann.isValid() ) {
00329 *stream <<
"Anniversary=\"" << escape( dateToString( ann ) ) <<
"\" ";
00330 }
00331 }
00332 *stream <<
"Nickname=\"" << escape( ab.nickName() ) <<
"\" ";
00333 *stream <<
"Children=\"" << escape( ab.custom(
"opie",
"Children" ) ) <<
"\" ";
00334 *stream <<
"Notes=\"" << escape( ab.note() ) <<
"\" ";
00335 *stream <<
"Categories=\"" << categoriesToNumber( ab.categories(),
"Contacts") <<
"\" ";
00336
00337
QString uid = konnectorId(
"AddressBookSyncEntry", ab.uid() );
00338 *stream <<
"Uid=\"" << uid <<
"\" ";
00339 *stream << map.toString(
"addressbook", uid );
00340 *stream <<
" />" << endl;
00341 }
00342 *stream <<
"</Contacts>" << endl;
00343 *stream <<
"</AddressBook>" << endl;
00344 }
00345
00346 m_helper->replaceIds(
"AddressBookSyncEntry", m_kde2opie );
00347
00348 tempFile->close();
00349
00350
return tempFile;
00351 }
00352
00353
QStringList AddressBook::attributes()const {
00354
QStringList lst;
00355 lst <<
"FirstName";
00356 lst <<
"MiddleName";
00357 lst <<
"LastName";
00358 lst <<
"Suffix";
00359 lst <<
"FileAs";
00360 lst <<
"JobTitle";
00361 lst <<
"Department";
00362 lst <<
"Company";
00363 lst <<
"BusinessPhone";
00364 lst <<
"BusinessFax";
00365 lst <<
"BusinessMobile";
00366 lst <<
"DefaultEmail";
00367 lst <<
"Emails";
00368 lst <<
"HomePhone";
00369 lst <<
"HomeFax";
00370 lst <<
"HomeMobile";
00371 lst <<
"BusinessStreet";
00372 lst <<
"BusinessCity";
00373 lst <<
"BusinessZip";
00374 lst <<
"BusinessCountry";
00375 lst <<
"BusinessState";
00376 lst <<
"Office";
00377 lst <<
"Profession";
00378 lst <<
"Assistant";
00379 lst <<
"Manager";
00380 lst <<
"HomeStreet";
00381 lst <<
"HomeCity";
00382 lst <<
"HomeState";
00383 lst <<
"HomeZip";
00384 lst <<
"HomeCountry";
00385 lst <<
"HomeWebPage";
00386 lst <<
"Spouse";
00387 lst <<
"Gender";
00388 lst <<
"Anniversary";
00389 lst <<
"Nickname";
00390 lst <<
"Children";
00391 lst <<
"Notes";
00392 lst <<
"Categories";
00393 lst <<
"Uid";
00394 lst <<
"Birthday";
00395
00396
return lst;
00397 }
00398
00399
00400
QDate AddressBook::fromString(
const QString &datestr )
00401 {
00402
if (datestr.isEmpty() )
00403
return QDate();
00404
00405
int monthPos = datestr.find(
'.');
00406
int yearPos = datestr.find(
'.', monthPos+1 );
00407
if ( monthPos == -1 || yearPos == -1 ) {
00408
return QDate();
00409 }
00410
int d = datestr.left( monthPos ).toInt();
00411
int m = datestr.mid( monthPos+1, yearPos - monthPos - 1 ).toInt();
00412
int y = datestr.mid( yearPos+1 ).toInt();
00413
QDate date ( y,m,d );
00414
00415
00416
return date;
00417 }
00418
00419
00420
QString AddressBook::dateToString(
const QDate &d )
00421 {
00422
if ( d.isNull() || !d.isValid() )
00423
return QString::null;
00424
00425
00426
QString year = QString::number( d.year() );
00427
QString month = QString::number( d.month() );
00428 month = month.rightJustify( 2,
'0' );
00429
QString day = QString::number( d.day() );
00430 day = day.rightJustify( 2,
'0' );
00431
00432
QString str = year + month + day;
00433
00434
return str;
00435 }
00436
00437
QDate AddressBook::dateFromString(
const QString& s )
00438 {
00439
QDate date;
00440
00441
if ( s.isEmpty() )
00442
return date;
00443
00444
00445
00446 date = fromString ( s );
00447
if ( date.isValid() )
00448
return date;
00449
00450
00451
int year = s.mid(0, 4).toInt();
00452
int month = s.mid(4,2).toInt();
00453
int day = s.mid(6,2).toInt();
00454
00455
00456
if ( year < 1900 || year > 3000 )
00457
return date;
00458
00459
if ( month < 0 || month > 12 )
00460
return date;
00461
00462
if ( day < 0 || day > 31 )
00463
return date;
00464
00465
00466 date.setYMD( year, month, day );
00467
00468
if ( !date.isValid() )
00469
return QDate();
00470
00471
00472
return date;
00473 }