summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/korganizer/howtoSYNC.txt19
-rw-r--r--libkdepim/ksyncmanager.cpp58
-rw-r--r--libkdepim/ksyncmanager.h1
3 files changed, 64 insertions, 14 deletions
diff --git a/bin/kdepim/korganizer/howtoSYNC.txt b/bin/kdepim/korganizer/howtoSYNC.txt
index d3046de..c4e80f5 100644
--- a/bin/kdepim/korganizer/howtoSYNC.txt
+++ b/bin/kdepim/korganizer/howtoSYNC.txt
@@ -22,344 +22,359 @@ CONTENT:
*************************************************************************
Note:
The recommended and easiest way to syncronize two devices where
KO/Pi or KA/Pi is installed, is the profile kind "Pi-Sync".
Details about that in 5) b).
In KDE-Pim/Pi you can synchronize ( sync ) your calendar/addressbook
with another calendar/addressbook , by syncing your
(local) calendar/addressbook with a (remote) file.
This remote file may on your local filesystem
or on another (remote) device.
If you want to sync with another remote device,
you have two create a sync profile.
You have two choices for choosing the profil kind:
I) You have to choose profile kind "Remote file" and to specify a
command line download/upload command ( like scp, ftp, ...) to
a) download the remote file to your local machine to a temp file
b) sync with this temp file
c) upload the synced file to the remote device
II) If you want to sync with a device, where KO/Pi( or KA/Pi ) is
installed, you can easily get the remote file via network
with the build in file transfer feature:
Choose profile kind "Pi-Sync" and
a) Start KO/Pi or KA/Pi on remote device and
enable "Pi-Sync" on remote device with password and port.
b) Specify password, port and IP address in your profile.
You can sync with your mobile phone as well.
Everything is explained in more details below.
NOTE:
If you do not use profile kind "Pi-Sync",
it is recommended to close
a running KO/Pi ( or KA/Pi) on the remote device.
(Note: KO/Pi( or KA/Pi) running on Zaurus with
FastLoad enabled will never be closed!)
After syncing with a running KO/Pi on the remote device,
a "save" on the remote device will tell you that it needs to merge (sync).
After merging (just a syncing with the changed file)
you will get the new data showing in remote KO/Pi.
*************************************************************************
1) Qick overview of settings
*************************************************************************
a) Open sync settings dialog (Menu Synchronize - Configure...)
b) Give your device a unique name.
(unique in the set of all devices you want to sync with).
If you have already configured another devive and created
there a sync profile to sync with this device, give your device
the same name as this sync profile! The same name is important,
because it makes it possible to sync first A->B
(A local device, that performs the sync, B remote device)
and then B->A. Such that the B->A sync knows about the
already performed A->B sync.
That means: It is unimportant if you sync A->B or B->A,
the devices A and B will be synced properly.
c) Create a new sync profile and give it a unique name.
(unique in the set of all sync profiles on this device).
If you want to sync with a device, where KO/Pi is already installed
and which has a given unique device name, use this device name as
your profile name ( refer to b) ).
d) Coose the profile kind of your syncing method:
(i) Local file or
(ii) Pi-Sync or
(iii) Remote file or
(iiii) Mobile Phone.
Detailed explanation in 5)
e) Choose the other profile options.
Detailed explanation in 2)
f) Close sync dialog with OK.
g) Sync.
NOTE:
AFTER SYNCING THERE ARE "SYNC EVENTS" CREATED
(OR UPDATED, IF IT ALREADY EXITS) FOR EACH SYNC PROFILE.
YOU MAY NOT DELETE OR CHANGE THESE EVENTS.
*************************************************************************
2) Sync settings in sync dialog
*************************************************************************
a) Local device name:
-> 1) b)
b) Profile:
-> 1) c)
c) Include in multiple sync:
In the Synchronize menu, there is a multiple sync menu entry.
If you choose this menu entry, all user defined profiles with this
'Include in multiple sync' option enabled will be synced
one after another. And this twice. This will take some time.
After that sync, on all devices should be the same data.
d) Ask for preferences before sync:
- Check this to be asked for sync settings before each sync.
+ Check this to be asked for sync preferences settings before each sync.
+ If the profile kind is "Pi-Sync" you will be asked to confirm
+ the "Pi-Sync" specific settings (Password,IP address, port number)
+ as well. That makes it possible to use that profile for a
+ device that is connected via DHCP to the network and gets different
+ IP addresses when connection to the network.
e) Sync preferences:
Choose here your sync preferences.
Details -> 4)
f) Show summary after sync:
Check this to get a small summary dialog after sync
about number of added/changed/deleted events on local/remote.
g) Write back synced data:
Uncheck this to update the local calendar only.
I.e. your local calendar is synced with the remote calendar
but nothing on the remote calendar is changed.
If you uncheck "Write back synced data", the settings
under h) and i) are ignored, of course.
h) --Write back (on remote) existing entries only:
Check this to update the remote data only.
I.e. no data from yor local calendar/addressbook is added to the
remote device. You may use this option to
sync against some kind of "public calendar/addressbook" without
writing back your personal data.
i) --Write back (calendar) entries in future only:
Check this to write back only calendar entries in future.
(Useful when syncing with mobile phones.)
You can specify the date range in weeks with
---- Max. weeks in future.
Note: The date range starts always 7 days before the actual date!
I.e. the calendar events of the last week are written back always.
j) Profile kind:
Details -> 5)
*************************************************************************
3) Syncing background
*************************************************************************
The same mentioned for calendars is valid for addressbooks as well.
Synchronizing calendars ( i.e. files ) means,
to merge two calendars in a useful way.
If the two calendars are completely different,
there is no problem, the resulting calendar contains
all data from the local and from the remote calendar.
Problems will occur, if you have edited items
from the local calendar on the remote machine.
Then it could be, that items are in conflict.
Two items are "in conflict", if they have the
same unique ID (which get an item at time of
creation and owns it until it is deleted )
and they both are modified after the last
synchronization.
At first sync of two calendars there is no item deleted.
If the calendars are synced before and there is an item,
which is not edited after the last sync and is only
available in one calendar, then this item is deleted
in this calendar.
But when was the last synchronization between two calendars?
To know that, KO/Pi creates at first syncing
of two files an unique event "<profile name> - sync Event"
on the remote and the local calendar.
After syncing, the start time of this event is set
to the time of syncing.
The event is read only and the user may not change it.
If two such files are synced, that both have an event
"<profile name> - sync Event" and the events have
the same start time, then deleted items on the one calendar
are deleted on the other as well.
*************************************************************************
4) Sync preferences
*************************************************************************
Two items are "in conflict", if they have the same unique ID
and they both are modified after the last synchronization.
(Details -> 3) ).
If an item is not modified after the last sync and
it is not found in the other calendar, it is deleted.
On the first sync, there is no item deleted.
SYNC PREFERENCES:
-Take local entry on conflict:
Takes the local entry on conflict.
If it is the first sync,
"Ask for every entry"
is chosen automatically,
if this is selected.
-Take remote entry on conflict:
Takes the remote entry on conflict.
If it is the first sync,
"Ask for every entry"
is chosen automatically,
if this is selected.
-Take newest entry on conflict:
This takes the newest entry on conflict.
May be the most useful syncing mode.
-Ask for every entry on conflict:
Pops up an event viewer dialog and
shows the two conflicting entries there.
The user can chose, which entry he would like to take.
The button for the newest entry
is automatically set as default button.
The color for the newest entry is green.
-Force: Take local entry always:
Even if the calendars are already synced
there is no item deleted on local.
-Force: Take remote entry always:
Analogous to
"Force: Take local entry always"
*************************************************************************
5) Details about sync profile kinds
*************************************************************************
a) Local file
Please specify a local file you want to sync with.
b) Pi-Sync (direct Kx/Pi to Kx/Pi sync)
We mention here only KO/Pi, but the same is valid for KA/Pi.
If you want to sync with a device, where KO/Pi is
installed, you can easily get the remote file via network
with the build in file transfer feature "Pi-Sync":
You have first to enable file transfer on the remote device:
- Start KO/Pi on the remote device.
- Choose Menu Synchronize-Enable Pi-Sync.
- Choose a port number, where KO/Pi should listen for
file sending requests. Valid port numbers are numbers
between 1 and 65565. Do not specify port numbers, that are
used by other applications. A port number between 9000 and 9999
is most likely not used by another application.
The default port number is 9197 for KO/Pi.
If you specify a port number, which is already in use,
you will get an error message when closing this dialog.
- Choose a password.
- Click OK.
Now KO/Pi will send the calendar data via the network,
if some other device is sending a "please send calendar"
request on the given port using the given password.
If you want to be sure, nobody can access your calendar
data, simply disable the file transfer feature on the
remote device after the syncing is done by choosing:
Menu Synchronize-Disable Pi-Sync.
-
+
+ Note: If you want to sync with a remote device that gets different
+ IPaddresses each time connected to the network
+ (this may be the case, if you use DHCP for connection
+ of the remote device to the network) simply enable
+ "Ask for preferences before sync".
+ Then you will be asked to confirm the
+ "Pi-Sync" specific settings
+ (Password,IP address, port number)
+ and you can easily change the IP address before each sync.
+
On your local device, create a new profile and choose
profile kind "Pi-Sync".
Fill in the needed values:
- Password for remote access:
The password you specified on the remote device.
- Remote IP address:
The IP address of the remote device.
- Remote port number:
The port number you specified on the remote device.
Now you can syncronize your local device easily with your
remote device. This works well for all platforms KO/Pi is
running on, e.g. syncing a KO/Pi on Zaurus with KO/Pi on Windows
is now very easy.
c) Remote file
Syncing with the profile kind "Remote file" is performed in three steps:
i) download the remote file to your local machine to a temp file
ii) sync with this temp file
iii) upload the synced file to the remote device
The down-/uploading if i) and iii) is done via a command line command.
Please specify the download/upload command ( like scp, ftp, ...) and the
file name of the temp file in the corresponding fields.
d) Mobile device (cell phone)
Note: On the Zaurus you have to install the kammu_xxx_arm.ipk package
to be able to access mobile phones.
We mention here only KO/Pi, but the same is valid for KA/Pi.
Note:
It is only possible to sync a mobile phone with one particular device
running KO/Pi. If you want to be able to write data of more than one device
to the mobile phone (e.g. from your Zaurus and from your Windows Laptop)
do not sync with the mobile phone at all, but use the
"Export to phone" functionality from the different devices.
Using "Export to phone" makes it not possible to get back data from the
phone, if it was changed there, of course.
If you sync with the phone, do not use "Export to phone" from any device.
(And do not sync, as mentioned above, from any other device with that phone).
It would delete the needed information for syncing with that phone!
We are using Gammu (Version: 0.98.9) ( http://freshmeat.net/projects/gammu/ )
for accessing the phones.
Note: You cannot use the original Gammu for syncing KDE-Pim/Pi, because
we have modified the original version to make it useable for syncing!
Gammu allows access to many phones in many ways (Irda, Bluetooth, serial,...).
The recommended phone access using Gammu with KDE-Pim/Pi is Irda (infrared).
Bluetooth access is disabled on the Zaurus, but may work on Windows.
Please look at the Gammu homepage and documentation about more details
configuring Gammu how to access your phone.
If you have problems accessing your phone, start KO/Pi from the konsole
and you will get a more detailed output what went wrong.
About Gammu from the Gammu homepage:
Gammu (formerly known as MyGnokii2) is a cellular
manager for various mobile phones/modems.
It supports the Nokia 2100, 3100, 32xx, 33xx,
3410, 35xx, 51xx, 5210, 5510, 61xx, 62xx,
63xx, 6510, 6610, 6800, 71xx, 7210, 7250,
7250i, 82xx, 83xx, 8910, 9110, 9210
and compatible and AT devices (Siemens, Alcatel,
Falcom, WaveCom, IPAQ, Samsung, SE, and others)
over cables/infrared/BlueTooth.
Here is an example what to specify to access a Nokia 6310i via infrared:
On Linux (Zaurus):
I/O device: /dev/ircomm
Connection: irda
Model: <leave empty>
On Windows:
I/O device: <ignored - i.e. leave empty>
Connection: irda
Model: <leave empty>
Here is the overview from the Gammu documentation,
how to specify the connection settings for
I/O device:
Connection:
Model:
Note: The documentation uses the term "port",
where we use the term "I/O device".
Note: You do not have to create/change the gammurc configuration file.
That will do KO/Pi for you.
Note: For a known model, leave "Model:" always empty,
such that Gammu can auto detect the model.
# This is a sample ~/.gammurc file.
# In Unix/Linux copy it into your home directory and name it .gammurc
# or into /etc and name it gammurc
# In Win32 copy it into directory with Gammu.exe and name gammurc
# More about parameters later
# -----------------------------------------------------------------------------
[gammu]
diff --git a/libkdepim/ksyncmanager.cpp b/libkdepim/ksyncmanager.cpp
index b3e266a..0faa24d 100644
--- a/libkdepim/ksyncmanager.cpp
+++ b/libkdepim/ksyncmanager.cpp
@@ -516,492 +516,523 @@ int KSyncManager::ringSync()
return syncedProfiles;
}
void KSyncManager::syncRemote( KSyncProfile* prof, bool ask)
{
QString question;
if ( ask ) {
question = i18n("Do you really want\nto remote sync\nwith profile \n")+ prof->getName()+" ?\n";
if ( QMessageBox::information( mParent, i18n("Sync"),
question,
i18n("Yes"), i18n("No"),
0, 0 ) != 0 )
return;
}
QString preCommand;
QString localTempFile;
QString postCommand;
switch(mTargetApp)
{
case (KAPI):
preCommand = prof->getPreSyncCommandAB();
postCommand = prof->getPostSyncCommandAB();
localTempFile = prof->getLocalTempFileAB();
break;
case (KOPI):
preCommand = prof->getPreSyncCommand();
postCommand = prof->getPostSyncCommand();
localTempFile = prof->getLocalTempFile();
break;
case (PWMPI):
preCommand = prof->getPreSyncCommandPWM();
postCommand = prof->getPostSyncCommandPWM();
localTempFile = prof->getLocalTempFilePWM();
break;
default:
qDebug("KSyncManager::syncRemote: invalid apptype selected");
break;
}
int fi;
if ( (fi = preCommand.find("$PWD$")) > 0 ) {
QString pwd = getPassword();
preCommand = preCommand.left( fi )+ pwd + preCommand.mid( fi+5 );
}
int maxlen = 30;
if ( QApplication::desktop()->width() > 320 )
maxlen += 25;
mParent->topLevelWidget()->setCaption ( i18n( "Copy remote file to local machine..." ) );
int fileSize = 0;
int result = system ( preCommand );
// 0 : okay
// 256: no such file or dir
//
qDebug("KO: Remote copy result(0 = okay): %d ",result );
if ( result != 0 ) {
unsigned int len = maxlen;
while ( len < preCommand.length() ) {
preCommand.insert( len , "\n" );
len += maxlen +2;
}
question = i18n("Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n").arg (preCommand) ;
QMessageBox::information( mParent, i18n("Sync - ERROR"),
question,
i18n("Okay!")) ;
mParent->topLevelWidget()->setCaption ("KDE-Pim");
return;
}
mParent->topLevelWidget()->setCaption ( i18n( "Copying succeed." ) );
//qDebug(" file **%s** ",prof->getLocalTempFile().latin1() );
if ( syncWithFile( localTempFile, true ) ) {
if ( mWriteBackFile ) {
int fi;
if ( (fi = postCommand.find("$PWD$")) > 0 ) {
QString pwd = getPassword();
postCommand = postCommand.left( fi )+ pwd + postCommand.mid( fi+5 );
}
mParent->topLevelWidget()->setCaption ( i18n( "Writing back file ..." ) );
result = system ( postCommand );
qDebug("Writing back file result: %d ", result);
if ( result != 0 ) {
mParent->topLevelWidget()->setCaption ( i18n( "Writing back file result: " )+QString::number( result ) );
return;
} else {
mParent->topLevelWidget()->setCaption ( i18n( "Syncronization sucessfully completed" ) );
}
}
}
return;
}
-
+void KSyncManager::edit_pisync_options()
+{
+ QDialog dia( mParent, "dia", true );
+ dia.setCaption( i18n("Pi-Sync options for device: " ) +mCurrentSyncDevice );
+ QVBoxLayout lay ( &dia );
+ lay.setSpacing( 5 );
+ lay.setMargin( 3 );
+ QLabel lab1 ( i18n("Password for remote access:"), &dia);
+ lay.addWidget( &lab1 );
+ QLineEdit le1 (&dia );
+ lay.addWidget( &le1 );
+ QLabel lab2 ( i18n("Remote IP address:"), &dia);
+ lay.addWidget( &lab2 );
+ QLineEdit le2 (&dia );
+ lay.addWidget( &le2 );
+ QLabel lab3 ( i18n("Remote port number:"), &dia);
+ lay.addWidget( &lab3 );
+ QLineEdit le3 (&dia );
+ lay.addWidget( &le3 );
+ QPushButton pb ( "OK", &dia);
+ lay.addWidget( &pb );
+ connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
+ le1.setText( mPassWordPiSync );
+ le2.setText( mActiveSyncIP );
+ le3.setText( mActiveSyncPort );
+ if ( dia.exec() ) {
+ mPassWordPiSync = le1.text();
+ mActiveSyncPort = le3.text();
+ mActiveSyncIP = le2.text();
+ }
+
+}
void KSyncManager::edit_sync_options()
{
- //mDialogManager->showSyncOptions();
- //mSyncAlgoPrefs
+
QDialog dia( mParent, "dia", true );
dia.setCaption( i18n("Device: " ) +mCurrentSyncDevice );
QButtonGroup gr ( 1, Qt::Horizontal, i18n("Sync preferences"), &dia);
QVBoxLayout lay ( &dia );
lay.setSpacing( 2 );
lay.setMargin( 3 );
lay.addWidget(&gr);
QRadioButton loc ( i18n("Take local entry on conflict"), &gr );
QRadioButton rem ( i18n("Take remote entry on conflict"), &gr );
QRadioButton newest( i18n("Take newest entry on conflict"), &gr );
QRadioButton ask( i18n("Ask for every entry on conflict"), &gr );
QRadioButton f_loc( i18n("Force: Take local entry always"), &gr );
QRadioButton f_rem( i18n("Force: Take remote entry always"), &gr );
//QRadioButton both( i18n("Take both on conflict"), &gr );
QPushButton pb ( "OK", &dia);
lay.addWidget( &pb );
connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
switch ( mSyncAlgoPrefs ) {
case 0:
loc.setChecked( true);
break;
case 1:
rem.setChecked( true );
break;
case 2:
newest.setChecked( true);
break;
case 3:
ask.setChecked( true);
break;
case 4:
f_loc.setChecked( true);
break;
case 5:
f_rem.setChecked( true);
break;
case 6:
// both.setChecked( true);
break;
default:
break;
}
if ( dia.exec() ) {
mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ;
}
}
QString KSyncManager::getPassword( )
{
QString retfile = "";
QDialog dia ( mParent, "input-dialog", true );
QLineEdit lab ( &dia );
lab.setEchoMode( QLineEdit::Password );
QVBoxLayout lay( &dia );
lay.setMargin(7);
lay.setSpacing(7);
lay.addWidget( &lab);
dia.setFixedSize( 230,50 );
dia.setCaption( i18n("Enter password") );
QPushButton pb ( "OK", &dia);
lay.addWidget( &pb );
connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
dia.show();
int res = dia.exec();
if ( res )
retfile = lab.text();
dia.hide();
qApp->processEvents();
return retfile;
}
void KSyncManager::confSync()
{
static KSyncPrefsDialog* sp = 0;
if ( ! sp ) {
sp = new KSyncPrefsDialog( mParent, "syncprefs", true );
}
sp->usrReadConfig();
#ifndef DESKTOP_VERSION
sp->showMaximized();
#else
sp->show();
#endif
sp->exec();
mSyncProfileNames = sp->getSyncProfileNames();
mLocalMachineName = sp->getLocalMachineName ();
QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
}
void KSyncManager::syncSharp()
{
if ( ! syncExternalApplication("sharp") )
qDebug("ERROR sync sharp ");;
}
bool KSyncManager::syncExternalApplication(QString resource)
{
emit save();
if ( mAskForPreferences )
edit_sync_options();
qDebug("sync %s", resource.latin1());
bool syncOK = mImplementation->syncExternal(this, resource);
return syncOK;
}
void KSyncManager::syncPhone()
{
syncExternalApplication("phone");
}
void KSyncManager::showProgressBar(int percentage, QString caption, int total)
{
if (!bar->isVisible())
{
bar->setCaption (caption);
bar->setTotalSteps ( total ) ;
bar->show();
}
bar->setProgress( percentage );
}
void KSyncManager::hideProgressBar()
{
bar->hide();
}
bool KSyncManager::isProgressBarCanceled()
{
return !bar->isVisible();
}
QString KSyncManager::syncFileName()
{
QString fn = "tempfile";
switch(mTargetApp)
{
case (KAPI):
fn = "tempsyncab.vcf";
break;
case (KOPI):
fn = "tempsynccal.ics";
break;
case (PWMPI):
fn = "tempsyncpw.pwm";
break;
default:
break;
}
#ifdef _WIN32_
return locateLocal( "tmp", fn );
#else
return (QString( "/tmp/" )+ fn );
#endif
}
-
void KSyncManager::syncPi()
{
qApp->processEvents();
+ if ( mAskForPreferences )
+ edit_pisync_options();
bool ok;
Q_UINT16 port = mActiveSyncPort.toUInt(&ok);
if ( ! ok ) {
mParent->topLevelWidget()->setCaption( i18n("Sorry, no valid port.Syncing cancelled.") );
return;
}
KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, port, mActiveSyncIP, this );
connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int )), this, SLOT(deleteCommandSocket(KCommandSocket*, int)) );
mParent->topLevelWidget()->setCaption( i18n("Sending request for remote file ...") );
commandSocket->readFile( syncFileName() );
}
void KSyncManager::deleteCommandSocket(KCommandSocket*s, int state)
{
qDebug("MainWindow::deleteCommandSocket %d", state);
//enum { success, errorW, errorR, quiet };
if ( state == KCommandSocket::errorR ||state == KCommandSocket::errorTO ) {
mParent->topLevelWidget()->setCaption( i18n("ERROR: Receiving remote file failed.") );
delete s;
if ( state == KCommandSocket::errorR ) {
KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this );
connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) );
commandSocket->sendStop();
}
return;
} else if ( state == KCommandSocket::errorW ) {
mParent->topLevelWidget()->setCaption( i18n("ERROR:Writing back file failed.") );
} else if ( state == KCommandSocket::successR ) {
QTimer::singleShot( 1, this , SLOT ( readFileFromSocket()));
} else if ( state == KCommandSocket::successW ) {
mParent->topLevelWidget()->setCaption( i18n("Pi-Sync succesful!") );
}
delete s;
}
void KSyncManager::readFileFromSocket()
{
QString fileName = syncFileName();
mParent->topLevelWidget()->setCaption( i18n("Remote file saved to temp file.") );
if ( ! syncWithFile( fileName , true ) ) {
mParent->topLevelWidget()->setCaption( i18n("Syncing failed.") );
qDebug("Syncing failed ");
return;
}
KCommandSocket* commandSocket = new KCommandSocket( mPassWordPiSync, mActiveSyncPort.toUInt(), mActiveSyncIP, this );
connect( commandSocket, SIGNAL(commandFinished( KCommandSocket*, int)), this, SLOT(deleteCommandSocket(KCommandSocket*, int )) );
if ( mWriteBackFile )
commandSocket->writeFile( fileName );
else {
commandSocket->sendStop();
mParent->topLevelWidget()->setCaption( i18n("Pi-Sync succesful!") );
}
}
KServerSocket:: KServerSocket ( QString pw, Q_UINT16 port, int backlog, QObject * parent, const char * name ) : QServerSocket( port, backlog, parent, name )
{
mPassWord = pw;
mSocket = 0;
mSyncActionDialog = 0;
blockRC = false;
};
void KServerSocket::newConnection ( int socket )
{
// qDebug("KServerSocket:New connection %d ", socket);
if ( mSocket ) {
qDebug("KServerSocket::newConnection Socket deleted! ");
delete mSocket;
mSocket = 0;
}
mSocket = new QSocket( this );
connect( mSocket , SIGNAL(readyRead()), this, SLOT(readClient()) );
connect( mSocket , SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
mSocket->setSocket( socket );
}
void KServerSocket::discardClient()
{
//qDebug(" KServerSocket::discardClient()");
if ( mSocket ) {
delete mSocket;
mSocket = 0;
}
//emit endConnect();
}
void KServerSocket::readClient()
{
if ( blockRC )
return;
if ( mSocket == 0 ) {
qDebug("ERROR::KServerSocket::readClient(): mSocket == 0 ");
return;
}
qDebug("KServerSocket readClient()");
if ( mSocket->canReadLine() ) {
QString line = mSocket->readLine();
qDebug("KServerSocket readline: %s ", line.latin1());
QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), line );
if ( tokens[0] == "GET" ) {
if ( tokens[1] == mPassWord )
//emit sendFile( mSocket );
send_file();
else {
- KMessageBox::information( 0, i18n("ERROR:\nGot send file request\nwith invalid password"));
+ KMessageBox::error( 0, i18n("Got send file request\nwith invalid password"));
qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() );
}
}
if ( tokens[0] == "PUT" ) {
if ( tokens[1] == mPassWord ) {
//emit getFile( mSocket );
blockRC = true;
get_file();
}
else {
- KMessageBox::information( 0, i18n("ERROR:\nGot receive file request\nwith invalid password"));
+ KMessageBox::error( 0, i18n("Got receive file request\nwith invalid password"));
qDebug("password %s, invalid password %s ",mPassWord.latin1(), tokens[1].latin1() );
}
}
if ( tokens[0] == "STOP" ) {
//emit endConnect();
end_connect();
}
}
}
void KServerSocket::end_connect()
{
delete mSyncActionDialog;
mSyncActionDialog = 0;
}
void KServerSocket::send_file()
{
//qDebug("MainWindow::sendFile(QSocket* s) ");
if ( mSyncActionDialog )
delete mSyncActionDialog;
mSyncActionDialog = new QDialog ( 0, "input-dialog", true );
mSyncActionDialog->setCaption(i18n("Received sync request"));
QLabel* label = new QLabel( i18n("Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog."), mSyncActionDialog );
QVBoxLayout* lay = new QVBoxLayout( mSyncActionDialog );
lay->addWidget( label);
lay->setMargin(7);
lay->setSpacing(7);
mSyncActionDialog->setFixedSize( 230, 120);
mSyncActionDialog->show();
mSyncActionDialog->raise();
qDebug("KSS::saving ... ");
emit request_file();
qApp->processEvents();
QString fileName = mFileName;
QFile file( fileName );
if (!file.open( IO_ReadOnly ) ) {
delete mSyncActionDialog;
mSyncActionDialog = 0;
qDebug("KSS::error open file ");
mSocket->close();
if ( mSocket->state() == QSocket::Idle )
QTimer::singleShot( 10, this , SLOT ( discardClient()));
return ;
}
mSyncActionDialog->setCaption( i18n("Sending file...") );
QTextStream ts( &file );
ts.setEncoding( QTextStream::Latin1 );
QTextStream os( mSocket );
os.setEncoding( QTextStream::Latin1 );
while ( ! ts.atEnd() ) {
os << ts.readLine() << "\n";
}
//os << ts.read();
file.close();
mSyncActionDialog->setCaption( i18n("Waiting for synced file...") );
mSocket->close();
if ( mSocket->state() == QSocket::Idle )
QTimer::singleShot( 10, this , SLOT ( discardClient()));
}
void KServerSocket::get_file()
{
mSyncActionDialog->setCaption( i18n("Receiving synced file...") );
piTime.start();
piFileString = "";
QTimer::singleShot( 1, this , SLOT (readBackFileFromSocket( ) ));
}
void KServerSocket::readBackFileFromSocket()
{
//qDebug("readBackFileFromSocket() %d ", piTime.elapsed ());
while ( mSocket->canReadLine () ) {
piTime.restart();
QString line = mSocket->readLine ();
piFileString += line;
//qDebug("readline: %s ", line.latin1());
mSyncActionDialog->setCaption( i18n("Received %1 bytes").arg( piFileString.length() ) );
}
if ( piTime.elapsed () < 3000 ) {
// wait for more
//qDebug("waitformore ");
QTimer::singleShot( 100, this , SLOT (readBackFileFromSocket( ) ));
return;
}
QString fileName = mFileName;
QFile file ( fileName );
if (!file.open( IO_WriteOnly ) ) {
delete mSyncActionDialog;
mSyncActionDialog = 0;
qDebug("error open cal file ");
piFileString = "";
emit file_received( false );
blockRC = false;
@@ -1062,115 +1093,118 @@ void KCommandSocket::writeFile( QString fileName )
connect( mSocket, SIGNAL(connected ()), this, SLOT(writeFileToSocket()) );
}
mFileName = fileName ;
mSocket->connectToHost( mHost, mPort );
}
void KCommandSocket::writeFileToSocket()
{
QFile file2( mFileName );
if (!file2.open( IO_ReadOnly ) ) {
mRetVal= errorW;
mSocket->close();
if ( mSocket->state() == QSocket::Idle )
QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
return ;
}
QTextStream ts2( &file2 );
ts2.setEncoding( QTextStream::Latin1 );
QTextStream os2( mSocket );
os2.setEncoding( QTextStream::Latin1 );
os2 << "PUT " << mPassWord << "\r\n";;
while ( ! ts2.atEnd() ) {
os2 << ts2.readLine() << "\n";
}
mRetVal= successW;
file2.close();
mSocket->close();
if ( mSocket->state() == QSocket::Idle )
QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
}
void KCommandSocket::sendStop()
{
if ( !mSocket ) {
mSocket = new QSocket( this );
connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
}
mSocket->connectToHost( mHost, mPort );
QTextStream os2( mSocket );
os2.setEncoding( QTextStream::Latin1 );
os2 << "STOP\r\n";
mSocket->close();
if ( mSocket->state() == QSocket::Idle )
QTimer::singleShot( 10, this , SLOT ( deleteSocket()));
}
void KCommandSocket::startReadFileFromSocket()
{
if ( ! mFirst )
return;
mFirst = false;
mTimerSocket->stop();
mFileString = "";
mTime.start();
QTimer::singleShot( 1, this , SLOT (readFileFromSocket( ) ));
}
void KCommandSocket::readFileFromSocket()
{
//qDebug("readBackFileFromSocket() %d ", mTime.elapsed ());
while ( mSocket->canReadLine () ) {
mTime.restart();
QString line = mSocket->readLine ();
mFileString += line;
//qDebug("readline: %s ", line.latin1());
}
if ( mTime.elapsed () < 3000 ) {
// wait for more
//qDebug("waitformore ");
QTimer::singleShot( 100, this , SLOT (readFileFromSocket( ) ));
return;
}
QString fileName = mFileName;
QFile file ( fileName );
if (!file.open( IO_WriteOnly ) ) {
mFileString = "";
mRetVal = errorR;
qDebug("Error open temp calender file for writing: %s",fileName.latin1() );
deleteSocket();
return ;
}
// mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1));
QTextStream ts ( &file );
ts.setEncoding( QTextStream::Latin1 );
ts << mFileString;
file.close();
mFileString = "";
mRetVal = successR;
mSocket->close();
// if state is not idle, deleteSocket(); is called via
// connect( mSocket, SIGNAL(delayedCloseFinished ()), this, SLOT(deleteSocket()) );
if ( mSocket->state() == QSocket::Idle )
deleteSocket();
}
void KCommandSocket::deleteSocket()
{
+ //qDebug("KCommandSocket::deleteSocket() ");
if ( mTimerSocket->isActive () ) {
mTimerSocket->stop();
mRetVal = errorTO;
+ qDebug("Connection to remote host timed out");
if ( mSocket ) {
mSocket->close();
- if ( mSocket->state() == QSocket::Idle )
- deleteSocket();
- return;
+ //if ( mSocket->state() == QSocket::Idle )
+ // deleteSocket();
+ delete mSocket;
+ mSocket = 0;
}
+ KMessageBox::error( 0, i18n("Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host? "));
+ emit commandFinished( this, mRetVal );
+ return;
}
//qDebug("KCommandSocket::deleteSocket() %d", mRetVal );
if ( mSocket)
delete mSocket;
mSocket = 0;
- if ( mRetVal == errorTO)
- KMessageBox::information( 0, i18n("ERROR:\nConnection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host? "));
-
emit commandFinished( this, mRetVal );
}
diff --git a/libkdepim/ksyncmanager.h b/libkdepim/ksyncmanager.h
index 1f7c7e7..5b05383 100644
--- a/libkdepim/ksyncmanager.h
+++ b/libkdepim/ksyncmanager.h
@@ -80,128 +80,129 @@ class KCommandSocket : public QObject
void writeFile( QString );
void sendStop();
signals:
void commandFinished( KCommandSocket*, int );
private slots:
void startReadFileFromSocket();
void readFileFromSocket();
void deleteSocket();
void writeFileToSocket();
private :
QSocket* mSocket;
QString mPassWord;
Q_UINT16 mPort;
QString mHost;
QString mFileName;
QTimer* mTimerSocket;
int mRetVal;
QTime mTime;
QString mFileString;
bool mFirst;
};
class KSyncManager : public QObject
{
Q_OBJECT
public:
enum TargetApp {
KOPI = 0,
KAPI = 1,
PWMPI = 2 };
KSyncManager(QWidget* parent, KSyncInterface* implementation, TargetApp ta, KPimPrefs* prefs, QPopupMenu* syncmenu);
~KSyncManager() ;
void multiSync( bool askforPrefs );
bool blockSave() { return mBlockSaveFlag; }
void setBlockSave(bool sa) { mBlockSaveFlag = sa; }
void setDefaultFileName( QString s) { mDefFileName = s ;}
QString defaultFileName() { return mDefFileName ;}
QString syncFileName();
QString getCurrentSyncDevice() { return mCurrentSyncDevice; }
QString getCurrentSyncName() { return mCurrentSyncName; }
void showProgressBar(int percentage, QString caption = QString::null, int total=100);
void hideProgressBar();
bool isProgressBarCanceled();
// sync stuff
QString mLocalMachineName;
QStringList mExternSyncProfiles;
QStringList mSyncProfileNames;
bool mAskForPreferences;
bool mShowSyncSummary;
bool mWriteBackExistingOnly;
int mSyncAlgoPrefs;
bool mWriteBackFile;
int mWriteBackInFuture;
QString mPhoneDevice;
QString mPhoneConnection;
QString mPhoneModel;
QString mPassWordPiSync;
QString mActiveSyncPort;
QString mActiveSyncIP ;
signals:
void save();
void request_file();
void getFile( bool );
public slots:
void slotSyncMenu( int );
void deleteCommandSocket(KCommandSocket*s, int state);
void readFileFromSocket();
void fillSyncMenu();
private:
void syncPi();
KServerSocket * mServerSocket;
void enableQuick();
KPimPrefs* mPrefs;
QString mDefFileName;
QString mCurrentSyncDevice;
QString mCurrentSyncName;
void quickSyncLocalFile();
bool syncWithFile( QString fn , bool quick );
void syncLocalFile();
void syncPhone();
void syncSharp();
bool syncExternalApplication(QString);
int mCurrentSyncProfile ;
void syncRemote( KSyncProfile* prof, bool ask = true);
void edit_sync_options();
+ void edit_pisync_options();
int ringSync();
QString getPassword( );
private slots:
void confSync();
private:
bool mBlockSaveFlag;
QWidget* mParent;
KSyncInterface* mImplementation;
TargetApp mTargetApp;
QPopupMenu* mSyncMenu;
QProgressBar* bar;
};
class KSyncInterface
{
public :
virtual bool sync(KSyncManager* manager, QString filename, int mode) = 0;
virtual bool syncExternal(KSyncManager* manager, QString resource)
{
// empty implementation, because some syncable applications do not
// have an external(sharpdtm) syncmode, like pwmanager.
return false;
}
};
#endif