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
@@ -189,7 +189,10 @@ KOPrefs::KOPrefs() :
189// addItemBool("WriteBackFile",&mWriteBackFile,true); 189// addItemBool("WriteBackFile",&mWriteBackFile,true);
190// addItemBool("WriteBackExistingOnly",&mWriteBackExistingOnly,false); 190// addItemBool("WriteBackExistingOnly",&mWriteBackExistingOnly,false);
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);
194 addItemInt("LastSyncTime",&mLastSyncTime,0); 197 addItemInt("LastSyncTime",&mLastSyncTime,0);
195 addItemInt("SyncAlgoPrefs",&mSyncAlgoPrefs,3); 198 addItemInt("SyncAlgoPrefs",&mSyncAlgoPrefs,3);
diff --git a/korganizer/koprefs.h b/korganizer/koprefs.h
index 33eda60..696433e 100644
--- a/korganizer/koprefs.h
+++ b/korganizer/koprefs.h
@@ -279,6 +279,10 @@ class KOPrefs : public KPimPrefs
279 int mAlarmSuspendCount; 279 int mAlarmSuspendCount;
280 int mAlarmBeepInterval; 280 int mAlarmBeepInterval;
281 281
282 QString mPassiveSyncPort;
283 QString mActiveSyncPort;
284 QString mActiveSyncIP;
285
282 286
283 //US I copied the following settings into KPimGlobalPrefs 287 //US I copied the following settings into KPimGlobalPrefs
284 // that allows us later to easily remove the settings from here. 288 // that allows us later to easily remove the settings from here.
diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp
index 6315c64..f2e1bf8 100644
--- a/korganizer/mainwindow.cpp
+++ b/korganizer/mainwindow.cpp
@@ -6,6 +6,7 @@
6#include <qwhatsthis.h> 6#include <qwhatsthis.h>
7#include <qmessagebox.h> 7#include <qmessagebox.h>
8#include <qlineedit.h> 8#include <qlineedit.h>
9#include <qtextcodec.h>
9#include <qfile.h> 10#include <qfile.h>
10#include <qdir.h> 11#include <qdir.h>
11#include <qapp.h> 12#include <qapp.h>
@@ -71,7 +72,9 @@ MainWindow::MainWindow( QWidget *parent, const char *name, QString msg) :
71#ifdef DESKTOP_VERSION 72#ifdef DESKTOP_VERSION
72 setFont( QFont("Arial"), 14 ); 73 setFont( QFont("Arial"), 14 );
73#endif 74#endif
74 75 mCommandSocket = 0;
76 mSyncActionDialog = 0;
77 mServerSocket = 0;
75 mClosed = false; 78 mClosed = false;
76 //QString confFile = KStandardDirs::appDir() + "config/korganizerrc"; 79 //QString confFile = KStandardDirs::appDir() + "config/korganizerrc";
77 QString confFile = locateLocal("config","korganizerrc"); 80 QString confFile = locateLocal("config","korganizerrc");
@@ -213,7 +216,7 @@ MainWindow::~MainWindow()
213{ 216{
214 //qDebug("MainWindow::~MainWindow() "); 217 //qDebug("MainWindow::~MainWindow() ");
215 //save toolbar location 218 //save toolbar location
216 219 delete mServerSocket;
217 delete mCalendar; 220 delete mCalendar;
218 delete KOPrefs::instance(); 221 delete KOPrefs::instance();
219 delete KIncidenceFormatter::instance(); 222 delete KIncidenceFormatter::instance();
@@ -862,6 +865,15 @@ void MainWindow::fillSyncMenu()
862 syncMenu->clear(); 865 syncMenu->clear();
863 syncMenu->insertItem( i18n("Configure..."), 0 ); 866 syncMenu->insertItem( i18n("Configure..."), 0 );
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 );
866 syncMenu->insertSeparator(); 878 syncMenu->insertSeparator();
867 KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); 879 KConfig config ( locateLocal( "config","ksyncprofilesrc" ) );
@@ -996,7 +1008,7 @@ void MainWindow::multiSync( bool askforPrefs )
996} 1008}
997void MainWindow::slotSyncMenu( int action ) 1009void MainWindow::slotSyncMenu( int action )
998{ 1010{
999 //qDebug("syncaction %d ", action); 1011 qDebug("syncaction %d ", action);
1000 if ( action == 0 ) { 1012 if ( action == 0 ) {
1001 1013
1002 // seems to be a Qt2 event handling bug 1014 // seems to be a Qt2 event handling bug
@@ -1012,6 +1024,25 @@ void MainWindow::slotSyncMenu( int action )
1012 multiSync( true ); 1024 multiSync( true );
1013 return; 1025 return;
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
1016 if (mBlockSaveFlag) 1047 if (mBlockSaveFlag)
1017 return; 1048 return;
@@ -1860,6 +1891,286 @@ QString MainWindow::getPassword( )
1860 1891
1861} 1892}
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()
1864{ 2175{
1865 2176
diff --git a/korganizer/mainwindow.h b/korganizer/mainwindow.h
index 47a7a90..58081f6 100644
--- a/korganizer/mainwindow.h
+++ b/korganizer/mainwindow.h
@@ -4,6 +4,7 @@
4#include <qmainwindow.h> 4#include <qmainwindow.h>
5#include <qtimer.h> 5#include <qtimer.h>
6#include <qdict.h> 6#include <qdict.h>
7#include <qregexp.h>
7 8
8#include <libkcal/incidence.h> 9#include <libkcal/incidence.h>
9#include "simplealarmclient.h" 10#include "simplealarmclient.h"
@@ -17,6 +18,56 @@ class KSyncProfile;
17#define QPEMenuBar QMenuBar 18#define QPEMenuBar QMenuBar
18#endif 19#endif
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
21namespace KCal { 72namespace KCal {
22class CalendarLocal; 73class CalendarLocal;
@@ -88,12 +139,22 @@ class MainWindow : public QMainWindow
88 139
89 void enableIncidenceActions( bool ); 140 void enableIncidenceActions( bool );
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;
93 void saveOnClose(); 152 void saveOnClose();
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;
98 bool mBlockAtStartup; 159 bool mBlockAtStartup;
99 QPEToolBar *iconToolBar; 160 QPEToolBar *iconToolBar;
@@ -118,6 +179,8 @@ class MainWindow : public QMainWindow
118 bool mBlockSaveFlag; 179 bool mBlockSaveFlag;
119 bool mCalendarModifiedFlag; 180 bool mCalendarModifiedFlag;
120 QPixmap loadPixmap( QString ); 181 QPixmap loadPixmap( QString );
182 QDialog * mSyncActionDialog;
121}; 183};
122 184
185
123#endif 186#endif