summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-09-22 22:16:15 (UTC)
committer zautrix <zautrix>2004-09-22 22:16:15 (UTC)
commite29076add5876c7dd46ff35ab0cbc2ad2c496713 (patch) (side-by-side diff)
tree8e5a8c525863f2cd6ac089fd20dee32c80ab1e94
parentd28c61ac4955016463eb2cd47f35d3742f79ffbe (diff)
downloadkdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.zip
kdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.tar.gz
kdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.tar.bz2
better syncing
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--korganizer/koprefs.cpp3
-rw-r--r--korganizer/koprefs.h4
-rw-r--r--korganizer/mainwindow.cpp317
-rw-r--r--korganizer/mainwindow.h65
4 files changed, 385 insertions, 4 deletions
diff --git a/korganizer/koprefs.cpp b/korganizer/koprefs.cpp
index 5d7db4f..0034715 100644
--- a/korganizer/koprefs.cpp
+++ b/korganizer/koprefs.cpp
@@ -187,12 +187,15 @@ KOPrefs::KOPrefs() :
KPrefs::setCurrentGroup("RemoteSyncing");
// addItemBool("UsePasswd",&mUsePassWd,false);
// addItemBool("WriteBackFile",&mWriteBackFile,true);
// addItemBool("WriteBackExistingOnly",&mWriteBackExistingOnly,false);
// addItemBool("AskForPreferences",&mAskForPreferences,true);
// addItemBool("ShowSyncSummary",&mShowSyncSummary,true);
+ addItemString("PassiveSyncPort",&mPassiveSyncPort,"9197" );
+ addItemString("ActiveSyncPort",&mActiveSyncPort,"9197" );
+ addItemString("ActiveSyncIP",&mActiveSyncIP,"192.168.0.40" );
addItemBool("ShowSyncEvents",&mShowSyncEvents,false);
addItemInt("LastSyncTime",&mLastSyncTime,0);
addItemInt("SyncAlgoPrefs",&mSyncAlgoPrefs,3);
addItemInt("RingSyncAlgoPrefs",&mRingSyncAlgoPrefs,3);
#ifdef _WIN32_
diff --git a/korganizer/koprefs.h b/korganizer/koprefs.h
index 33eda60..696433e 100644
--- a/korganizer/koprefs.h
+++ b/korganizer/koprefs.h
@@ -276,12 +276,16 @@ class KOPrefs : public KPimPrefs
bool mUseInternalAlarmNotification;
int mAlarmPlayBeeps;
int mAlarmSuspendTime;
int mAlarmSuspendCount;
int mAlarmBeepInterval;
+ QString mPassiveSyncPort;
+ QString mActiveSyncPort;
+ QString mActiveSyncIP;
+
//US I copied the following settings into KPimGlobalPrefs
// that allows us later to easily remove the settings from here.
int mPreferredDate;
QString mUserDateFormatLong;
QString mUserDateFormatShort;
diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp
index 6315c64..f2e1bf8 100644
--- a/korganizer/mainwindow.cpp
+++ b/korganizer/mainwindow.cpp
@@ -3,12 +3,13 @@
#include <qaction.h>
#include <qpopupmenu.h>
#include <qpainter.h>
#include <qwhatsthis.h>
#include <qmessagebox.h>
#include <qlineedit.h>
+#include <qtextcodec.h>
#include <qfile.h>
#include <qdir.h>
#include <qapp.h>
#include <qfileinfo.h>
#include <qlabel.h>
#include <qmap.h>
@@ -68,13 +69,15 @@ MainWindow::MainWindow( QWidget *parent, const char *name, QString msg) :
QMainWindow( parent, name )
{
#ifdef DESKTOP_VERSION
setFont( QFont("Arial"), 14 );
#endif
-
+ mCommandSocket = 0;
+ mSyncActionDialog = 0;
+ mServerSocket = 0;
mClosed = false;
//QString confFile = KStandardDirs::appDir() + "config/korganizerrc";
QString confFile = locateLocal("config","korganizerrc");
QFileInfo finf ( confFile );
bool showWarning = !finf.exists();
setIcon(SmallIcon( "ko24" ) );
@@ -210,13 +213,13 @@ MainWindow::MainWindow( QWidget *parent, const char *name, QString msg) :
#endif
}
MainWindow::~MainWindow()
{
//qDebug("MainWindow::~MainWindow() ");
//save toolbar location
-
+ delete mServerSocket;
delete mCalendar;
delete KOPrefs::instance();
delete KIncidenceFormatter::instance();
}
@@ -859,12 +862,21 @@ void MainWindow::initActions()
void MainWindow::fillSyncMenu()
{
if ( syncMenu->count() )
syncMenu->clear();
syncMenu->insertItem( i18n("Configure..."), 0 );
syncMenu->insertSeparator();
+ if ( mServerSocket == 0 ) {
+ syncMenu->insertItem( i18n("Enable Easy-Pi-Sync"), 2 );
+ } else {
+ syncMenu->insertItem( i18n("Disable Easy-Pi-Sync"), 3 );
+ }
+ syncMenu->insertSeparator();
+ syncMenu->insertItem( i18n("New Easy-Pi-Sync!"), 4 );
+ syncMenu->insertItem( i18n("Quick Easy-Pi-Sync!"), 5 );
+ syncMenu->insertSeparator();
syncMenu->insertItem( i18n("Multiple sync"), 1 );
syncMenu->insertSeparator();
KConfig config ( locateLocal( "config","ksyncprofilesrc" ) );
config.setGroup("General");
QStringList prof = config.readListEntry("SyncProfileNames");
KOPrefs::instance()->mLocalMachineName = config.readEntry("LocalMachineName","undefined");
@@ -993,13 +1005,13 @@ void MainWindow::multiSync( bool askforPrefs )
else
setCaption(i18n("Nothing synced! No profiles defined for multisync!"));
return;
}
void MainWindow::slotSyncMenu( int action )
{
- //qDebug("syncaction %d ", action);
+ qDebug("syncaction %d ", action);
if ( action == 0 ) {
// seems to be a Qt2 event handling bug
// syncmenu.clear causes a segfault at first time
// when we call it after the main event loop, it is ok
// same behaviour when calling OM/Pi via QCOP for the first time
@@ -1009,12 +1021,31 @@ void MainWindow::slotSyncMenu( int action )
return;
}
if ( action == 1 ) {
multiSync( true );
return;
}
+ if ( action == 2 ) {
+ enableQuick();
+ QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
+ return;
+ }
+ if ( action == 3 ) {
+ delete mServerSocket;
+ mServerSocket = 0;
+ QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
+ return;
+ }
+ if ( action == 4 ) {
+ performQuick();
+ return;
+ }
+ if ( action == 5 ) {
+ performQuickQuick();
+ return;
+ }
if (mBlockSaveFlag)
return;
mBlockSaveFlag = true;
mCurrentSyncProfile = action - 1000 ;
mView->setSyncDevice(KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile] );
@@ -1857,12 +1888,292 @@ QString MainWindow::getPassword( )
dia.hide();
qApp->processEvents();
return retfile;
}
+void MainWindow::enableQuick()
+{
+ QString retfile = "";
+ QDialog dia ( this, "input-dialog", true );
+ QLineEdit lab ( &dia );
+ QVBoxLayout lay( &dia );
+ lab.setText( KOPrefs::instance()->mPassiveSyncPort );
+ lay.setMargin(7);
+ lay.setSpacing(7);
+ QLabel label ( i18n("Port number (Default: 9197)"), &dia );
+ lay.addWidget( &label);
+ lay.addWidget( &lab);
+ dia.setFixedSize( 230,80 );
+ dia.setCaption( i18n("Enter port for Easy-Pi-Sync") );
+ 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();
+ else
+ return;
+ dia.hide();
+ qApp->processEvents();
+ KOPrefs::instance()->mPassiveSyncPort = retfile;
+ bool ok;
+ Q_UINT16 port = retfile.toUInt(&ok);
+ if ( ! ok ) {
+ qDebug("no valid port ");
+ return;
+ }
+ qDebug("port %d ", port);
+ mServerSocket = new KServerSocket ( port ,1 );
+ qDebug("connected ");
+ if ( !mServerSocket->ok() ) {
+ qWarning("Failed to bind to port %d", port);
+ delete mServerSocket;
+ mServerSocket = 0;
+ return;
+ }
+ connect( mServerSocket, SIGNAL ( sendFile(QSocket*) ), this, SLOT ( sendFile(QSocket*) ) );
+ connect( mServerSocket, SIGNAL ( getFile(QSocket*) ), this, SLOT ( getFile(QSocket*) ) );
+}
+void MainWindow::sendFile(QSocket* socket)
+{
+ setCaption( i18n("Received request for file") );
+ qDebug("MainWindow::sendFile(QSocket* s) ");
+ mSyncActionDialog = new QDialog ( this, "input-dialog", true );
+ mSyncActionDialog->setCaption(i18n("KO/Pi - WARNING"));
+ QLabel* label = new QLabel( i18n("Synchronizing...\nDo not use\nthis application!\n"), mSyncActionDialog );
+ QVBoxLayout* lay = new QVBoxLayout( mSyncActionDialog );
+ lay->addWidget( label);
+ lay->setMargin(7);
+ lay->setSpacing(7);
+ mSyncActionDialog->setFixedSize( 200,100 );
+ mSyncActionDialog->show();
+ qApp->processEvents();
+ qDebug("saving ... ");
+ save();
+ QString fileName = defaultFileName();
+ QFile file( fileName );
+ if (!file.open( IO_ReadOnly ) ) {
+ setCaption( i18n("Error open file") );
+ delete mSyncActionDialog;
+ mSyncActionDialog = 0;
+ qDebug("error open cal file ");
+ return ;
+
+ }
+ setCaption( i18n("Sending file...") );
+ QTextStream ts( &file );
+ ts.setCodec( QTextCodec::codecForName("utf8") );
+ QTextStream os( socket );
+ os.setCodec( QTextCodec::codecForName("utf8") );
+ //os.setEncoding( QTextStream::UnicodeUTF8 );
+ while ( ! ts.atEnd() ) {
+ os << ts.readLine() << "\n";
+ }
+ //os << ts.read();
+ socket->close();
+ file.close();
+ setCaption( i18n("File sent. Waiting to get back synced file") );
+ qDebug("file sent ");
+}
+void MainWindow::getFile(QSocket* socket)
+{
+ setCaption( i18n("Receiving synced file...") );
+ qDebug("MainWindow::sendFile(QSocket* s) ");
+
+ QString fileName = defaultFileName();
+ QFile file( fileName );
+ if (!file.open( IO_WriteOnly ) ) {
+ setCaption( i18n("Error open file") );
+ delete mSyncActionDialog;
+ mSyncActionDialog = 0;
+ qDebug("error open cal file ");
+ return ;
+
+ }
+
+ mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1));
+ QTextStream ts( &file );
+ ts.setCodec( QTextCodec::codecForName("utf8") );
+ bool first = true;
+ while ( socket->canReadLine () || first ) {
+ first = false;
+ while ( socket->canReadLine () ) {
+ ts << socket->readLine ();
+ }
+ socket->waitForMore ( 5000 );
+ }
+ setCaption( i18n("File received - reloading calendar...") );
+ file.close();
+ socket->close();
+ mView->watchSavedFile();
+ mView->openCalendar( defaultFileName() );
+ setCaption( i18n("Easy-Pi-Sync successful!") );
+ delete mSyncActionDialog;
+ mSyncActionDialog = 0;
+
+
+}
+void MainWindow::endConnect()
+{
+ setCaption( i18n("No file received - syncing successful") );
+ delete mSyncActionDialog;
+ mSyncActionDialog = 0;
+}
+void MainWindow::performQuick()
+{
+ setCaption( i18n("Please input connection settings") );
+ QString retfile = "";
+ QDialog dia ( this, "input-dialog", true );
+ QLineEdit lab ( &dia );
+ QVBoxLayout lay( &dia );
+ QLabel label ( i18n("IP address\n(Example: 192.168.0.40)"), &dia );
+ lay.addWidget( &label);
+ lab.setText( KOPrefs::instance()->mActiveSyncIP );
+ lay.setMargin(7);
+ lay.setSpacing(7);
+ lay.addWidget( &lab);
+ QLabel label2 ( i18n("Port number (Default: 9197)"), &dia );
+ lay.addWidget( &label2);
+ QLineEdit lab2 ( &dia );
+ lab2.setText( KOPrefs::instance()->mActiveSyncPort );
+ lay.addWidget( &lab2);
+ dia.setFixedSize( 230,200 );
+ dia.setCaption( i18n("Enter port for Easy-Pi-Sync ") );
+ QPushButton pb ( "OK", &dia);
+ lay.addWidget( &pb );
+ connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
+ dia.show();
+ int res = dia.exec();
+ if ( !res ) {
+ setCaption( i18n("Syncing cancelled!") );
+ return;
+ }
+ dia.hide();
+ KOPrefs::instance()->mActiveSyncPort = lab2.text();
+ KOPrefs::instance()->mActiveSyncIP = lab.text();
+ qApp->processEvents();
+ performQuickQuick();
+}
+
+void MainWindow::performQuickQuick()
+{
+ // setCaption( i18n("") );
+
+ bool ok;
+ Q_UINT16 port = KOPrefs::instance()->mActiveSyncPort.toUInt(&ok);
+ if ( ! ok ) {
+ setCaption( i18n("Sorry, no valid port.Syncing cancelled.") );
+ return;
+ }
+ if ( mCommandSocket )
+ delete mCommandSocket;
+ mCommandSocket = new QSocket( this );
+ connect( mCommandSocket, SIGNAL(readyRead()), this, SLOT(readFileFromSocket()) );
+ QString host = KOPrefs::instance()->mActiveSyncIP;
+ mCommandSocket->connectToHost( host, port );
+ QTextStream os( mCommandSocket );
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << "GET\r\n";
+ setCaption( i18n("Sending request for remote file ...") );
+
+}
+void MainWindow::readFileFromSocket()
+{
+ setCaption( i18n("Receiving remote file ...") );
+ qDebug("MainWindow::readFileFromSocket() ");
+QString fileName;
+#ifdef _WIN32_
+ fileName = defaultFileName() +"sync";
+#else
+ fileName = "/tmp/kopitempfile.ics";
+#endif
+ QFile file( fileName );
+ if (!file.open( IO_WriteOnly ) ) {
+ setCaption( i18n("Error: Cannot open temp file for write.") );
+ qDebug("Error open calender file for writing: %s",fileName.latin1() );
+ return ;
+ }
+
+ //QTextStream os2( mCommandSocket );
+ //os2.setEncoding( QTextStream::UnicodeUTF8 );
+
+ QTextStream ts( &file );
+ ts.setCodec( QTextCodec::codecForName("utf8") );
+ bool first = true;
+ while ( mCommandSocket->canReadLine () || first) {
+ first = false;
+ while ( mCommandSocket->canReadLine () ) {
+ ts << mCommandSocket->readLine ();
+ }
+ mCommandSocket->waitForMore ( 5000 );
+ }
+ file.close();
+ mCommandSocket->close();
+ delete mCommandSocket;
+ setCaption( i18n("Remote file saved to temp file.") );
+ mCommandSocket = 0;
+ mCurrentSyncProfile = 2 ; // last file
+ mView->setSyncDevice(KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile] );
+ mView->setSyncName( KOPrefs::instance()->mLocalMachineName );
+ KConfig config ( locateLocal( "config","ksyncprofilesrc" ) );
+ KSyncProfile* temp = new KSyncProfile ();
+ temp->setName(KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]);
+ temp->readConfig(&config);
+ KOPrefs::instance()->mAskForPreferences = temp->getAskForPreferences();
+ KOPrefs::instance()->mSyncAlgoPrefs = temp->getSyncPrefs();
+ KOPrefs::instance()->mWriteBackFile = temp->getWriteBackFile();
+ KOPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting();
+ KOPrefs::instance()->mWriteBackInFuture = 0;
+ if ( temp->getWriteBackFuture() )
+ KOPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( );
+ KOPrefs::instance()->mShowSyncSummary = temp->getShowSummaryAfterSync();
+
+ setCaption( i18n("Remote file saved to temp file.") );
+ if ( ! syncWithFile( fileName , true ) ) {
+ setCaption( i18n("Syncing failed.") );
+ qDebug("Syncing failed ");
+ return;
+ }
+
+ mCommandSocket = new QSocket( this );
+ QString host = KOPrefs::instance()->mActiveSyncIP;
+ mCommandSocket->connectToHost( KOPrefs::instance()->mActiveSyncIP, KOPrefs::instance()->mActiveSyncPort.toUInt() );
+
+ QFile file2( fileName );
+ if (!file2.open( IO_ReadOnly ) ) {
+ setCaption( i18n("Error: Cannot open temp file for read.") );
+ qDebug("error open cal file ");
+ return ;
+
+ }
+ setCaption( i18n("Sending back synced file...") );
+ QTextStream ts2( &file2 );
+ ts2.setCodec( QTextCodec::codecForName("utf8") );
+ QTextStream os2( mCommandSocket );
+ os2.setCodec( QTextCodec::codecForName("utf8") );
+ //os.setEncoding( QTextStream::UnicodeUTF8 );
+ if ( KOPrefs::instance()->mWriteBackFile ) {
+ os2 << "PUT\r\n";
+ while ( ! ts2.atEnd() ) {
+ os2 << ts2.readLine() << "\n";
+ }
+ } else {
+ os2 << "STOP\r\n";
+ }
+ mCommandSocket->close();
+ file.close();
+ delete mCommandSocket;
+ mCommandSocket = 0;
+ qDebug("Syncing succesful! ");
+ setCaption( i18n("Easy-Pi-Sync succesful!") );
+
+
+}
+
void MainWindow::syncLocalFile()
{
QString fn =KOPrefs::instance()->mLastSyncedLocalFile;
fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename(*.ics/*.vcs)"), this );
diff --git a/korganizer/mainwindow.h b/korganizer/mainwindow.h
index 47a7a90..58081f6 100644
--- a/korganizer/mainwindow.h
+++ b/korganizer/mainwindow.h
@@ -1,12 +1,13 @@
#ifndef KORGE_MAINWINDOW_H
#define KORGE_MAINWINDOW_H
#include <qmainwindow.h>
#include <qtimer.h>
#include <qdict.h>
+#include <qregexp.h>
#include <libkcal/incidence.h>
#include "simplealarmclient.h"
class QAction;
class CalendarView;
@@ -14,12 +15,62 @@ class KSyncProfile;
#ifdef DESKTOP_VERSION
#define QPEToolBar QToolBar
#define QPEMenuBar QMenuBar
#endif
class QPEToolBar;
+#include <qserversocket.h>
+#include <qsocket.h>
+#include <qnetworkprotocol.h>
+
+class KServerSocket : public QServerSocket
+{
+ Q_OBJECT
+
+public:
+ KServerSocket ( Q_UINT16 port, int backlog = 0, QObject * parent=0, const char * name=0 ) :
+ QServerSocket( port, backlog, parent, name ){;};
+ void newConnection ( int socket )
+ {
+ qDebug("KServerSocket:New connection %d ", socket);
+ QSocket* s = new QSocket( this );
+ connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
+ connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
+ s->setSocket( socket );
+ }
+
+signals:
+ void sendFile(QSocket*);
+ void getFile(QSocket*);
+ void endConnect();
+private slots:
+ void discardClient()
+ {
+ QSocket* socket = (QSocket*)sender();
+ delete socket;
+ emit endConnect();
+ }
+ void readClient()
+ {
+ qDebug("readClient() ");
+ QSocket* socket = (QSocket*)sender();
+ if ( socket->canReadLine() ) {
+ QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), socket->readLine() );
+ if ( tokens[0] == "GET" ) {
+ emit sendFile( socket );
+ }
+ if ( tokens[0] == "PUT" ) {
+ emit getFile( socket );
+ }
+ if ( tokens[0] == "STOP" ) {
+ emit endConnect();
+ }
+ }
+ }
+};
+
namespace KCal {
class CalendarLocal;
}
using namespace KCal;
@@ -85,18 +136,28 @@ class MainWindow : public QMainWindow
protected:
void displayText( QString, QString);
void displayFile( QString, QString);
void enableIncidenceActions( bool );
+ private slots:
+ void fillSyncMenu();
+ void sendFile(QSocket* s);
+ void getFile(QSocket* socket);
+ void readFileFromSocket();
+ void endConnect();
private:
+ QSocket* mCommandSocket;
+ KServerSocket * mServerSocket;
bool mClosed;
void saveOnClose();
int mCurrentSyncProfile;
+ void enableQuick();
+ void performQuick();
+ void performQuickQuick();
void syncRemote( KSyncProfile* , bool ask = true);
- void fillSyncMenu();
bool mFlagKeyPressed;
bool mBlockAtStartup;
QPEToolBar *iconToolBar;
void initActions();
void setDefaultPreferences();
void keyPressEvent ( QKeyEvent * ) ;
@@ -115,9 +176,11 @@ class MainWindow : public QMainWindow
void closeEvent( QCloseEvent* ce );
SimpleAlarmClient mAlarmClient;
QTimer mSaveTimer;
bool mBlockSaveFlag;
bool mCalendarModifiedFlag;
QPixmap loadPixmap( QString );
+ QDialog * mSyncActionDialog;
};
+
#endif