-rw-r--r-- | korganizer/mainwindow.cpp | 317 |
1 files changed, 314 insertions, 3 deletions
diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp index 6315c64..f2e1bf8 100644 --- a/korganizer/mainwindow.cpp +++ b/korganizer/mainwindow.cpp @@ -1,20 +1,21 @@ #include <stdlib.h> #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> #include <qwmatrix.h> #include <qtextbrowser.h> #include <qtextstream.h> #ifndef DESKTOP_VERSION #include <qpe/global.h> #include <qpe/qpemenubar.h> @@ -62,25 +63,27 @@ using namespace KCal; #include "koimportoldialog.h" #endif #include "mainwindow.h" int globalFlagBlockStartup; 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" ) ); mBlockAtStartup = true; mFlagKeyPressed = false; setCaption("KOrganizer/Pi"); KOPrefs *p = KOPrefs::instance(); KPimGlobalPrefs::instance()->setGlobalConfig(); // if ( QApplication::desktop()->height() > 480 ) { @@ -204,25 +207,25 @@ MainWindow::MainWindow( QWidget *parent, const char *name, QString msg) : mView->dialogManager()->showSyncOptions(); } //US listen for result adressed from Ka/Pi #ifndef DESKTOP_VERSION connect(qApp, SIGNAL (appMessage ( const QCString &, const QByteArray & )), ExternalAppHandler::instance(), SLOT (appMessage ( const QCString &, const QByteArray & ))); #endif } MainWindow::~MainWindow() { //qDebug("MainWindow::~MainWindow() "); //save toolbar location - + delete mServerSocket; delete mCalendar; delete KOPrefs::instance(); delete KIncidenceFormatter::instance(); } void MainWindow::showMaximized () { #ifndef DESKTOP_VERSION if ( ! globalFlagBlockStartup ) if ( mClosed ) mView->goToday(); @@ -853,24 +856,33 @@ void MainWindow::initActions() if (p-> mShowIconWhatsThis) QWhatsThis::whatsThisButton ( iconToolBar ); connect( configureToolBarMenu, SIGNAL( activated( int ) ),this, SLOT(configureToolBar( int ) ) ); configureAgenda( p->mHourSize ); connect( configureAgendaMenu, SIGNAL( activated( int ) ),this, SLOT(configureAgenda( int ) ) ); } 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"); if ( prof.count() < 3 ) { prof.clear(); prof << i18n("Sharp_DTM"); prof << i18n("Local_file"); prof << i18n("Last_file"); KSyncProfile* temp = new KSyncProfile (); @@ -987,40 +999,59 @@ void MainWindow::multiSync( bool askforPrefs ) ringSync(); mBlockSaveFlag = false; if ( num ) save(); if ( num ) setCaption(i18n("%1 profiles synced. Multiple sync completed!").arg(num) ); 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 QTimer::singleShot ( 1, this, SLOT ( confSync() ) ); //confSync(); 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] ); 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(); @@ -1851,24 +1882,304 @@ QString MainWindow::getPassword( ) 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 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 ); if ( fn == "" ) return; //mView->setSyncDevice("local-file" ); if ( syncWithFile( fn, false ) ) { // Event* e = mView->getLastSyncEvent(); // e->setReadOnly( false ); |