00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <qsocket.h>
00023
#include <qdir.h>
00024
#include <qtimer.h>
00025
00026
#include <kdebug.h>
00027
#include <klocale.h>
00028
#include <kio/netaccess.h>
00029
#include <libkcal/calendarlocal.h>
00030
00031
#include <addressbooksyncee.h>
00032
#include <calendarsyncee.h>
00033
#include <todosyncee.h>
00034
00035
#include <idhelper.h>
00036
00037
#include "device.h"
00038
#include "desktop.h"
00039
#include "datebook.h"
00040
#include "addressbook.h"
00041
00042
#include "metaaddressbook.h"
00043
#include "metadatebook.h"
00044
#include "metatodo.h"
00045
00046
#include "todo.h"
00047
00048
#include "socket.h"
00049
00050
using namespace KSync;
00051
00052
namespace {
00053
void outputIt(
int area,
Syncee* );
00054 }
00055
00056
class QtopiaSocket::Private
00057 {
00058
public:
00059
enum CallIt
00060 {
00061 NotStarted = 0,
00062 Handshake = 0,
00063 ABook,
00064 Todo,
00065 Calendar,
00066 Transactions,
00067 Files,
00068 Desktops,
00069 Flush
00070 };
00071
00072
enum Status {
00073 Start = 0,
00074 User,
00075 Pass,
00076 Call,
00077 Noop,
00078 Done,
00079 Connected
00080 };
00081
00082 Private(){}
00083
00084
bool connected : 1;
00085
bool startSync : 1;
00086
bool isSyncing : 1;
00087
bool isConnecting : 1;
00088
bool first : 1;
00089
bool meta : 1;
00090
QString src;
00091
QString dest;
00092
QSocket* socket;
00093
QTimer* timer;
00094
QString path;
00095
int mode;
00096
int getMode;
00097
SynceeList m_sync;
00098
00099
QValueList<OpieCategories> categories;
00100
QString partnerId;
00101
QStringList files;
00102
QString tz;
00103 OpieHelper::CategoryEdit* edit;
00104 KonnectorUIDHelper* helper;
00105 OpieHelper::Device* device;
00106 OpieHelper::ExtraMap extras;
00107 };
00108
00109
namespace {
00110
void parseTZ(
const QString& fileName,
QString& tz );
00111 }
00112
00118 QtopiaSocket::QtopiaSocket(
QObject* obj,
const char* name )
00119 :
QObject( obj, name )
00120 {
00121 d =
new Private;
00122 d->socket = 0;
00123 d->timer = 0;
00124 d->connected =
false;
00125 d->startSync =
false;
00126 d->isSyncing =
false;
00127 d->isConnecting =
false;
00128 d->meta =
true ;
00129 d->helper = 0;
00130 d->edit = 0;
00131 d->first =
false;
00132 d->device =
new OpieHelper::Device;
00133 m_flushedApps = 0;
00134 }
00135
00136 QtopiaSocket::~QtopiaSocket()
00137 {
00138
delete d->device;
00139
delete d;
00140 }
00141
00142
void QtopiaSocket::setUser(
const QString& user )
00143 {
00144 d->device->setUser( user );
00145 }
00146
00147
void QtopiaSocket::setPassword(
const QString& pass )
00148 {
00149 d->device->setPassword( pass );
00150 }
00151
00152
void QtopiaSocket::setSrcIP(
const QString& src)
00153 {
00154 d->src = src;
00155 }
00156
00157
void QtopiaSocket::setDestIP(
const QString& dest)
00158 {
00159 d->dest = dest;
00160 }
00161
00162
void QtopiaSocket::setModel(
const QString& model,
const QString& name )
00163 {
00164
if( model == QString::fromLatin1(
"Sharp Zaurus ROM") ){
00165 kdDebug(5225) <<
"Sharp Zaurus ROM match " << endl;
00166 d->device->setDistribution( OpieHelper::Device::Zaurus );
00167 }
else
00168 d->device->setDistribution( OpieHelper::Device::Opie );
00169
00170 d->device->setMeta( name );
00171 }
00172
00173
void QtopiaSocket::startUp()
00174 {
00175 kdDebug(5225) <<
"Start Up " << endl;
00176
delete d->socket;
00177 d->socket =
new QSocket(
this,
"Qtopia Socket" );
00178
00179
00180 connect(d->socket, SIGNAL(error(
int) ),
00181
this, SLOT(slotError(
int) ) );
00182 connect(d->socket, SIGNAL(connected() ),
00183
this, SLOT(slotConnected() ) );
00184 connect(d->socket, SIGNAL(connectionClosed() ),
00185
this, SLOT(slotClosed() ) );
00186 connect(d->socket, SIGNAL(readyRead() ),
00187
this, SLOT(process() ) );
00188
00189 d->connected =
false;
00190 d->startSync =
false;
00191 d->isConnecting =
true;
00192
00193 d->categories.clear();
00194 d->isSyncing =
false;
00195 d->socket->connectToHost(d->dest, 4243 );
00196 }
00197
00198
void QtopiaSocket::hangUP()
00199 {
00200
if (d->isSyncing ) {
00201 emit error(
Error(Error::CouldNotDisconnect, i18n(
"Can not disconnect now. Try again after syncing was finished") ) );
00202
return;
00203 }
00204
00205 disconnect(d->socket, SIGNAL(error(
int) ),
00206
this, SLOT(slotError(
int) ) );
00207 disconnect(d->socket, SIGNAL(connected() ),
00208
this, SLOT(slotConnected() ) );
00209 disconnect(d->socket, SIGNAL(connectionClosed() ),
00210
this, SLOT(slotClosed() ) );
00211 disconnect(d->socket, SIGNAL(readyRead() ),
00212
this, SLOT(process() ) );
00213
delete d->socket;
00214 d->socket = 0;
00215 d->isSyncing =
false;
00216 d->connected =
false;
00217 d->startSync =
false;
00218 d->isConnecting =
false;
00219 d->categories.clear();
00220 d->getMode = d->NotStarted;
00221 d->mode = d->Start;
00222 emit prog( Progress(i18n(
"Disconnected from the device.") ) );
00223 }
00224
00225
void QtopiaSocket::setResources(
const QStringList& list )
00226 {
00227 d->files = list;
00228 }
00229
00230
bool QtopiaSocket::startSync()
00231 {
00232
if ( d->isSyncing )
00233
return false;
00234 d->isSyncing =
true;
00235 d->getMode = d->NotStarted;
00236
00237
if (d->isConnecting ) {
00238 d->startSync =
true;
00239
return true;
00240 }
00241
if (!isConnected() ) {
00242 startUp();
00243 d->startSync =
true;
00244
return true;
00245 }
00246 slotStartSync();
00247
00248
return true;
00249 }
00250
00251
00252
00253
00254
bool QtopiaSocket::isConnected()
00255 {
00256
if ( d->connected || d->mode == d->Call || d->mode == d->Noop || d->mode == d->Connected )
00257
return true;
00258
else
00259
return false;
00260 }
00261
00262
void QtopiaSocket::write(
SynceeList list )
00263 {
00264
if (!isConnected() ) {
00265 emit error(
Error( i18n(
"<qt>Can not write the data back.\n There is no connection to the device") ) );
00266 emit prog( StdProgress::done() );
00267
return;
00268 }
00269
00270 kdDebug(5225) <<
"Writing information back now. Count is " << list.count() << endl;
00271
00272
AddressBookSyncee *abSyncee = list.
addressBookSyncee();
00273
if ( abSyncee ) writeAddressbook( abSyncee );
00274
00275
CalendarSyncee *evSyncee = list.
calendarSyncee();
00276
if ( evSyncee ) writeDatebook( evSyncee );
00277
00278
CalendarSyncee *toSyncee = list.
calendarSyncee();
00279
if ( toSyncee ) writeTodoList( toSyncee );
00280
00281
00282
00283
00284 writeCategory();
00285 d->helper->save();
00286
00287
00288
00289 sendCommand(
"call QPE/Application/datebook reload()" );
00290 sendCommand(
"call QPE/Application/addressbook reload()" );
00291 sendCommand(
"call QPE/Application/todolist reload()" );
00292
00293
00294
00295
00296 sendCommand(
"call QPE/System stopSync()" );
00297 d->isSyncing =
false;
00298
00299
00300
00301
00302 d->first =
false;
00303 emit prog(StdProgress::done() );
00304 }
00305
00306
QString QtopiaSocket::metaId()
const
00307
{
00308
return d->partnerId;
00309 }
00310
00311
void QtopiaSocket::slotError(
int err )
00312 {
00313 d->isSyncing =
false;
00314 d->isConnecting =
false;
00315 kdDebug(5225) <<
"Error " << err <<
" for ip = " << d->dest << endl;
00316
00317 emit error( StdError::connectionLost() );
00318 }
00319
00320
void QtopiaSocket::slotConnected()
00321 {
00322 emit prog( StdProgress::connection() );
00323 d->connected =
true;
00324
delete d->timer;
00325 d->mode = d->Start;
00326 }
00327
00328
void QtopiaSocket::slotClosed()
00329 {
00330 d->connected =
false;
00331 d->isConnecting =
false;
00332 d->isSyncing =
false;
00333 emit error( StdError::connectionLost() );
00334 }
00335
00336
void QtopiaSocket::slotNOOP()
00337 {
00338
if (!d->socket )
return;
00339 sendCommand(
"NOOP" );
00340 }
00341
00342
void QtopiaSocket::process()
00343 {
00344
while ( d->socket->canReadLine() ) {
00345
QTextStream stream( d->socket );
00346
QString line = d->socket->readLine();
00347 kdDebug() <<
"100O " << line << endl;
00348
00349
00350
switch( d->mode ) {
00351
case QtopiaSocket::Private::Start:
00352 start(line);
00353
break;
00354
case QtopiaSocket::Private::User:
00355 user(line);
00356
break;
00357
case QtopiaSocket::Private::Pass:
00358 pass(line);
00359
break;
00360
case QtopiaSocket::Private::Call:
00361 call(line);
00362
break;
00363
case QtopiaSocket::Private::Noop:
00364 noop(line);
00365
break;
00366
default:
00367
break;
00368 }
00369 }
00370 }
00371
00372
void QtopiaSocket::slotStartSync()
00373 {
00374 emit prog( Progress( i18n(
"Starting to sync now") ) );
00375 d->startSync =
false;
00376 sendCommand(
"call QPE/System sendHandshakeInfo()" );
00377 d->getMode = d->Handshake;
00378 d->mode = d->Call;
00379 }
00380
00381 KURL QtopiaSocket::url( Type t )
00382 {
00383
QString uri;
00384 uri = d->path +
"/Applications/";
00385
switch( t ) {
00386
case AddressBook:
00387 uri +=
"addressbook/addressbook.xml";
00388
break;
00389
case TodoList:
00390 uri +=
"todolist/todolist.xml";
00391
break;
00392
case DateBook:
00393 uri +=
"datebook/datebook.xml";
00394
break;
00395 }
00396
return url( uri );
00397 }
00398
00399 KURL QtopiaSocket::url(
const QString& path )
00400 {
00401 KURL url;
00402 url.setProtocol(
"ftp" );
00403 url.setUser( d->device->user() );
00404 url.setPass( d->device->password() );
00405 url.setHost( d->dest );
00406 url.setPort( 4242 );
00407 url.setPath( path );
00408
00409
return url;
00410 }
00411
00412
00413
00414
00415
void QtopiaSocket::writeCategory()
00416 {
00417
QString fileName = QDir::homeDirPath() +
"/.kitchensync/meta/" +d->partnerId +
"/categories.xml";
00418 d->edit->save( fileName );
00419 KURL uri = url( d->path +
"/Settings/Categories.xml" );
00420 KIO::NetAccess::upload( fileName, uri, 0 );
00421 }
00422
00423
void QtopiaSocket::writeAddressbook(
AddressBookSyncee* syncee )
00424 {
00425 emit prog(Progress(i18n(
"Writing AddressBook back to the device") ) );
00426 OpieHelper::AddressBook abDB(d->edit, d->helper, d->tz, d->meta, d->device );
00427 KTempFile* file = abDB.fromKDE( syncee, d->extras );
00428 KURL uri = url( AddressBook );
00429
00430 KIO::NetAccess::upload( file->name(), uri, 0 );
00431 file->unlink();
00432
delete file;
00433
00434
if ( d->meta ) {
00435 OpieHelper::MD5Map map(QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/contacts.md5.qtopia");
00436 OpieHelper::MetaAddressbook metaBook;
00437 metaBook.saveMeta( syncee, map );
00438 map.save( );
00439 }
00440 }
00441
00442
void QtopiaSocket::writeDatebook(
CalendarSyncee* syncee )
00443 {
00444 OpieHelper::DateBook dbDB(d->edit, d->helper, d->tz, d->meta, d->device );
00445 KTempFile* file = dbDB.fromKDE( syncee, d->extras );
00446 KURL uri = url( DateBook );
00447
00448 KIO::NetAccess::upload( file->name(), uri, 0 );
00449 file->unlink();
00450
delete file;
00451
00452
if ( d->meta ) {
00453 OpieHelper::MD5Map map(QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/datebook.md5.qtopia");
00454 OpieHelper::MetaDatebook metaBook;
00455 metaBook.saveMeta( syncee, map );
00456 map.save( );
00457 }
00458 }
00459
00460
void QtopiaSocket::writeTodoList(
CalendarSyncee* syncee)
00461 {
00462 OpieHelper::ToDo toDB(d->edit, d->helper, d->tz, d->meta, d->device );
00463 KTempFile* file = toDB.fromKDE( syncee, d->extras );
00464 KURL uri = url( TodoList );
00465
00466 KIO::NetAccess::upload( file->name(), uri, 0 );
00467 file->unlink();
00468
delete file;
00469
00470
if ( d->meta ) {
00471 OpieHelper::MD5Map map(QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/todolist.md5.qtopia");
00472 OpieHelper::MetaTodo metaBook;
00473 metaBook.saveMeta( syncee, map );
00474 map.save();
00475 }
00476 }
00477
00478
void QtopiaSocket::readAddressbook()
00479 {
00480
KSync::AddressBookSyncee* syncee = 0;
00481 emit prog( StdProgress::downloading(i18n(
"Addressbook") ) );
00482
QString tempfile;
00483
00484
if (!downloadFile(
"/Applications/addressbook/addressbook.xml", tempfile ) ) {
00485 emit error( StdError::downloadError(i18n(
"Addressbook") ) );
00486 syncee =
new KSync::AddressBookSyncee;
00487 tempfile = QString::null;
00488 }
00489
00490 emit prog( StdProgress::converting(i18n(
"Addressbook") ) );
00491
00492
if (!syncee) {
00493 OpieHelper::AddressBook abDB( d->edit, d->helper, d->tz, d->meta, d->device );
00494 syncee = abDB.toKDE( tempfile, d->extras );
00495 }
00496
00497
if (!syncee ) {
00498 KIO::NetAccess::removeTempFile( tempfile );
00499 emit error( i18n(
"Cannot read the addressbook file. It is corrupted.") );
00500
return;
00501 }
00502
00503 syncee->
setFirstSync( d->first );
00504
00505
00506
00507
00508
00509
if ( d->meta && !d->first ) {
00510 emit prog( Progress(i18n(
"Not first sync collecting the changes now") ) );
00511 syncee->
setSyncMode( KSync::Syncee::MetaMode );
00512 OpieHelper::MD5Map map( QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/contacts.md5.qtopia" );
00513 OpieHelper::MetaAddressbook metaBook;
00514 metaBook.doMeta( syncee, map );
00515 }
00516 d->m_sync.append( syncee );
00517
00518
if (!tempfile.isEmpty() )
00519 KIO::NetAccess::removeTempFile( tempfile );
00520 }
00521
00522
CalendarSyncee *QtopiaSocket::defaultCalendarSyncee()
00523 {
00524
CalendarSyncee* syncee = d->m_sync.calendarSyncee();
00525
if ( syncee == 0 )
00526 syncee =
new KSync::CalendarSyncee(
new KCal::CalendarLocal() );
00527
00528
return syncee;
00529 }
00530
00531
void QtopiaSocket::readDatebook()
00532 {
00533 KSync::CalendarSyncee* syncee = defaultCalendarSyncee();
00534 emit prog( StdProgress::downloading(i18n(
"Datebook") ) );
00535
QString tempfile;
00536
00537
bool ok = downloadFile(
"/Applications/datebook/datebook.xml", tempfile );
00538
if ( !ok ) {
00539 emit error( StdError::downloadError(i18n(
"Datebook") ) );
00540 tempfile = QString::null;
00541 }
00542 emit prog( StdProgress::converting(i18n(
"Datebook") ) );
00543
00544
00545
00546
00547
if ( ok ) {
00548 OpieHelper::DateBook dateDB( d->edit, d->helper, d->tz, d->meta, d->device );
00549 ok = dateDB.toKDE( tempfile, d->extras, syncee );
00550 }
00551
00552
if ( !ok ) {
00553 KIO::NetAccess::removeTempFile( tempfile );
00554 emit error( i18n(
"Cannot read the datebook file. It is corrupted.") );
00555
return;
00556 }
00557
00558 syncee->
setFirstSync( d->first );
00559
00560
00561
00562
00563
if ( d->meta && !d->first ) {
00564 emit prog( StdProgress::converting(i18n(
"Datebook") ) );
00565 syncee->
setSyncMode( KSync::Syncee::MetaMode );
00566 OpieHelper::MD5Map map( QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/datebook.md5.qtopia" );
00567 OpieHelper::MetaDatebook metaBook;
00568 metaBook.doMeta( syncee, map );
00569 kdDebug(5229) <<
"Did Meta" << endl;
00570 outputIt(5229, syncee );
00571 }
00572
00573
if ( d->m_sync.find( syncee ) == d->m_sync.end() )
00574 d->m_sync.append( syncee );
00575
00576
if (!tempfile.isEmpty() )
00577 KIO::NetAccess::removeTempFile( tempfile );
00578 }
00579
00580
void QtopiaSocket::readTodoList()
00581 {
00582 KSync::CalendarSyncee* syncee = defaultCalendarSyncee();
00583
QString tempfile;
00584 emit prog( StdProgress::downloading(i18n(
"TodoList") ) );
00585
00586
bool ok = downloadFile(
"/Applications/todolist/todolist.xml", tempfile );
00587
if ( !ok ) {
00588 emit error( StdError::downloadError(i18n(
"TodoList") ) );
00589 tempfile = QString::null;
00590 }
00591
00592
if ( ok ) {
00593 OpieHelper::ToDo toDB( d->edit, d->helper, d->tz, d->meta, d->device );
00594 ok = toDB.toKDE( tempfile, d->extras, syncee );
00595 }
00596
00597
if ( !ok ) {
00598 KIO::NetAccess::removeTempFile( tempfile );
00599 emit error( i18n(
"Cannot read the TodoList file. It is corrupted.") );
00600
return;
00601 }
00602
00603 syncee->
setFirstSync( d->first );
00604
00605
if ( d->meta && !d->first ) {
00606 emit prog( Progress(i18n(
"Not first sync collecting the changes now") ) );
00607 syncee->
setSyncMode( KSync::Syncee::MetaMode );
00608 OpieHelper::MD5Map map( QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId +
"/todolist.md5.qtopia" );
00609 OpieHelper::MetaTodo metaBook;
00610 metaBook.doMeta( syncee, map );
00611 kdDebug(5227) <<
"Did Meta " << endl;
00612 outputIt(5227, syncee );
00613 }
00614
00615
if ( d->m_sync.find( syncee ) == d->m_sync.end() )
00616 d->m_sync.append( syncee );
00617
00618
if (!tempfile.isEmpty() )
00619 KIO::NetAccess::removeTempFile( tempfile );
00620 }
00621
00622
void QtopiaSocket::start(
const QString& line )
00623 {
00624
if ( line.left(3) != QString::fromLatin1(
"220") ) {
00625 emit error(
Error(i18n(
"The device returned bogus data. giving up now.") ) );
00626
00627 d->socket->close();
00628 d->mode = d->Done;
00629 d->connected =
false;
00630 d->isConnecting =
false;
00631 }
else {
00632
00633
00634
00635
00636
if( d->device->distribution() == OpieHelper::Device::Zaurus ){
00637 d->partnerId = d->device->meta();
00638 }
else {
00639
QStringList list = QStringList::split(
";", line );
00640
QString uid = list[1];
00641 uid = uid.mid(11, uid.length()-12 );
00642 d->partnerId = uid;
00643 }
00644 initFiles();
00645 sendCommand(
"USER " + d->device->user() );
00646 d->mode = d->User;
00647 }
00648 }
00649
00650
void QtopiaSocket::user(
const QString &line )
00651 {
00652 emit prog( StdProgress::connected() );
00653
00654
if ( line.left(3) != QString::fromLatin1(
"331") ) {
00655 emit error( StdError::wrongUser( d->device->user() ) );
00656
00657 d->socket->close();
00658 d->mode = d->Done;
00659 d->connected =
false;
00660 d->isConnecting =
false;
00661 }
else{
00662 sendCommand(
"PASS " + d->device->password() );
00663 d->mode = d->Pass;
00664 }
00665 }
00666
00667
void QtopiaSocket::pass(
const QString& line)
00668 {
00669
if ( line.left(3) != QString::fromLatin1(
"230") ) {
00670 emit error( StdError::wrongPassword() );
00671
00672 d->socket->close();
00673 d->mode = d->Done;
00674 d->connected =
false;
00675 d->isConnecting =
false;
00676 }
else {
00677 emit prog( StdProgress::authenticated() );
00678 kdDebug(5225) <<
"Konnected" << endl;
00679 d->mode = d->Noop;
00680 QTimer::singleShot(10000,
this, SLOT(slotNOOP() ) );
00681 }
00682 }
00683
00684
void QtopiaSocket::call(
const QString& line)
00685 {
00686
if ( line.contains(
"220 Command okay" ) &&
00687 ( d->getMode == d->Handshake || d->getMode == d->ABook ) )
00688
return;
00689
00690
if ( line.startsWith(
"CALL QPE/Desktop docLinks(QString)") ) {
00691 emit prog( Progress(i18n(
"Getting the Document Links of the Document Tab") ) );
00692 OpieHelper::Desktop desk( d->edit );
00693
Syncee* sync = desk.toSyncee( line );
00694
if ( sync )
00695 d->m_sync.append( sync );
00696 }
00697
00698
00699
switch( d->getMode ) {
00700
case QtopiaSocket::Private::Handshake:
00701 handshake( line );
00702
break;
00703
case QtopiaSocket::Private::Flush:
00704 flush( line );
00705
break;
00706
case QtopiaSocket::Private::ABook:
00707 download();
00708
break;
00709
case QtopiaSocket::Private::Desktops:
00710 initSync( line );
00711
break;
00712 }
00713 }
00714
00715
void QtopiaSocket::flush(
const QString& _line )
00716 {
00717
if ( _line.startsWith(
"CALL QPE/Desktop flushDone(QString)") ||
00718 _line.startsWith(
"599 ChannelNotRegistered") ) {
00719
00720
QString line = _line.stripWhiteSpace();
00721
QString appName;
00722
00723
if ( line.endsWith(
"datebook" ) ) {
00724 readDatebook();
00725 appName = i18n(
"datebook" );
00726 m_flushedApps++;
00727 }
else if ( line.endsWith(
"todolist" ) ) {
00728 readTodoList();
00729 appName = i18n(
"todolist" );
00730 m_flushedApps++;
00731 }
else if ( line.endsWith(
"addressbook" ) ) {
00732 readAddressbook();
00733 appName = i18n(
"addressbook" );
00734 m_flushedApps++;
00735 }
00736 emit prog( Progress( i18n(
"Flushed " ) + appName ) );
00737 }
00738
00739
00740
if ( m_flushedApps == 3 ) {
00741
00742
00743
00744 d->getMode = d->ABook;
00745 sendCommand(
"call QPE/System getAllDocLinks()" );
00746 m_flushedApps = 0;
00747 }
00748 }
00749
00750
void QtopiaSocket::noop(
const QString & )
00751 {
00752 d->isConnecting =
false;
00753
if (!d->startSync ) {
00754 d->mode = d->Noop;
00755 QTimer::singleShot(10000,
this, SLOT(slotNOOP() ) );
00756 }
else
00757 slotStartSync();
00758 }
00759
00760
void QtopiaSocket::handshake(
const QString &line )
00761 {
00762
QStringList list = QStringList::split( QString::fromLatin1(
" "), line );
00763 d->path = list[3];
00764
if (!d->path.isEmpty() ) {
00765 d->getMode = d->Desktops;
00766 sendCommand(
"call QPE/System startSync(QString) KitchenSync" );
00767 }
00768 }
00769
00770
void QtopiaSocket::download()
00771 {
00772
00773
00774
00775
00776
00777 emit sync( d->m_sync );
00778 d->mode = d->Noop;
00779 d->m_sync.clear();
00780 }
00781
00782
void QtopiaSocket::initSync(
const QString& )
00783 {
00784
00785 d->extras.clear();
00786 emit prog( StdProgress::downloading(
"Categories.xml") );
00787
QString tmpFileName;
00788 downloadFile(
"/Settings/Categories.xml", tmpFileName );
00789
00790
00791
delete d->edit;
00792 d->edit =
new OpieHelper::CategoryEdit( tmpFileName );
00793 KIO::NetAccess::removeTempFile( tmpFileName );
00794
00795
00796
delete d->helper;
00797 d->helper =
new KonnectorUIDHelper( partnerIdPath() );
00798
00799
00800 readTimeZones();
00801
00802
00803 sendCommand(
"call QPE/Application/datebook flush()" );
00804 sendCommand(
"call QPE/Application/addressbook flush()" );
00805 sendCommand(
"call QPE/Application/todolist flush()" );
00806 d->getMode = d->Flush;
00807 }
00808
00809
void QtopiaSocket::initFiles()
00810 {
00811
QDir di( QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId );
00812
00813
00814
00815
if ( di.exists() ) {
00816 d->first =
false;
00817
return;
00818 }
00819
00820 d->first =
true;
00821
QDir dir;
00822 dir.mkdir(QDir::homeDirPath() +
"/.kitchensync");
00823 dir.mkdir(QDir::homeDirPath() +
"/.kitchensync/meta");
00824 dir.mkdir(QDir::homeDirPath() +
"/.kitchensync/meta/" + d->partnerId );
00825 }
00826
00827
QString QtopiaSocket::partnerIdPath()
const
00828
{
00829
QString str = QDir::homeDirPath();
00830 str +=
"/.kitchensync/meta/";
00831 str += d->partnerId;
00832
00833
return str;
00834 }
00835
00836
00837
00838
00839
00840
00841
00842
00843
void QtopiaSocket::readTimeZones()
00844 {
00845 KConfig conf(
"korganizerrc");
00846 conf.setGroup(
"Time & Date");
00847 d->tz = conf.readEntry(
"TimeZoneId", QString::fromLatin1(
"UTC") );
00848 kdDebug(5225) <<
"TimeZone of Korg is " << d->tz << endl;
00849 }
00850
00851
bool QtopiaSocket::downloadFile(
const QString& str,
QString& dest )
00852 {
00853 KURL uri = url( d->path + str );
00854
bool b = KIO::NetAccess::download( uri, dest, 0 );
00855 kdDebug(5225) <<
"Getting " << str <<
" " << b << endl;
00856
return b;
00857 }
00858
00859
void QtopiaSocket::download(
const QString& res )
00860 {
00861 Q_UNUSED( res );
00862 }
00863
00864
void QtopiaSocket::sendCommand(
const QString& cmd )
00865 {
00866
if ( !d->socket )
00867 kdError() <<
"No socket available" << endl;
00868
00869 kdDebug() <<
"100I: " << cmd << endl;
00870
00871
QTextStream stream( d->socket );
00872 stream << cmd << endl;
00873 }
00874
00875
namespace {
00876
00877
void forAll(
int area,
QPtrList<SyncEntry> list )
00878 {
00879
for (
SyncEntry* entry = list.first(); entry != 0; entry = list.next() ) {
00880 kdDebug(area) <<
"State " << entry->
state() << endl;
00881 kdDebug(area) <<
"Summary " << entry->
name() << endl;
00882 kdDebug(area) <<
"Uid " << entry->
id() << endl;
00883 }
00884 }
00885
00886
void outputIt(
int area,
Syncee *s )
00887 {
00888 kdDebug(area) <<
"Added entries" << endl;
00889 forAll( area, s->
added() );
00890
00891 kdDebug(area) <<
"Modified " <<endl;
00892 forAll( area, s->
modified() );
00893
00894 kdDebug(area) <<
"Removed " << endl;
00895 forAll( area, s->
removed() );
00896 }
00897
00898 }
00899
00900
#include "socket.moc"