-rw-r--r-- | libkdepim/ksyncmanager.cpp | 186 | ||||
-rw-r--r-- | libkdepim/ksyncmanager.h | 14 |
2 files changed, 173 insertions, 27 deletions
diff --git a/libkdepim/ksyncmanager.cpp b/libkdepim/ksyncmanager.cpp index 87f200a..07e6761 100644 --- a/libkdepim/ksyncmanager.cpp +++ b/libkdepim/ksyncmanager.cpp @@ -25,96 +25,110 @@ #include <stdlib.h> #ifndef _WIN32_ #include <unistd.h> #endif #include "ksyncprofile.h" #include "ksyncprefsdialog.h" #include "kpimprefs.h" #include <qdir.h> +#include <qprogressbar.h> #include <qpopupmenu.h> #include <qpushbutton.h> #include <qradiobutton.h> #include <qbuttongroup.h> #include <qtimer.h> #include <qmessagebox.h> #include <qapplication.h> #include <qlineedit.h> #include <qdialog.h> #include <qlayout.h> #include <klocale.h> #include <kglobal.h> #include <kconfig.h> #include <kfiledialog.h> KSyncManager::KSyncManager(QWidget* parent, KSyncInterface* implementation, TargetApp ta, KPimPrefs* prefs, QPopupMenu* syncmenu) : QObject(), mParent(parent), mImplementation(implementation), mTargetApp(ta), mPrefs(prefs), mSyncMenu(syncmenu) { + bar = new QProgressBar ( 1, 0 ); + bar->setCaption (""); + + int w = 300; + if ( QApplication::desktop()->width() < 320 ) + w = 220; + int h = bar->sizeHint().height() ; + int dw = QApplication::desktop()->width(); + int dh = QApplication::desktop()->height(); + bar->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); } KSyncManager::~KSyncManager() { - + delete bar; } void KSyncManager::fillSyncMenu() { if ( mSyncMenu->count() ) mSyncMenu->clear(); mSyncMenu->insertItem( i18n("Configure..."), 0 ); mSyncMenu->insertSeparator(); mSyncMenu->insertItem( i18n("Multiple sync"), 1 ); mSyncMenu->insertSeparator(); KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); config.setGroup("General"); QStringList prof = config.readListEntry("SyncProfileNames"); mPrefs->mLocalMachineName = config.readEntry("LocalMachineName","undefined"); if ( prof.count() < 3 ) { prof.clear(); - prof << i18n("Sharp_DTM"); - prof << i18n("Local_file"); + prof << i18n("Sharp_DTM"); + prof << i18n("Local_file"); prof << i18n("Last_file"); KSyncProfile* temp = new KSyncProfile (); temp->setName( prof[0] ); temp->writeConfig(&config); temp->setName( prof[1] ); temp->writeConfig(&config); temp->setName( prof[2] ); temp->writeConfig(&config); config.setGroup("General"); config.writeEntry("SyncProfileNames",prof); config.writeEntry("ExternSyncProfiles","Sharp_DTM"); config.sync(); delete temp; } mPrefs->mExternSyncProfiles = config.readListEntry("ExternSyncProfiles"); mPrefs->mSyncProfileNames = prof; unsigned int i; for ( i = 0; i < prof.count(); ++i ) { - mSyncMenu->insertItem( prof[i], 1000+i ); if ( i == 2 ) mSyncMenu->insertSeparator(); } QDir app_dir; - if ( !app_dir.exists(QDir::homeDirPath()+"/Applications/dtm" ) ) { - mSyncMenu->setItemEnabled( false , 1000 ); + //US do not display SharpDTM if app is pwmpi, or no sharpfiles available + if ( mTargetApp == PWMPI) { + mSyncMenu->removeItem( 1000 ); + } + else if (!app_dir.exists(QDir::homeDirPath()+"/Applications/dtm" ) ) { + mSyncMenu->setItemEnabled( 1000, false ); } //probaly useless //mView->setupExternSyncProfiles(); } void KSyncManager::slotSyncMenu( int action ) { //qDebug("syncaction %d ", action); if ( action == 0 ) { // seems to be a Qt2 event handling bug // syncmenu.clear causes a segfault at first time @@ -152,48 +166,82 @@ void KSyncManager::slotSyncMenu( int action ) mPrefs->mShowSyncSummary = temp->getShowSummaryAfterSync(); if ( action == 1000 ) { syncSharp(); } else if ( action == 1001 ) { syncLocalFile(); } else if ( action == 1002 ) { quickSyncLocalFile(); } else if ( action >= 1003 ) { if ( temp->getIsLocalFileSync() ) { - if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) + switch(mTargetApp) + { + case (KAPI): + if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); - + break; + case (KOPI): + if ( syncWithFile( temp->getRemoteFileName( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileName(); + break; + case (PWMPI): + if ( syncWithFile( temp->getRemoteFileNamePWM( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNamePWM(); + break; + default: + qDebug("KSyncManager::slotSyncMenu: invalid apptype selected"); + break; + + } } else { if ( temp->getIsPhoneSync() ) { mPrefs->mPhoneDevice = temp->getPhoneDevice( ) ; mPrefs->mPhoneConnection = temp->getPhoneConnection( ); mPrefs->mPhoneModel = temp->getPhoneModel( ); syncPhone(); } else syncRemote( temp ); } } delete temp; setBlockSave(false); } void KSyncManager::syncLocalFile() { QString fn =mPrefs->mLastSyncedLocalFile; - - fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename(*.ics/*.vcs)"), mParent ); + QString ext; + + switch(mTargetApp) + { + case (KAPI): + ext = "(*.vcf)"; + break; + case (KOPI): + ext = "(*.ics/*.vcs)"; + break; + case (PWMPI): + ext = "(*.pwm)"; + break; + default: + qDebug("KSyncManager::syncLocalFile: invalid apptype selected"); + break; + + } + + fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename"+ext), mParent ); if ( fn == "" ) return; if ( syncWithFile( fn, false ) ) { qDebug("syncLocalFile() successful "); } } bool KSyncManager::syncWithFile( QString fn , bool quick ) { bool ret = false; QFileInfo info; info.setFile( fn ); @@ -275,42 +323,78 @@ int KSyncManager::ringSync() { int syncedProfiles = 0; unsigned int i; QTime timer; KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); QStringList syncProfileNames = mPrefs->mSyncProfileNames; KSyncProfile* temp = new KSyncProfile (); mPrefs->mAskForPreferences = false; for ( i = 0; i < syncProfileNames.count(); ++i ) { mCurrentSyncProfile = i; temp->setName(syncProfileNames[mCurrentSyncProfile]); temp->readConfig(&config); - if ( temp->getIncludeInRingSyncAB() && ( i < 1 || i > 2 )) { + + QString includeInRingSync; + switch(mTargetApp) + { + case (KAPI): + includeInRingSync = temp->getIncludeInRingSyncAB(); + break; + case (KOPI): + includeInRingSync = temp->getIncludeInRingSync(); + break; + case (PWMPI): + includeInRingSync = temp->getIncludeInRingSyncPWM(); + break; + default: + qDebug("KSyncManager::ringSync: invalid apptype selected"); + break; + + } + + + if ( includeInRingSync && ( i < 1 || i > 2 )) { mParent->setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... ")); ++syncedProfiles; // mPrefs->mAskForPreferences = temp->getAskForPreferences(); mPrefs->mWriteBackFile = temp->getWriteBackFile(); mPrefs->mWriteBackExistingOnly = temp->getWriteBackExisting(); mPrefs->mWriteBackInFuture = 0; if ( temp->getWriteBackFuture() ) mPrefs->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); mPrefs->mShowSyncSummary = false; mCurrentSyncDevice = syncProfileNames[i] ; mCurrentSyncName = mPrefs->mLocalMachineName; if ( i == 0 ) { syncSharp(); } else { if ( temp->getIsLocalFileSync() ) { - if ( syncWithFile( temp->getRemoteFileNameAB( ), true ) ) - mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); + switch(mTargetApp) + { + case (KAPI): + if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); + break; + case (KOPI): + if ( syncWithFile( temp->getRemoteFileName( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileName(); + break; + case (PWMPI): + if ( syncWithFile( temp->getRemoteFileNamePWM( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNamePWM(); + break; + default: + qDebug("KSyncManager::slotSyncMenu: invalid apptype selected"); + break; + } } else { if ( temp->getIsPhoneSync() ) { mPrefs->mPhoneDevice = temp->getPhoneDevice( ) ; mPrefs->mPhoneConnection = temp->getPhoneConnection( ); mPrefs->mPhoneModel = temp->getPhoneModel( ); syncPhone(); } else syncRemote( temp, false ); } } timer.start(); @@ -331,71 +415,100 @@ int KSyncManager::ringSync() 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 command = prof->getPreSyncCommandAB(); + + 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 = command.find("$PWD$")) > 0 ) { + if ( (fi = preCommand.find("$PWD$")) > 0 ) { QString pwd = getPassword(); - command = command.left( fi )+ pwd + command.mid( fi+5 ); + preCommand = preCommand.left( fi )+ pwd + preCommand.mid( fi+5 ); } int maxlen = 30; if ( QApplication::desktop()->width() > 320 ) maxlen += 25; mParent->setCaption ( i18n( "Copy remote file to local machine..." ) ); int fileSize = 0; - int result = system ( command ); + 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 < command.length() ) { - command.insert( len , "\n" ); + 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 (command) ; + 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->setCaption (""); return; } mParent->setCaption ( i18n( "Copying succeed." ) ); //qDebug(" file **%s** ",prof->getLocalTempFile().latin1() ); - if ( syncWithFile( prof->getLocalTempFileAB(), true ) ) { + + + + if ( syncWithFile( localTempFile, true ) ) { // Event* e = mView->getLastSyncEvent(); // e->setReadOnly( false ); // e->setLocation( KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]); // e->setReadOnly( true ); if ( mPrefs->mWriteBackFile ) { - command = prof->getPostSyncCommandAB(); int fi; - if ( (fi = command.find("$PWD$")) > 0 ) { + if ( (fi = postCommand.find("$PWD$")) > 0 ) { QString pwd = getPassword(); - command = command.left( fi )+ pwd + command.mid( fi+5 ); + postCommand = postCommand.left( fi )+ pwd + postCommand.mid( fi+5 ); } mParent->setCaption ( i18n( "Writing back file ..." ) ); - result = system ( command ); + result = system ( postCommand ); qDebug("Writing back file result: %d ", result); if ( result != 0 ) { mParent->setCaption ( i18n( "Writing back file result: " )+QString::number( result ) ); return; } else { mParent->setCaption ( i18n( "Syncronization sucessfully completed" ) ); } } } return; } @@ -518,12 +631,35 @@ bool KSyncManager::syncExternalApplication(QString resource) } void KSyncManager::syncPhone() { if ( mImplementation->sync_isModified() ) mImplementation->sync_save(); qDebug("pending syncPhone(); "); //mView->syncPhone(); mImplementation->sync_setModified(); } + +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(); +} diff --git a/libkdepim/ksyncmanager.h b/libkdepim/ksyncmanager.h index 389a005..9761107 100644 --- a/libkdepim/ksyncmanager.h +++ b/libkdepim/ksyncmanager.h @@ -22,47 +22,53 @@ $Id$ #ifndef _KSYNCMANAGER_H #define _KSYNCMANAGER_H #include <qobject.h> #include <qstring.h> class QPopupMenu; class KSyncProfile; class KPimPrefs; class QWidget; class KSyncManager; class KSyncInterface; +class QProgressBar; 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() ; bool blockSave() { return mBlockSaveFlag; } void setBlockSave(bool sa) { mBlockSaveFlag = sa; } void fillSyncMenu(); QString getCurrentSyncDevice() { return mCurrentSyncDevice; } QString getCurrentSyncName() { return mCurrentSyncName; } + void showProgressBar(int percentage, QString caption = QString::null, int total=100); + void hideProgressBar(); + bool isProgressBarCanceled(); + + public slots: void slotSyncMenu( int ); private: // LR ******************************* // sync stuff! QString mCurrentSyncDevice; QString mCurrentSyncName; void quickSyncLocalFile(); bool syncWithFile( QString fn , bool quick ); void syncLocalFile(); void syncPhone(); @@ -80,39 +86,43 @@ class KSyncManager : public QObject // ********************* private: bool mBlockSaveFlag; QWidget* mParent; KSyncInterface* mImplementation; TargetApp mTargetApp; KPimPrefs* mPrefs; QPopupMenu* mSyncMenu; - + QProgressBar* bar; }; class KSyncInterface { public: virtual bool sync(KSyncManager* manager, QString filename, int mode) = 0; - virtual bool syncExternal(KSyncManager* manager, QString resource) = 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; + } //called by the syncmanager to indicate that the work has to be marked as dirty. virtual void sync_setModified() = 0; //called by the syncmanager to ask if the dirty flag is set. virtual bool sync_isModified() = 0; //called by the syncmanager to indicate that the work has to be saved. virtual void sync_save() = 0; }; |