summaryrefslogtreecommitdiffabout
path: root/korganizer
authorzautrix <zautrix>2004-09-22 22:16:15 (UTC)
committer zautrix <zautrix>2004-09-22 22:16:15 (UTC)
commite29076add5876c7dd46ff35ab0cbc2ad2c496713 (patch) (unidiff)
tree8e5a8c525863f2cd6ac089fd20dee32c80ab1e94 /korganizer
parentd28c61ac4955016463eb2cd47f35d3742f79ffbe (diff)
downloadkdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.zip
kdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.tar.gz
kdepimpi-e29076add5876c7dd46ff35ab0cbc2ad2c496713.tar.bz2
better syncing
Diffstat (limited to 'korganizer') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koprefs.cpp5
-rw-r--r--korganizer/koprefs.h4
-rw-r--r--korganizer/mainwindow.cpp317
-rw-r--r--korganizer/mainwindow.h65
4 files changed, 386 insertions, 5 deletions
diff --git a/korganizer/koprefs.cpp b/korganizer/koprefs.cpp
index 5d7db4f..0034715 100644
--- a/korganizer/koprefs.cpp
+++ b/korganizer/koprefs.cpp
@@ -191,3 +191,6 @@ KOPrefs::KOPrefs() :
191// addItemBool("AskForPreferences",&mAskForPreferences,true); 191// addItemBool("AskForPreferences",&mAskForPreferences,true);
192// addItemBool("ShowSyncSummary",&mShowSyncSummary,true); 192// addItemBool("ShowSyncSummary",&mShowSyncSummary,true);
193 addItemString("PassiveSyncPort",&mPassiveSyncPort,"9197" );
194 addItemString("ActiveSyncPort",&mActiveSyncPort,"9197" );
195 addItemString("ActiveSyncIP",&mActiveSyncIP,"192.168.0.40" );
193 addItemBool("ShowSyncEvents",&mShowSyncEvents,false); 196 addItemBool("ShowSyncEvents",&mShowSyncEvents,false);
diff --git a/korganizer/koprefs.h b/korganizer/koprefs.h
index 33eda60..696433e 100644
--- a/korganizer/koprefs.h
+++ b/korganizer/koprefs.h
@@ -281,2 +281,6 @@ class KOPrefs : public KPimPrefs
281 281
282 QString mPassiveSyncPort;
283 QString mActiveSyncPort;
284 QString mActiveSyncIP;
285
282 286
diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp
index 6315c64..f2e1bf8 100644
--- a/korganizer/mainwindow.cpp
+++ b/korganizer/mainwindow.cpp
@@ -8,2 +8,3 @@
8#include <qlineedit.h> 8#include <qlineedit.h>
9#include <qtextcodec.h>
9#include <qfile.h> 10#include <qfile.h>
@@ -73,3 +74,5 @@ MainWindow::MainWindow( QWidget *parent, const char *name, QString msg) :
73#endif 74#endif
74 75 mCommandSocket = 0;
76 mSyncActionDialog = 0;
77 mServerSocket = 0;
75 mClosed = false; 78 mClosed = false;
@@ -215,3 +218,3 @@ MainWindow::~MainWindow()
215 //save toolbar location 218 //save toolbar location
216 219 delete mServerSocket;
217 delete mCalendar; 220 delete mCalendar;
@@ -864,2 +867,11 @@ void MainWindow::fillSyncMenu()
864 syncMenu->insertSeparator(); 867 syncMenu->insertSeparator();
868 if ( mServerSocket == 0 ) {
869 syncMenu->insertItem( i18n("Enable Easy-Pi-Sync"), 2 );
870 } else {
871 syncMenu->insertItem( i18n("Disable Easy-Pi-Sync"), 3 );
872 }
873 syncMenu->insertSeparator();
874 syncMenu->insertItem( i18n("New Easy-Pi-Sync!"), 4 );
875 syncMenu->insertItem( i18n("Quick Easy-Pi-Sync!"), 5 );
876 syncMenu->insertSeparator();
865 syncMenu->insertItem( i18n("Multiple sync"), 1 ); 877 syncMenu->insertItem( i18n("Multiple sync"), 1 );
@@ -998,3 +1010,3 @@ void MainWindow::slotSyncMenu( int action )
998{ 1010{
999 //qDebug("syncaction %d ", action); 1011 qDebug("syncaction %d ", action);
1000 if ( action == 0 ) { 1012 if ( action == 0 ) {
@@ -1014,2 +1026,21 @@ void MainWindow::slotSyncMenu( int action )
1014 } 1026 }
1027 if ( action == 2 ) {
1028 enableQuick();
1029 QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
1030 return;
1031 }
1032 if ( action == 3 ) {
1033 delete mServerSocket;
1034 mServerSocket = 0;
1035 QTimer::singleShot ( 1, this, SLOT ( fillSyncMenu() ) );
1036 return;
1037 }
1038 if ( action == 4 ) {
1039 performQuick();
1040 return;
1041 }
1042 if ( action == 5 ) {
1043 performQuickQuick();
1044 return;
1045 }
1015 1046
@@ -1862,2 +1893,282 @@ QString MainWindow::getPassword( )
1862 1893
1894void MainWindow::enableQuick()
1895{
1896 QString retfile = "";
1897 QDialog dia ( this, "input-dialog", true );
1898 QLineEdit lab ( &dia );
1899 QVBoxLayout lay( &dia );
1900 lab.setText( KOPrefs::instance()->mPassiveSyncPort );
1901 lay.setMargin(7);
1902 lay.setSpacing(7);
1903 QLabel label ( i18n("Port number (Default: 9197)"), &dia );
1904 lay.addWidget( &label);
1905 lay.addWidget( &lab);
1906 dia.setFixedSize( 230,80 );
1907 dia.setCaption( i18n("Enter port for Easy-Pi-Sync") );
1908 QPushButton pb ( "OK", &dia);
1909 lay.addWidget( &pb );
1910 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
1911 dia.show();
1912 int res = dia.exec();
1913 if ( res )
1914 retfile = lab.text();
1915 else
1916 return;
1917 dia.hide();
1918 qApp->processEvents();
1919 KOPrefs::instance()->mPassiveSyncPort = retfile;
1920 bool ok;
1921 Q_UINT16 port = retfile.toUInt(&ok);
1922 if ( ! ok ) {
1923 qDebug("no valid port ");
1924 return;
1925 }
1926 qDebug("port %d ", port);
1927 mServerSocket = new KServerSocket ( port ,1 );
1928 qDebug("connected ");
1929 if ( !mServerSocket->ok() ) {
1930 qWarning("Failed to bind to port %d", port);
1931 delete mServerSocket;
1932 mServerSocket = 0;
1933 return;
1934 }
1935 connect( mServerSocket, SIGNAL ( sendFile(QSocket*) ), this, SLOT ( sendFile(QSocket*) ) );
1936 connect( mServerSocket, SIGNAL ( getFile(QSocket*) ), this, SLOT ( getFile(QSocket*) ) );
1937}
1938void MainWindow::sendFile(QSocket* socket)
1939{
1940 setCaption( i18n("Received request for file") );
1941 qDebug("MainWindow::sendFile(QSocket* s) ");
1942 mSyncActionDialog = new QDialog ( this, "input-dialog", true );
1943 mSyncActionDialog->setCaption(i18n("KO/Pi - WARNING"));
1944 QLabel* label = new QLabel( i18n("Synchronizing...\nDo not use\nthis application!\n"), mSyncActionDialog );
1945 QVBoxLayout* lay = new QVBoxLayout( mSyncActionDialog );
1946 lay->addWidget( label);
1947 lay->setMargin(7);
1948 lay->setSpacing(7);
1949 mSyncActionDialog->setFixedSize( 200,100 );
1950 mSyncActionDialog->show();
1951 qApp->processEvents();
1952 qDebug("saving ... ");
1953 save();
1954 QString fileName = defaultFileName();
1955 QFile file( fileName );
1956 if (!file.open( IO_ReadOnly ) ) {
1957 setCaption( i18n("Error open file") );
1958 delete mSyncActionDialog;
1959 mSyncActionDialog = 0;
1960 qDebug("error open cal file ");
1961 return ;
1962
1963 }
1964 setCaption( i18n("Sending file...") );
1965 QTextStream ts( &file );
1966 ts.setCodec( QTextCodec::codecForName("utf8") );
1967 QTextStream os( socket );
1968 os.setCodec( QTextCodec::codecForName("utf8") );
1969 //os.setEncoding( QTextStream::UnicodeUTF8 );
1970 while ( ! ts.atEnd() ) {
1971 os << ts.readLine() << "\n";
1972 }
1973 //os << ts.read();
1974 socket->close();
1975 file.close();
1976 setCaption( i18n("File sent. Waiting to get back synced file") );
1977 qDebug("file sent ");
1978}
1979void MainWindow::getFile(QSocket* socket)
1980{
1981 setCaption( i18n("Receiving synced file...") );
1982 qDebug("MainWindow::sendFile(QSocket* s) ");
1983
1984 QString fileName = defaultFileName();
1985 QFile file( fileName );
1986 if (!file.open( IO_WriteOnly ) ) {
1987 setCaption( i18n("Error open file") );
1988 delete mSyncActionDialog;
1989 mSyncActionDialog = 0;
1990 qDebug("error open cal file ");
1991 return ;
1992
1993 }
1994
1995 mView->setLoadedFileVersion(QDateTime::currentDateTime().addSecs( -1));
1996 QTextStream ts( &file );
1997 ts.setCodec( QTextCodec::codecForName("utf8") );
1998 bool first = true;
1999 while ( socket->canReadLine () || first ) {
2000 first = false;
2001 while ( socket->canReadLine () ) {
2002 ts << socket->readLine ();
2003 }
2004 socket->waitForMore ( 5000 );
2005 }
2006 setCaption( i18n("File received - reloading calendar...") );
2007 file.close();
2008 socket->close();
2009 mView->watchSavedFile();
2010 mView->openCalendar( defaultFileName() );
2011 setCaption( i18n("Easy-Pi-Sync successful!") );
2012 delete mSyncActionDialog;
2013 mSyncActionDialog = 0;
2014
2015
2016}
2017void MainWindow::endConnect()
2018{
2019 setCaption( i18n("No file received - syncing successful") );
2020 delete mSyncActionDialog;
2021 mSyncActionDialog = 0;
2022}
2023void MainWindow::performQuick()
2024{
2025 setCaption( i18n("Please input connection settings") );
2026 QString retfile = "";
2027 QDialog dia ( this, "input-dialog", true );
2028 QLineEdit lab ( &dia );
2029 QVBoxLayout lay( &dia );
2030 QLabel label ( i18n("IP address\n(Example: 192.168.0.40)"), &dia );
2031 lay.addWidget( &label);
2032 lab.setText( KOPrefs::instance()->mActiveSyncIP );
2033 lay.setMargin(7);
2034 lay.setSpacing(7);
2035 lay.addWidget( &lab);
2036 QLabel label2 ( i18n("Port number (Default: 9197)"), &dia );
2037 lay.addWidget( &label2);
2038 QLineEdit lab2 ( &dia );
2039 lab2.setText( KOPrefs::instance()->mActiveSyncPort );
2040 lay.addWidget( &lab2);
2041 dia.setFixedSize( 230,200 );
2042 dia.setCaption( i18n("Enter port for Easy-Pi-Sync ") );
2043 QPushButton pb ( "OK", &dia);
2044 lay.addWidget( &pb );
2045 connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) );
2046 dia.show();
2047 int res = dia.exec();
2048 if ( !res ) {
2049 setCaption( i18n("Syncing cancelled!") );
2050 return;
2051 }
2052 dia.hide();
2053 KOPrefs::instance()->mActiveSyncPort = lab2.text();
2054 KOPrefs::instance()->mActiveSyncIP = lab.text();
2055 qApp->processEvents();
2056 performQuickQuick();
2057}
2058
2059void MainWindow::performQuickQuick()
2060{
2061 // setCaption( i18n("") );
2062
2063 bool ok;
2064 Q_UINT16 port = KOPrefs::instance()->mActiveSyncPort.toUInt(&ok);
2065 if ( ! ok ) {
2066 setCaption( i18n("Sorry, no valid port.Syncing cancelled.") );
2067 return;
2068 }
2069 if ( mCommandSocket )
2070 delete mCommandSocket;
2071 mCommandSocket = new QSocket( this );
2072 connect( mCommandSocket, SIGNAL(readyRead()), this, SLOT(readFileFromSocket()) );
2073 QString host = KOPrefs::instance()->mActiveSyncIP;
2074 mCommandSocket->connectToHost( host, port );
2075 QTextStream os( mCommandSocket );
2076 os.setEncoding( QTextStream::UnicodeUTF8 );
2077 os << "GET\r\n";
2078 setCaption( i18n("Sending request for remote file ...") );
2079
2080}
2081void MainWindow::readFileFromSocket()
2082{
2083 setCaption( i18n("Receiving remote file ...") );
2084 qDebug("MainWindow::readFileFromSocket() ");
2085QString fileName;
2086#ifdef _WIN32_
2087 fileName = defaultFileName() +"sync";
2088#else
2089 fileName = "/tmp/kopitempfile.ics";
2090#endif
2091 QFile file( fileName );
2092 if (!file.open( IO_WriteOnly ) ) {
2093 setCaption( i18n("Error: Cannot open temp file for write.") );
2094 qDebug("Error open calender file for writing: %s",fileName.latin1() );
2095 return ;
2096 }
2097
2098 //QTextStream os2( mCommandSocket );
2099 //os2.setEncoding( QTextStream::UnicodeUTF8 );
2100
2101 QTextStream ts( &file );
2102 ts.setCodec( QTextCodec::codecForName("utf8") );
2103 bool first = true;
2104 while ( mCommandSocket->canReadLine () || first) {
2105 first = false;
2106 while ( mCommandSocket->canReadLine () ) {
2107 ts << mCommandSocket->readLine ();
2108 }
2109 mCommandSocket->waitForMore ( 5000 );
2110 }
2111 file.close();
2112 mCommandSocket->close();
2113 delete mCommandSocket;
2114 setCaption( i18n("Remote file saved to temp file.") );
2115 mCommandSocket = 0;
2116 mCurrentSyncProfile = 2 ; // last file
2117 mView->setSyncDevice(KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile] );
2118 mView->setSyncName( KOPrefs::instance()->mLocalMachineName );
2119 KConfig config ( locateLocal( "config","ksyncprofilesrc" ) );
2120 KSyncProfile* temp = new KSyncProfile ();
2121 temp->setName(KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]);
2122 temp->readConfig(&config);
2123 KOPrefs::instance()->mAskForPreferences = temp->getAskForPreferences();
2124 KOPrefs::instance()->mSyncAlgoPrefs = temp->getSyncPrefs();
2125 KOPrefs::instance()->mWriteBackFile = temp->getWriteBackFile();
2126 KOPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting();
2127 KOPrefs::instance()->mWriteBackInFuture = 0;
2128 if ( temp->getWriteBackFuture() )
2129 KOPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( );
2130 KOPrefs::instance()->mShowSyncSummary = temp->getShowSummaryAfterSync();
2131
2132 setCaption( i18n("Remote file saved to temp file.") );
2133 if ( ! syncWithFile( fileName , true ) ) {
2134 setCaption( i18n("Syncing failed.") );
2135 qDebug("Syncing failed ");
2136 return;
2137 }
2138
2139 mCommandSocket = new QSocket( this );
2140 QString host = KOPrefs::instance()->mActiveSyncIP;
2141 mCommandSocket->connectToHost( KOPrefs::instance()->mActiveSyncIP, KOPrefs::instance()->mActiveSyncPort.toUInt() );
2142
2143 QFile file2( fileName );
2144 if (!file2.open( IO_ReadOnly ) ) {
2145 setCaption( i18n("Error: Cannot open temp file for read.") );
2146 qDebug("error open cal file ");
2147 return ;
2148
2149 }
2150 setCaption( i18n("Sending back synced file...") );
2151 QTextStream ts2( &file2 );
2152 ts2.setCodec( QTextCodec::codecForName("utf8") );
2153 QTextStream os2( mCommandSocket );
2154 os2.setCodec( QTextCodec::codecForName("utf8") );
2155 //os.setEncoding( QTextStream::UnicodeUTF8 );
2156 if ( KOPrefs::instance()->mWriteBackFile ) {
2157 os2 << "PUT\r\n";
2158 while ( ! ts2.atEnd() ) {
2159 os2 << ts2.readLine() << "\n";
2160 }
2161 } else {
2162 os2 << "STOP\r\n";
2163 }
2164 mCommandSocket->close();
2165 file.close();
2166 delete mCommandSocket;
2167 mCommandSocket = 0;
2168 qDebug("Syncing succesful! ");
2169 setCaption( i18n("Easy-Pi-Sync succesful!") );
2170
2171
2172}
2173
1863void MainWindow::syncLocalFile() 2174void MainWindow::syncLocalFile()
diff --git a/korganizer/mainwindow.h b/korganizer/mainwindow.h
index 47a7a90..58081f6 100644
--- a/korganizer/mainwindow.h
+++ b/korganizer/mainwindow.h
@@ -6,2 +6,3 @@
6#include <qdict.h> 6#include <qdict.h>
7#include <qregexp.h>
7 8
@@ -19,2 +20,52 @@ class KSyncProfile;
19class QPEToolBar; 20class QPEToolBar;
21#include <qserversocket.h>
22#include <qsocket.h>
23#include <qnetworkprotocol.h>
24
25class KServerSocket : public QServerSocket
26{
27 Q_OBJECT
28
29public:
30 KServerSocket ( Q_UINT16 port, int backlog = 0, QObject * parent=0, const char * name=0 ) :
31 QServerSocket( port, backlog, parent, name ){;};
32 void newConnection ( int socket )
33 {
34 qDebug("KServerSocket:New connection %d ", socket);
35 QSocket* s = new QSocket( this );
36 connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
37 connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
38 s->setSocket( socket );
39 }
40
41signals:
42 void sendFile(QSocket*);
43 void getFile(QSocket*);
44 void endConnect();
45private slots:
46 void discardClient()
47 {
48 QSocket* socket = (QSocket*)sender();
49 delete socket;
50 emit endConnect();
51 }
52 void readClient()
53 {
54 qDebug("readClient() ");
55 QSocket* socket = (QSocket*)sender();
56 if ( socket->canReadLine() ) {
57 QStringList tokens = QStringList::split( QRegExp("[ \r\n][ \r\n]*"), socket->readLine() );
58 if ( tokens[0] == "GET" ) {
59 emit sendFile( socket );
60 }
61 if ( tokens[0] == "PUT" ) {
62 emit getFile( socket );
63 }
64 if ( tokens[0] == "STOP" ) {
65 emit endConnect();
66 }
67 }
68 }
69};
70
20 71
@@ -90,3 +141,11 @@ class MainWindow : public QMainWindow
90 141
142 private slots:
143 void fillSyncMenu();
144 void sendFile(QSocket* s);
145 void getFile(QSocket* socket);
146 void readFileFromSocket();
147 void endConnect();
91 private: 148 private:
149 QSocket* mCommandSocket;
150 KServerSocket * mServerSocket;
92 bool mClosed; 151 bool mClosed;
@@ -94,4 +153,6 @@ class MainWindow : public QMainWindow
94 int mCurrentSyncProfile; 153 int mCurrentSyncProfile;
154 void enableQuick();
155 void performQuick();
156 void performQuickQuick();
95 void syncRemote( KSyncProfile* , bool ask = true); 157 void syncRemote( KSyncProfile* , bool ask = true);
96 void fillSyncMenu();
97 bool mFlagKeyPressed; 158 bool mFlagKeyPressed;
@@ -120,4 +181,6 @@ class MainWindow : public QMainWindow
120 QPixmap loadPixmap( QString ); 181 QPixmap loadPixmap( QString );
182 QDialog * mSyncActionDialog;
121}; 183};
122 184
185
123#endif 186#endif