-rw-r--r-- | kaddressbook/kabcore.cpp | 507 | ||||
-rw-r--r-- | kaddressbook/kabcore.h | 38 | ||||
-rw-r--r-- | kaddressbook/kabprefs.h | 18 | ||||
-rw-r--r-- | libkdepim/kpimprefs.h | 21 | ||||
-rw-r--r-- | libkdepim/ksyncmanager.cpp | 274 | ||||
-rw-r--r-- | libkdepim/ksyncmanager.h | 75 | ||||
-rw-r--r-- | libkdepim/libkdepimE.pro | 2 |
7 files changed, 332 insertions, 603 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp index df634d0..f222234 100644 --- a/kaddressbook/kabcore.cpp +++ b/kaddressbook/kabcore.cpp @@ -149,36 +149,36 @@ $Id$ #else #include <unistd.h> #endif // sync includes #include <libkdepim/ksyncprofile.h> #include <libkdepim/ksyncprefsdialog.h> bool pasteWithNewUid = true; #ifdef KAB_EMBEDDED KABCore::KABCore( KAddressBookMain *client, bool readWrite, QWidget *parent, const char *name ) - : QWidget( parent, name ), mGUIClient( client ), mViewManager( 0 ), + : QWidget( parent, name ), KSyncInterface(), mGUIClient( client ), mViewManager( 0 ), mExtensionManager( 0 ),mConfigureDialog( 0 ),/*US mLdapSearchDialog( 0 ),*/ mReadWrite( readWrite ), mModified( false ), mMainWindow(client) #else //KAB_EMBEDDED KABCore::KABCore( KXMLGUIClient *client, bool readWrite, QWidget *parent, const char *name ) - : QWidget( parent, name ), mGUIClient( client ), mViewManager( 0 ), + : QWidget( parent, name ), KSyncInterface(), mGUIClient( client ), mViewManager( 0 ), mExtensionManager( 0 ), mConfigureDialog( 0 ), mLdapSearchDialog( 0 ), mReadWrite( readWrite ), mModified( false ) #endif //KAB_EMBEDDED { - - mBlockSaveFlag = false; + // syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::KAPI, KABPrefs::instance(), syncMenu); + // syncManager->setBlockSave(false); mExtensionBarSplitter = 0; mIsPart = !parent->inherits( "KAddressBookMain" ); mAddressBook = KABC::StdAddressBook::self(); KABC::StdAddressBook::setAutomaticSave( false ); #ifndef KAB_EMBEDDED mAddressBook->setErrorHandler( new KABC::GUIErrorHandler ); #endif //KAB_EMBEDDED connect( mAddressBook, SIGNAL( addressBookChanged( AddressBook * ) ), SLOT( addressBookChanged() ) ); @@ -260,24 +260,26 @@ KABCore::KABCore( KXMLGUIClient *client, bool readWrite, QWidget *parent, const createAddresseeEditorDialog( this ); setModified( false ); } KABCore::~KABCore() { // save(); //saveSettings(); //KABPrefs::instance()->writeConfig(); delete AddresseeConfig::instance(); mAddressBook = 0; KABC::StdAddressBook::close(); + + delete syncManager; } void KABCore::restoreSettings() { mMultipleViewsAtOnce = KABPrefs::instance()->mMultipleViewsAtOnce; bool state; if (mMultipleViewsAtOnce) state = KABPrefs::instance()->mDetailsPageVisible; else state = false; @@ -1065,48 +1067,48 @@ void KABCore::executeContact( const QString &uid /*US = QString::null*/ ) editContact( uid ); } else { setDetailsVisible( true ); mActionDetails->setChecked(true); } } void KABCore::save() { - if (mBlockSaveFlag) + if (syncManager->blockSave()) return; - mBlockSaveFlag = true; + syncManager->setBlockSave(true); if ( !mModified ) return; QString text = i18n( "There was an error while attempting to save\n the " "address book. Please check that some \nother application is " "not using it. " ); statusMessage(i18n("Saving addressbook ... ")); #ifndef KAB_EMBEDDED KABC::StdAddressBook *b = dynamic_cast<KABC::StdAddressBook*>( mAddressBook ); if ( !b || !b->save() ) { KMessageBox::error( this, text, i18n( "Unable to Save" ) ); } #else //KAB_EMBEDDED KABC::StdAddressBook *b = (KABC::StdAddressBook*)( mAddressBook ); if ( !b || !b->save() ) { QMessageBox::critical( this, i18n( "Unable to Save" ), text, i18n("Ok")); } #endif //KAB_EMBEDDED statusMessage(i18n("Addressbook saved!")); setModified( false ); - mBlockSaveFlag = false; + syncManager->setBlockSave(false); } void KABCore::statusMessage(QString mess , int time ) { //topLevelWidget()->setCaption( mess ); // pending setting timer to revome message } void KABCore::undo() { UndoStack::instance()->undo(); // Refresh the view @@ -1527,24 +1529,27 @@ void KABCore::initGUI() mViewManager = new ViewManager( this, viewSpace ); viewSpace->setStretchFactor( mViewManager, 1 ); mDetails = new ViewContainer( this ); topLayout->addWidget( viewSpace ); // topLayout->setStretchFactor( mDetailsSplitter, 100 ); topLayout->addWidget( mDetails ); #endif //KAB_NOSPLITTER */ + syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::KAPI, KABPrefs::instance(), syncMenu); + syncManager->setBlockSave(false); + #endif //KAB_EMBEDDED initActions(); #ifdef KAB_EMBEDDED addActionsManually(); //US make sure the export and import menues are initialized before creating the xxPortManager. mXXPortManager = new XXPortManager( this, this ); // LR mIncSearchWidget = new IncSearchWidget( mMainWindow->getIconToolBar() ); //mMainWindow->toolBar()->insertWidget(-1, 4, mIncSearchWidget); // mActionQuit->plug ( mMainWindow->toolBar()); @@ -1889,26 +1894,26 @@ void KABCore::addActionsManually() mIncSearchWidget = new IncSearchWidget( tb ); connect( mIncSearchWidget, SIGNAL( doSearch( const QString& ) ), SLOT( incrementalSearch( const QString& ) ) ); mJumpButtonBar = new JumpButtonBar( this, this ); //US topLayout->addWidget( mJumpButtonBar ); this->layout()->add( mJumpButtonBar ); */ #endif //KAB_EMBEDDED - connect ( syncMenu, SIGNAL( activated ( int ) ), this, SLOT (slotSyncMenu( int ) ) ); - fillSyncMenu(); + connect ( syncMenu, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) ); + syncManager->fillSyncMenu(); } void KABCore::showLicence() { KApplication::showLicence(); } void KABCore::removeVoice() { if ( KMessageBox::questionYesNo( this, i18n("After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as \"other\".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?") ) == KMessageBox::No ) return; KABC::Addressee::List list = mViewManager->selectedAddressees(); KABC::Addressee::List::Iterator it; @@ -2092,439 +2097,31 @@ void KABCore::requestForDetails(const QString& sourceChannel, const QString& ses setDetailsVisible( true ); mActionDetails->setChecked(true); } } } void KABCore::faq() { KApplication::showFile( "KA/Pi FAQ", "kdepim/kaddressbook/kapiFAQ.txt" ); } - -void KABCore::fillSyncMenu() -{ - if ( syncMenu->count() ) - syncMenu->clear(); - syncMenu->insertItem( i18n("Configure..."), 0 ); - syncMenu->insertSeparator(); - syncMenu->insertItem( i18n("Multiple sync"), 1 ); - syncMenu->insertSeparator(); - KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); - config.setGroup("General"); - QStringList prof = config.readListEntry("SyncProfileNames"); - KABPrefs::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 (); - 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; - } - KABPrefs::instance()->mExternSyncProfiles = config.readListEntry("ExternSyncProfiles"); - KABPrefs::instance()->mSyncProfileNames = prof; - int i; - for ( i = 0; i < prof.count(); ++i ) { - - syncMenu->insertItem( prof[i], 1000+i ); - if ( i == 2 ) - syncMenu->insertSeparator(); - } - QDir app_dir; - if ( !app_dir.exists(QDir::homeDirPath()+"/Applications/dtm" ) ) { - syncMenu->setItemEnabled( false , 1000 ); - } - //probaly useless - //mView->setupExternSyncProfiles(); -} -void KABCore::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 - // 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 (mBlockSaveFlag) - return; - mBlockSaveFlag = true; - mCurrentSyncProfile = action - 1000 ; - mCurrentSyncDevice = KABPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile] ; - mCurrentSyncName = KABPrefs::instance()->mLocalMachineName ; - KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); - KSyncProfile* temp = new KSyncProfile (); - temp->setName(KABPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]); - temp->readConfig(&config); - KABPrefs::instance()->mAskForPreferences = temp->getAskForPreferences(); - KABPrefs::instance()->mSyncAlgoPrefs = temp->getSyncPrefs(); - KABPrefs::instance()->mWriteBackFile = temp->getWriteBackFile(); - KABPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting(); - KABPrefs::instance()->mWriteBackInFuture = 0; - if ( temp->getWriteBackFuture() ) - KABPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); - KABPrefs::instance()->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 ) ) - KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); - } else { - if ( temp->getIsPhoneSync() ) { - KABPrefs::instance()->mPhoneDevice = temp->getPhoneDevice( ) ; - KABPrefs::instance()->mPhoneConnection = temp->getPhoneConnection( ); - KABPrefs::instance()->mPhoneModel = temp->getPhoneModel( ); - syncPhone(); - } else - syncRemote( temp ); - - } - } - delete temp; - mBlockSaveFlag = false; -} - -void KABCore::syncLocalFile() -{ - - QString fn =KABPrefs::instance()->mLastSyncedLocalFile; - - fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename(*.ics/*.vcs)"), this ); - if ( fn == "" ) - return; - if ( syncWithFile( fn, false ) ) { - qDebug("syncLocalFile() successful "); - } - -} -bool KABCore::syncWithFile( QString fn , bool quick ) -{ - bool ret = false; - QFileInfo info; - info.setFile( fn ); - QString mess; - bool loadbup = true; - if ( !info. exists() ) { - mess = i18n( "Sync file \n...%1\ndoes not exist!\nNothing synced!\n").arg(fn.right( 30) ); - int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"), - mess ); - return ret; - } - int result = 0; - if ( !quick ) { - mess = i18n("Sync with file \n...%1\nfrom:\n%2\n").arg(fn.right( 25)).arg(KGlobal::locale()->formatDateTime(info.lastModified (), true, false )); - result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"), - mess, - i18n("Sync"), i18n("Cancel"), 0, - 0, 1 ); - if ( result ) - return false; - } - if ( KABPrefs::instance()->mAskForPreferences ) - edit_sync_options(); - if ( result == 0 ) { - //qDebug("Now sycing ... "); - if ( ret = syncAB( fn, KABPrefs::instance()->mSyncAlgoPrefs ) ) - setCaption( i18n("Synchronization successful") ); - else - setCaption( i18n("Sync cancelled or failed. Nothing synced.") ); - if ( ! quick ) - KABPrefs::instance()->mLastSyncedLocalFile = fn; - setModified(); - } - return ret; -} -void KABCore::quickSyncLocalFile() -{ - - if ( syncWithFile( KABPrefs::instance()->mLastSyncedLocalFile, false ) ) { - qDebug("quick syncLocalFile() successful "); - - } -} -void KABCore::multiSync( bool askforPrefs ) -{ - if (mBlockSaveFlag) - return; - mBlockSaveFlag = true; - QString question = i18n("Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!"); - if ( QMessageBox::information( this, i18n("KO/Pi Sync"), - question, - i18n("Yes"), i18n("No"), - 0, 0 ) != 0 ) { - mBlockSaveFlag = false; - setCaption(i18n("Aborted! Nothing synced!")); - return; - } - mCurrentSyncDevice = i18n("Multiple profiles") ; - KABPrefs::instance()->mSyncAlgoPrefs = KABPrefs::instance()->mRingSyncAlgoPrefs; - if ( askforPrefs ) { - edit_sync_options(); - KABPrefs::instance()->mRingSyncAlgoPrefs = KABPrefs::instance()->mSyncAlgoPrefs; - } - setCaption(i18n("Multiple sync started.") ); - qApp->processEvents(); - int num = ringSync() ; - if ( num > 1 ) - 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; -} -int KABCore::ringSync() -{ - int syncedProfiles = 0; - int i; - QTime timer; - KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); - QStringList syncProfileNames = KABPrefs::instance()->mSyncProfileNames; - KSyncProfile* temp = new KSyncProfile (); - KABPrefs::instance()->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 )) { - setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... ")); - ++syncedProfiles; - // KABPrefs::instance()->mAskForPreferences = temp->getAskForPreferences(); - KABPrefs::instance()->mWriteBackFile = temp->getWriteBackFile(); - KABPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting(); - KABPrefs::instance()->mWriteBackInFuture = 0; - if ( temp->getWriteBackFuture() ) - KABPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); - KABPrefs::instance()->mShowSyncSummary = false; - mCurrentSyncDevice = syncProfileNames[i] ; - mCurrentSyncName = KABPrefs::instance()->mLocalMachineName; - if ( i == 0 ) { - syncSharp(); - } else { - if ( temp->getIsLocalFileSync() ) { - if ( syncWithFile( temp->getRemoteFileNameAB( ), true ) ) - KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); - } else { - if ( temp->getIsPhoneSync() ) { - KABPrefs::instance()->mPhoneDevice = temp->getPhoneDevice( ) ; - KABPrefs::instance()->mPhoneConnection = temp->getPhoneConnection( ); - KABPrefs::instance()->mPhoneModel = temp->getPhoneModel( ); - syncPhone(); - } else - syncRemote( temp, false ); - - } - } - timer.start(); - setCaption(i18n("Multiple sync in progress ... please wait!") ); - while ( timer.elapsed () < 2000 ) { - qApp->processEvents(); -#ifndef _WIN32_ - sleep (1); -#endif - } - - } - - } - delete temp; - return syncedProfiles; -} - -void KABCore::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( this, i18n("KO/Pi Sync"), - question, - i18n("Yes"), i18n("No"), - 0, 0 ) != 0 ) - return; - } - QString command = prof->getPreSyncCommandAB(); - int fi; - if ( (fi = command.find("$PWD$")) > 0 ) { - QString pwd = getPassword(); - command = command.left( fi )+ pwd + command.mid( fi+5 ); - - } - int maxlen = 30; - if ( QApplication::desktop()->width() > 320 ) - maxlen += 25; - setCaption ( i18n( "Copy remote file to local machine..." ) ); - int fileSize = 0; - int result = system ( command ); - // 0 : okay - // 256: no such file or dir - // - qDebug("KO: Remote copy result(0 = okay): %d ",result ); - if ( result != 0 ) { - int len = maxlen; - while ( len < command.length() ) { - command.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) ; - QMessageBox::information( this, i18n("KO/Pi Sync - ERROR"), - question, - i18n("Okay!")) ; - setCaption ("KO/Pi"); - return; - } - setCaption ( i18n( "Copying succeed." ) ); - //qDebug(" file **%s** ",prof->getLocalTempFile().latin1() ); - if ( syncWithFile( prof->getLocalTempFileAB(), true ) ) { -// Event* e = mView->getLastSyncEvent(); -// e->setReadOnly( false ); -// e->setLocation( KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]); -// e->setReadOnly( true ); - if ( KABPrefs::instance()->mWriteBackFile ) { - command = prof->getPostSyncCommandAB(); - int fi; - if ( (fi = command.find("$PWD$")) > 0 ) { - QString pwd = getPassword(); - command = command.left( fi )+ pwd + command.mid( fi+5 ); - - } - setCaption ( i18n( "Writing back file ..." ) ); - result = system ( command ); - qDebug("KO: Writing back file result: %d ", result); - if ( result != 0 ) { - setCaption ( i18n( "Writing back file result: " )+QString::number( result ) ); - return; - } else { - setCaption ( i18n( "Syncronization sucessfully completed" ) ); - } - } - } - return; -} -#include <qpushbutton.h> -#include <qradiobutton.h> -#include <qbuttongroup.h> -void KABCore::edit_sync_options() -{ - //mDialogManager->showSyncOptions(); - //KABPrefs::instance()->mSyncAlgoPrefs - QDialog dia( this, "dia", true ); - dia.setCaption( i18n("Device: " ) +mCurrentSyncDevice ); - QButtonGroup gr ( 1, Qt::Horizontal, i18n("Sync preferences"), &dia); - QVBoxLayout lay ( &dia ); - lay.setSpacing( 2 ); - lay.setMargin( 3 ); - lay.addWidget(&gr); - QRadioButton loc ( i18n("Take local entry on conflict"), &gr ); - QRadioButton rem ( i18n("Take remote entry on conflict"), &gr ); - QRadioButton newest( i18n("Take newest entry on conflict"), &gr ); - QRadioButton ask( i18n("Ask for every entry on conflict"), &gr ); - QRadioButton f_loc( i18n("Force: Take local entry always"), &gr ); - QRadioButton f_rem( i18n("Force: Take remote entry always"), &gr ); - //QRadioButton both( i18n("Take both on conflict"), &gr ); - QPushButton pb ( "OK", &dia); - lay.addWidget( &pb ); - connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) ); - switch ( KABPrefs::instance()->mSyncAlgoPrefs ) { - case 0: - loc.setChecked( true); - break; - case 1: - rem.setChecked( true ); - break; - case 2: - newest.setChecked( true); - break; - case 3: - ask.setChecked( true); - break; - case 4: - f_loc.setChecked( true); - break; - case 5: - f_rem.setChecked( true); - break; - case 6: - // both.setChecked( true); - break; - default: - break; - } - if ( dia.exec() ) { - KABPrefs::instance()->mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ; - } - - -} -QString KABCore::getPassword( ) -{ - QString retfile = ""; - QDialog dia ( this, "input-dialog", true ); - QLineEdit lab ( &dia ); - lab.setEchoMode( QLineEdit::Password ); - QVBoxLayout lay( &dia ); - lay.setMargin(7); - lay.setSpacing(7); - lay.addWidget( &lab); - dia.setFixedSize( 230,50 ); - dia.setCaption( i18n("Enter password") ); - 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(); - dia.hide(); - qApp->processEvents(); - return retfile; - -} #include <libkcal/syncdefines.h> KABC::Addressee KABCore::getLastSyncAddressee() { Addressee lse; + QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); + //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() ); lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice ); if (lse.isEmpty()) { qDebug("Creating new last-syncAddressee "); lse.setUid( "last-syncAddressee-"+mCurrentSyncDevice ); QString sum = ""; if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) sum = "E: "; lse.setFamilyName("!"+sum+mCurrentSyncDevice + i18n(" - sync event")); lse.setRevision( mLastAddressbookSync ); lse.setCategories( i18n("SyncEvent") ); mAddressBook->insertAddressee( lse ); @@ -2538,24 +2135,27 @@ int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, i // int zaurusId() const; // void setZaurusUid(int id); // int zaurusUid() const; // void setZaurusStat(int id); // int zaurusStat() const; // 0 equal // 1 take local // 2 take remote // 3 cancel QDateTime lastSync = mLastAddressbookSync; QDateTime localMod = local->revision(); QDateTime remoteMod = remote->revision(); + + QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); + if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { bool remCh, locCh; remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); locCh = ( localMod > mLastAddressbookSync ); if ( !remCh && ! locCh ) { //qDebug("both not changed "); lastSync = localMod.addDays(1); if ( mode <= SYNC_PREF_ASK ) return 0; } else { @@ -2644,33 +2244,39 @@ int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, i return 1; break; case SYNC_PREF_FORCE_REMOTE: return 2; break; default: // SYNC_PREF_TAKE_BOTH not implemented break; } return 0; } + + bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode) { bool syncOK = true; int addedAddressee = 0; int addedAddresseeR = 0; int deletedAddresseeR = 0; int deletedAddresseeL = 0; int changedLocal = 0; int changedRemote = 0; + + QString mCurrentSyncName = syncManager->getCurrentSyncName(); + QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); + //QPtrList<Addressee> el = local->rawAddressees(); Addressee addresseeR; QString uid; int take; Addressee addresseeL; Addressee addresseeRSync; Addressee addresseeLSync; // KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees(); //KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees(); bool fullDateRange = false; local->resetTempSyncStat(); mLastAddressbookSync = QDateTime::currentDateTime(); @@ -2912,30 +2518,34 @@ bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBo if ( mGlobalSyncMode == SYNC_MODE_NORMAL) remote->insertAddressee( addresseeRSync, false ); local->insertAddressee( addresseeLSync, false ); QString mes; mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedAddressee, addedAddresseeR, changedLocal, changedRemote, deletedAddresseeL, deletedAddresseeR ); if ( KABPrefs::instance()->mShowSyncSummary ) { KMessageBox::information(this, mes, i18n("KA/Pi Synchronization") ); } qDebug( mes ); return syncOK; } -bool KABCore::syncAB(QString filename, int mode) + +//this is a overwritten callbackmethods from the syncinterface +bool KABCore::sync(KSyncManager* manager, QString filename, int mode) { //pending prepare addresseeview for output //pending detect, if remote file has REV field. if not switch to external sync mGlobalSyncMode = SYNC_MODE_NORMAL; + QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); + AddressBook abLocal(filename,"syncContact"); bool syncOK = false; if ( abLocal.load() ) { qDebug("AB loaded %s,sync mode %d",filename.latin1(), mode ); bool external = false; bool isXML = false; if ( filename.right(4) == ".xml") { mGlobalSyncMode = SYNC_MODE_EXTERNAL; isXML = true; abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice ); } else { Addressee lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice ); @@ -2999,70 +2609,61 @@ bool KABCore::syncAB(QString filename, int mode) if ( KOPrefs::instance()->mWriteBackFile ) { storage->setSaveFormat( new ICalFormat( KOPrefs::instance()->mUseQuicksave) ); storage->save(); } } setModified(); } #endif } -void KABCore::confSync() -{ - static KSyncPrefsDialog* sp = 0; - if ( ! sp ) { - sp = new KSyncPrefsDialog( this, "syncprefs", true ); - } - sp->usrReadConfig(); -#ifndef DESKTOP_VERSION - sp->showMaximized(); -#else - sp->show(); -#endif - sp->exec(); - KABPrefs::instance()->mSyncProfileNames = sp->getSyncProfileNames(); - KABPrefs::instance()->mLocalMachineName = sp->getLocalMachineName (); - fillSyncMenu(); -} -void KABCore::syncSharp() -{ - if ( ! syncExternal("sharp") ) - qDebug("ERROR sync sharp ");; -} -bool KABCore::syncExternal(QString resource) + +//this is a overwritten callbackmethods from the syncinterface +bool KABCore::syncExternal(KSyncManager* manager, QString resource) { - if ( mModified ) - save(); - if ( KABPrefs::instance()->mAskForPreferences ) - edit_sync_options(); - qDebug("syncSharp() "); + QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); + AddressBook abLocal( resource,"syncContact"); bool syncOK = false; if ( abLocal.load() ) { qDebug("AB sharp loaded ,sync device %s",mCurrentSyncDevice.latin1()); mGlobalSyncMode = SYNC_MODE_EXTERNAL; abLocal.preExternSync( mAddressBook ,mCurrentSyncDevice ); + qDebug("KABCore::syncExternal: why do we acces here KABPrefs and not somehow KSyncProfile? "); syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, KABPrefs::instance()->mSyncAlgoPrefs ); if ( syncOK ) { if ( KABPrefs::instance()->mWriteBackFile ) { abLocal.saveAB(); abLocal.postExternSync( mAddressBook,mCurrentSyncDevice ); } } setModified(); } if ( syncOK ) mViewManager->refreshView(); return syncOK; } -void KABCore::syncPhone() + +//called by the syncmanager to indicate that the work has to marked as dirty. +void KABCore::sync_setModified() { - if ( mModified ) - save(); - qDebug("pending syncPhone(); "); - //mView->syncPhone(); setModified(); +} +//called by the syncmanager to ask if the dirty flag is set. +bool KABCore::sync_isModified() +{ + return mModified; } + + +//called by the syncmanager to indicate that the work has to be saved. +void KABCore::sync_save() +{ + save(); +} + + + diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h index e89bf41..ef61d6d 100644 --- a/kaddressbook/kabcore.h +++ b/kaddressbook/kabcore.h @@ -23,24 +23,25 @@ #ifndef KABCORE_H #define KABCORE_H #include <kabc/field.h> #ifndef KAB_EMBEDDED #endif //KAB_EMBEDDED #include <qdict.h> #include <qwidget.h> #include <qpopupmenu.h> +#include <ksyncmanager.h> namespace KABC { class AddressBook; } #ifndef KAB_EMBEDDED class KAboutData; class KConfig; class KAddressBookService; class LDAPSearchDialog; #else //KAB_EMBEDDED @@ -58,25 +59,25 @@ class KAction; class KActionCollection; class KToggleAction; class KSyncProfile; class QAction; class QMenuBar; class QSplitter; class ViewContainer; class ViewManager; class AddresseeEditorDialog; class Ir; -class KABCore : public QWidget +class KABCore : public QWidget, public KSyncInterface { Q_OBJECT public: KABCore( KAddressBookMain *client, bool readWrite, QWidget *parent, const char *name = 0 ); ~KABCore(); #ifdef KAB_EMBEDDED //US added functionality @@ -332,25 +333,25 @@ class KABCore : public QWidget void addGUIClient( KXMLGUIClient *client ); void requestForNameEmailUidList(const QString& sourceChannel, const QString& sessionuid); void requestForDetails(const QString& sourceChannel, const QString& sessionuid, const QString& name, const QString& email, const QString& uid); signals: void contactSelected( const QString &name ); void contactSelected( const QPixmap &pixmap ); public slots: void setDetailsVisible( bool visible ); void setDetailsToState(); - void slotSyncMenu( int ); + // void slotSyncMenu( int ); private slots: void setJumpButtonBarVisible( bool visible ); void importFromOL(); void extensionModified( const KABC::Addressee::List &list ); void extensionChanged( int id ); void clipboardDataChanged(); void updateActionMenu(); void configureKeyBindings(); void removeVoice(); #ifdef KAB_EMBEDDED void configureResources(); #endif //KAB_EMBEDDED @@ -438,48 +439,43 @@ class KABCore : public QWidget QPopupMenu *ImportMenu; QPopupMenu *ExportMenu; //LR additional methods KAction *mActionRemoveVoice; KAction * mActionImportOL; #ifndef KAB_EMBEDDED KAddressBookService *mAddressBookService; #endif //KAB_EMBEDDED class KABCorePrivate; KABCorePrivate *d; - bool mBlockSaveFlag; + //US bool mBlockSaveFlag; #ifdef KAB_EMBEDDED KAddressBookMain *mMainWindow; // should be the same like mGUIClient #endif //KAB_EMBEDDED + + //this are the overwritten callbackmethods from the syncinterface + virtual bool sync(KSyncManager* manager, QString filename, int mode); + virtual bool syncExternal(KSyncManager* manager, QString resource); + + //called by the syncmanager to indicate that the work has to marked as dirty. + virtual void sync_setModified(); + //called by the syncmanager to ask if the dirty flag is set. + virtual bool KABCore::sync_isModified(); + //called by the syncmanager to indicate that the work has to be saved. + virtual void sync_save(); + // LR ******************************* // sync stuff! QPopupMenu *syncMenu; - void fillSyncMenu(); - QString mCurrentSyncDevice; - QString mCurrentSyncName; - void quickSyncLocalFile(); - bool syncWithFile( QString fn , bool quick ); - void syncLocalFile(); - void syncPhone(); - void syncSharp(); - bool syncExternal(QString); - void multiSync( bool askforPrefs ); - int mCurrentSyncProfile ; - void syncRemote( KSyncProfile* prof, bool ask = true); - void edit_sync_options(); - bool syncAB(QString filename, int mode); - int ringSync(); - QString getPassword( ); + KSyncManager* syncManager; int mGlobalSyncMode; bool synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode); KABC::Addressee getLastSyncAddressee(); QDateTime mLastAddressbookSync; int takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full ); - public slots: - void confSync(); // ********************* }; #endif diff --git a/kaddressbook/kabprefs.h b/kaddressbook/kabprefs.h index 9926aa0..e4f359c 100644 --- a/kaddressbook/kabprefs.h +++ b/kaddressbook/kabprefs.h @@ -73,36 +73,20 @@ class KABPrefs : public KPimPrefs // Extensions stuff int mCurrentExtension; QStringList mActiveExtensions; // Views stuff QString mCurrentView; QStringList mViewNames; // Filter int mCurrentFilter; void setCategoryDefaults(); - // sync stuff - QString mLocalMachineName; - QStringList mExternSyncProfiles; - QStringList mSyncProfileNames; - bool mAskForPreferences; - bool mShowSyncSummary; - bool mShowSyncEvents; - bool mShowTodoInAgenda; - bool mWriteBackExistingOnly; - int mSyncAlgoPrefs; - int mRingSyncAlgoPrefs; - bool mWriteBackFile; - int mWriteBackInFuture; - QString mPhoneDevice; - QString mPhoneConnection; - QString mPhoneModel; - QString mLastSyncedLocalFile; // save! + private: KABPrefs(); static KABPrefs *sInstance; }; #endif diff --git a/libkdepim/kpimprefs.h b/libkdepim/kpimprefs.h index 860665b..01c57a3 100644 --- a/libkdepim/kpimprefs.h +++ b/libkdepim/kpimprefs.h @@ -47,18 +47,39 @@ class KPimPrefs : public KPrefs void usrSetDefaults(); /** Read preferences from config file */ void usrReadConfig(); /** Write preferences to config file */ void usrWriteConfig(); public: QStringList mCustomCategories; + // sync stuff + QString mLocalMachineName; + QStringList mExternSyncProfiles; + QStringList mSyncProfileNames; + bool mAskForPreferences; + bool mShowSyncSummary; + bool mShowSyncEvents; + bool mShowTodoInAgenda; + bool mWriteBackExistingOnly; + int mSyncAlgoPrefs; + int mRingSyncAlgoPrefs; + bool mWriteBackFile; + int mWriteBackInFuture; + QString mPhoneDevice; + QString mPhoneConnection; + QString mPhoneModel; + QString mLastSyncedLocalFile; // save! + protected: virtual void setCategoryDefaults(); + + + }; #endif diff --git a/libkdepim/ksyncmanager.cpp b/libkdepim/ksyncmanager.cpp index 52e3bd9..87f200a 100644 --- a/libkdepim/ksyncmanager.cpp +++ b/libkdepim/ksyncmanager.cpp @@ -13,401 +13,423 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // $Id$ #include "ksyncmanager.h" +#include <stdlib.h> -KSyncManager::KSyncManager(TargetApp ta, QPopupMenu* syncmenu) - : mSyncMenu(syncmenu), mTargetApp(ta) +#ifndef _WIN32_ +#include <unistd.h> +#endif + + +#include "ksyncprofile.h" +#include "ksyncprefsdialog.h" +#include "kpimprefs.h" + +#include <qdir.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) { } KSyncManager::~KSyncManager() { } -void KABCore::fillSyncMenu() +void KSyncManager::fillSyncMenu() { if ( mSyncMenu->count() ) - msyncMenu->clear(); + 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"); - //US KABPrefs::instance()->mLocalMachineName = config.readEntry("LocalMachineName","undefined"); + mPrefs->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 (); 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; } - /*US - KABPrefs::instance()->mExternSyncProfiles = config.readListEntry("ExternSyncProfiles"); - KABPrefs::instance()->mSyncProfileNames = prof; - */ - int i; + 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 ); } //probaly useless //mView->setupExternSyncProfiles(); } -void KABCore::slotSyncMenu( int action ) + +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 // 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 (mBlockSaveFlag) + if (blockSave()) return; - mBlockSaveFlag = true; + + setBlockSave(true); + mCurrentSyncProfile = action - 1000 ; - //US mCurrentSyncDevice = KABPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile] ; - //US mCurrentSyncName = KABPrefs::instance()->mLocalMachineName ; + mCurrentSyncDevice = mPrefs->mSyncProfileNames[mCurrentSyncProfile] ; + mCurrentSyncName = mPrefs->mLocalMachineName ; KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); KSyncProfile* temp = new KSyncProfile (); - //US temp->setName(KABPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]); + temp->setName(mPrefs->mSyncProfileNames[mCurrentSyncProfile]); temp->readConfig(&config); - /*US - KABPrefs::instance()->mAskForPreferences = temp->getAskForPreferences(); - KABPrefs::instance()->mSyncAlgoPrefs = temp->getSyncPrefs(); - KABPrefs::instance()->mWriteBackFile = temp->getWriteBackFile(); - KABPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting(); - KABPrefs::instance()->mWriteBackInFuture = 0; + mPrefs->mAskForPreferences = temp->getAskForPreferences(); + mPrefs->mSyncAlgoPrefs = temp->getSyncPrefs(); + mPrefs->mWriteBackFile = temp->getWriteBackFile(); + mPrefs->mWriteBackExistingOnly = temp->getWriteBackExisting(); + mPrefs->mWriteBackInFuture = 0; if ( temp->getWriteBackFuture() ) - KABPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); - KABPrefs::instance()->mShowSyncSummary = temp->getShowSummaryAfterSync(); - */ + mPrefs->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); + 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() ) { - /*US if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) - KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); - */ + if ( syncWithFile( temp->getRemoteFileNameAB( ), false ) ) + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); + } else { if ( temp->getIsPhoneSync() ) { - /* - KABPrefs::instance()->mPhoneDevice = temp->getPhoneDevice( ) ; - KABPrefs::instance()->mPhoneConnection = temp->getPhoneConnection( ); - KABPrefs::instance()->mPhoneModel = temp->getPhoneModel( ); - */ + mPrefs->mPhoneDevice = temp->getPhoneDevice( ) ; + mPrefs->mPhoneConnection = temp->getPhoneConnection( ); + mPrefs->mPhoneModel = temp->getPhoneModel( ); syncPhone(); } else syncRemote( temp ); } } delete temp; - mBlockSaveFlag = false; + setBlockSave(false); } -void KABCore::syncLocalFile() +void KSyncManager::syncLocalFile() { - QString fn =KABPrefs::instance()->mLastSyncedLocalFile; + QString fn =mPrefs->mLastSyncedLocalFile; - fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename(*.ics/*.vcs)"), this ); + fn =KFileDialog:: getOpenFileName( fn, i18n("Sync filename(*.ics/*.vcs)"), mParent ); if ( fn == "" ) return; if ( syncWithFile( fn, false ) ) { qDebug("syncLocalFile() successful "); } } -bool KABCore::syncWithFile( QString fn , bool quick ) +bool KSyncManager::syncWithFile( QString fn , bool quick ) { bool ret = false; QFileInfo info; info.setFile( fn ); QString mess; bool loadbup = true; if ( !info. exists() ) { mess = i18n( "Sync file \n...%1\ndoes not exist!\nNothing synced!\n").arg(fn.right( 30) ); - int result = QMessageBox::warning( this, i18n("Warning!"), + int result = QMessageBox::warning( mParent, i18n("Warning!"), mess ); return ret; } int result = 0; if ( !quick ) { mess = i18n("Sync with file \n...%1\nfrom:\n%2\n").arg(fn.right( 25)).arg(KGlobal::locale()->formatDateTime(info.lastModified (), true, false )); - result = QMessageBox::warning( this, i18n("Warning!"), + result = QMessageBox::warning( mParent, i18n("Warning!"), mess, i18n("Sync"), i18n("Cancel"), 0, 0, 1 ); if ( result ) return false; } - if ( KABPrefs::instance()->mAskForPreferences ) + if ( mPrefs->mAskForPreferences ) edit_sync_options(); if ( result == 0 ) { //qDebug("Now sycing ... "); - if ( ret = syncAB( fn, KABPrefs::instance()->mSyncAlgoPrefs ) ) - setCaption( i18n("Synchronization successful") ); + if ( ret = mImplementation->sync( this, fn, mPrefs->mSyncAlgoPrefs ) ) + mParent->setCaption( i18n("Synchronization successful") ); else - setCaption( i18n("Sync cancelled or failed. Nothing synced.") ); + mParent->setCaption( i18n("Sync cancelled or failed. Nothing synced.") ); if ( ! quick ) - KABPrefs::instance()->mLastSyncedLocalFile = fn; - setModified(); + mPrefs->mLastSyncedLocalFile = fn; + mImplementation->sync_setModified(); } return ret; } -void KABCore::quickSyncLocalFile() +void KSyncManager::quickSyncLocalFile() { - if ( syncWithFile( KABPrefs::instance()->mLastSyncedLocalFile, false ) ) { + if ( syncWithFile( mPrefs->mLastSyncedLocalFile, false ) ) { qDebug("quick syncLocalFile() successful "); } } -void KABCore::multiSync( bool askforPrefs ) +void KSyncManager::multiSync( bool askforPrefs ) { - if (mBlockSaveFlag) + if (blockSave()) return; - mBlockSaveFlag = true; + setBlockSave(true); QString question = i18n("Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!"); - if ( QMessageBox::information( this, i18n("KO/Pi Sync"), + if ( QMessageBox::information( mParent, i18n("Sync"), question, i18n("Yes"), i18n("No"), 0, 0 ) != 0 ) { - mBlockSaveFlag = false; - setCaption(i18n("Aborted! Nothing synced!")); + setBlockSave(false); + mParent->setCaption(i18n("Aborted! Nothing synced!")); return; } mCurrentSyncDevice = i18n("Multiple profiles") ; - KABPrefs::instance()->mSyncAlgoPrefs = KABPrefs::instance()->mRingSyncAlgoPrefs; + mPrefs->mSyncAlgoPrefs = mPrefs->mRingSyncAlgoPrefs; if ( askforPrefs ) { edit_sync_options(); - KABPrefs::instance()->mRingSyncAlgoPrefs = KABPrefs::instance()->mSyncAlgoPrefs; + mPrefs->mRingSyncAlgoPrefs = mPrefs->mSyncAlgoPrefs; } - setCaption(i18n("Multiple sync started.") ); + mParent->setCaption(i18n("Multiple sync started.") ); qApp->processEvents(); int num = ringSync() ; if ( num > 1 ) ringSync(); - mBlockSaveFlag = false; + setBlockSave(false); if ( num ) - save(); + mImplementation->sync_save(); if ( num ) - setCaption(i18n("%1 profiles synced. Multiple sync completed!").arg(num) ); + mParent->setCaption(i18n("%1 profiles synced. Multiple sync completed!").arg(num) ); else - setCaption(i18n("Nothing synced! No profiles defined for multisync!")); + mParent->setCaption(i18n("Nothing synced! No profiles defined for multisync!")); return; } -int KABCore::ringSync() +int KSyncManager::ringSync() { int syncedProfiles = 0; - int i; + unsigned int i; QTime timer; KConfig config ( locateLocal( "config","ksyncprofilesrc" ) ); - QStringList syncProfileNames = KABPrefs::instance()->mSyncProfileNames; + QStringList syncProfileNames = mPrefs->mSyncProfileNames; KSyncProfile* temp = new KSyncProfile (); - KABPrefs::instance()->mAskForPreferences = false; + 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 )) { - setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... ")); + mParent->setCaption(i18n("Profile ")+syncProfileNames[mCurrentSyncProfile]+ i18n(" is synced ... ")); ++syncedProfiles; - // KABPrefs::instance()->mAskForPreferences = temp->getAskForPreferences(); - KABPrefs::instance()->mWriteBackFile = temp->getWriteBackFile(); - KABPrefs::instance()->mWriteBackExistingOnly = temp->getWriteBackExisting(); - KABPrefs::instance()->mWriteBackInFuture = 0; + // mPrefs->mAskForPreferences = temp->getAskForPreferences(); + mPrefs->mWriteBackFile = temp->getWriteBackFile(); + mPrefs->mWriteBackExistingOnly = temp->getWriteBackExisting(); + mPrefs->mWriteBackInFuture = 0; if ( temp->getWriteBackFuture() ) - KABPrefs::instance()->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); - KABPrefs::instance()->mShowSyncSummary = false; + mPrefs->mWriteBackInFuture = temp->getWriteBackFutureWeeks( ); + mPrefs->mShowSyncSummary = false; mCurrentSyncDevice = syncProfileNames[i] ; - mCurrentSyncName = KABPrefs::instance()->mLocalMachineName; + mCurrentSyncName = mPrefs->mLocalMachineName; if ( i == 0 ) { syncSharp(); } else { if ( temp->getIsLocalFileSync() ) { if ( syncWithFile( temp->getRemoteFileNameAB( ), true ) ) - KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); + mPrefs->mLastSyncedLocalFile = temp->getRemoteFileNameAB(); } else { if ( temp->getIsPhoneSync() ) { - KABPrefs::instance()->mPhoneDevice = temp->getPhoneDevice( ) ; - KABPrefs::instance()->mPhoneConnection = temp->getPhoneConnection( ); - KABPrefs::instance()->mPhoneModel = temp->getPhoneModel( ); + mPrefs->mPhoneDevice = temp->getPhoneDevice( ) ; + mPrefs->mPhoneConnection = temp->getPhoneConnection( ); + mPrefs->mPhoneModel = temp->getPhoneModel( ); syncPhone(); } else syncRemote( temp, false ); } } timer.start(); - setCaption(i18n("Multiple sync in progress ... please wait!") ); + mParent->setCaption(i18n("Multiple sync in progress ... please wait!") ); while ( timer.elapsed () < 2000 ) { qApp->processEvents(); #ifndef _WIN32_ sleep (1); #endif } } } delete temp; return syncedProfiles; } -void KABCore::syncRemote( KSyncProfile* prof, bool ask) +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( this, i18n("KO/Pi Sync"), + if ( QMessageBox::information( mParent, i18n("Sync"), question, i18n("Yes"), i18n("No"), 0, 0 ) != 0 ) return; } QString command = prof->getPreSyncCommandAB(); int fi; if ( (fi = command.find("$PWD$")) > 0 ) { QString pwd = getPassword(); command = command.left( fi )+ pwd + command.mid( fi+5 ); } int maxlen = 30; if ( QApplication::desktop()->width() > 320 ) maxlen += 25; - setCaption ( i18n( "Copy remote file to local machine..." ) ); + mParent->setCaption ( i18n( "Copy remote file to local machine..." ) ); int fileSize = 0; int result = system ( command ); // 0 : okay // 256: no such file or dir // qDebug("KO: Remote copy result(0 = okay): %d ",result ); if ( result != 0 ) { - int len = maxlen; + unsigned int len = maxlen; while ( len < command.length() ) { command.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) ; - QMessageBox::information( this, i18n("KO/Pi Sync - ERROR"), + QMessageBox::information( mParent, i18n("Sync - ERROR"), question, i18n("Okay!")) ; - setCaption ("KO/Pi"); + mParent->setCaption (""); return; } - setCaption ( i18n( "Copying succeed." ) ); + mParent->setCaption ( i18n( "Copying succeed." ) ); //qDebug(" file **%s** ",prof->getLocalTempFile().latin1() ); if ( syncWithFile( prof->getLocalTempFileAB(), true ) ) { // Event* e = mView->getLastSyncEvent(); // e->setReadOnly( false ); // e->setLocation( KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]); // e->setReadOnly( true ); - if ( KABPrefs::instance()->mWriteBackFile ) { + if ( mPrefs->mWriteBackFile ) { command = prof->getPostSyncCommandAB(); int fi; if ( (fi = command.find("$PWD$")) > 0 ) { QString pwd = getPassword(); command = command.left( fi )+ pwd + command.mid( fi+5 ); } - setCaption ( i18n( "Writing back file ..." ) ); + mParent->setCaption ( i18n( "Writing back file ..." ) ); result = system ( command ); - qDebug("KO: Writing back file result: %d ", result); + qDebug("Writing back file result: %d ", result); if ( result != 0 ) { - setCaption ( i18n( "Writing back file result: " )+QString::number( result ) ); + mParent->setCaption ( i18n( "Writing back file result: " )+QString::number( result ) ); return; } else { - setCaption ( i18n( "Syncronization sucessfully completed" ) ); + mParent->setCaption ( i18n( "Syncronization sucessfully completed" ) ); } } } return; } -#include <qpushbutton.h> -#include <qradiobutton.h> -#include <qbuttongroup.h> -void KABCore::edit_sync_options() + +void KSyncManager::edit_sync_options() { //mDialogManager->showSyncOptions(); - //KABPrefs::instance()->mSyncAlgoPrefs - QDialog dia( this, "dia", true ); + //mPrefs->mSyncAlgoPrefs + QDialog dia( mParent, "dia", true ); dia.setCaption( i18n("Device: " ) +mCurrentSyncDevice ); QButtonGroup gr ( 1, Qt::Horizontal, i18n("Sync preferences"), &dia); QVBoxLayout lay ( &dia ); lay.setSpacing( 2 ); lay.setMargin( 3 ); lay.addWidget(&gr); QRadioButton loc ( i18n("Take local entry on conflict"), &gr ); QRadioButton rem ( i18n("Take remote entry on conflict"), &gr ); QRadioButton newest( i18n("Take newest entry on conflict"), &gr ); QRadioButton ask( i18n("Ask for every entry on conflict"), &gr ); QRadioButton f_loc( i18n("Force: Take local entry always"), &gr ); QRadioButton f_rem( i18n("Force: Take remote entry always"), &gr ); //QRadioButton both( i18n("Take both on conflict"), &gr ); QPushButton pb ( "OK", &dia); lay.addWidget( &pb ); connect(&pb, SIGNAL( clicked() ), &dia, SLOT ( accept() ) ); - switch ( KABPrefs::instance()->mSyncAlgoPrefs ) { + switch ( mPrefs->mSyncAlgoPrefs ) { case 0: loc.setChecked( true); break; case 1: rem.setChecked( true ); break; case 2: newest.setChecked( true); break; case 3: ask.setChecked( true); break; @@ -415,41 +437,93 @@ void KABCore::edit_sync_options() f_loc.setChecked( true); break; case 5: f_rem.setChecked( true); break; case 6: // both.setChecked( true); break; default: break; } if ( dia.exec() ) { - KABPrefs::instance()->mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ; + mPrefs->mSyncAlgoPrefs = rem.isChecked()*1+newest.isChecked()*2+ ask.isChecked()*3+ f_loc.isChecked()*4+ f_rem.isChecked()*5;//+ both.isChecked()*6 ; } } -QString KABCore::getPassword( ) +QString KSyncManager::getPassword( ) { QString retfile = ""; - QDialog dia ( this, "input-dialog", true ); + QDialog dia ( mParent, "input-dialog", true ); QLineEdit lab ( &dia ); lab.setEchoMode( QLineEdit::Password ); QVBoxLayout lay( &dia ); lay.setMargin(7); lay.setSpacing(7); lay.addWidget( &lab); dia.setFixedSize( 230,50 ); dia.setCaption( i18n("Enter password") ); 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(); dia.hide(); qApp->processEvents(); return retfile; } + + +void KSyncManager::confSync() +{ + static KSyncPrefsDialog* sp = 0; + if ( ! sp ) { + sp = new KSyncPrefsDialog( mParent, "syncprefs", true ); + } + sp->usrReadConfig(); +#ifndef DESKTOP_VERSION + sp->showMaximized(); +#else + sp->show(); +#endif + sp->exec(); + mPrefs->mSyncProfileNames = sp->getSyncProfileNames(); + mPrefs->mLocalMachineName = sp->getLocalMachineName (); + fillSyncMenu(); +} + +void KSyncManager::syncSharp() +{ + if ( ! syncExternalApplication("sharp") ) + qDebug("ERROR sync sharp ");; +} + +bool KSyncManager::syncExternalApplication(QString resource) +{ + if ( mImplementation->sync_isModified() ) + mImplementation->sync_save(); + + if ( mPrefs->mAskForPreferences ) + edit_sync_options(); + + qDebug("sync %s", resource.latin1()); + + bool syncOK = mImplementation->syncExternal(this, resource); + + return syncOK; + +} + +void KSyncManager::syncPhone() +{ + if ( mImplementation->sync_isModified() ) + mImplementation->sync_save(); + + qDebug("pending syncPhone(); "); + //mView->syncPhone(); + mImplementation->sync_setModified(); + +} diff --git a/libkdepim/ksyncmanager.h b/libkdepim/ksyncmanager.h index d7c2a02..389a005 100644 --- a/libkdepim/ksyncmanager.h +++ b/libkdepim/ksyncmanager.h @@ -13,56 +13,107 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. $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 KSyncManager +class KSyncManager : public QObject { + Q_OBJECT public: - KSyncManager(TargetApp ta, QPopupMenu* syncmenu); - ~KSyncManager() ; - enum TargetApp { KOPI = 0, KAPI = 1, PWMPI = 2 }; - private: + + KSyncManager(QWidget* parent, KSyncInterface* implementation, TargetApp ta, KPimPrefs* prefs, QPopupMenu* syncmenu); + ~KSyncManager() ; + + bool blockSave() { return mBlockSaveFlag; } + void setBlockSave(bool sa) { mBlockSaveFlag = sa; } + void fillSyncMenu(); - void syncLocalFile(); - bool syncWithFile( QString fn , bool quick ); + + QString getCurrentSyncDevice() { return mCurrentSyncDevice; } + QString getCurrentSyncName() { return mCurrentSyncName; } + + 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(); + void syncSharp(); + bool syncExternalApplication(QString); void multiSync( bool askforPrefs ); - int ringSync(); - void syncRemote( KSyncProfile* prof, bool ask); + int mCurrentSyncProfile ; + void syncRemote( KSyncProfile* prof, bool ask = true); void edit_sync_options(); + int ringSync(); QString getPassword(); + private slots: + void confSync(); + // ********************* + private: - QPopupMenu* mSyncMenu; + bool mBlockSaveFlag; + + + QWidget* mParent; + KSyncInterface* mImplementation; TargetApp mTargetApp; + KPimPrefs* mPrefs; + QPopupMenu* mSyncMenu; + +}; + + +class KSyncInterface +{ + public: + virtual bool sync(KSyncManager* manager, QString filename, int mode) = 0; + virtual bool syncExternal(KSyncManager* manager, QString resource) = 0; + + //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; }; + #endif diff --git a/libkdepim/libkdepimE.pro b/libkdepim/libkdepimE.pro index 2a30ee8..156e247 100644 --- a/libkdepim/libkdepimE.pro +++ b/libkdepim/libkdepimE.pro @@ -16,38 +16,40 @@ HEADERS = \ categoryeditdialog.h \ categoryeditdialog_base.h \ categoryselectdialog.h \ categoryselectdialog_base.h \ externalapphandler.h \ kdateedit.h \ kdatepicker.h \ kinputdialog.h \ kpimprefs.h \ kpimglobalprefs.h \ kprefsdialog.h \ kprefswidget.h \ + ksyncmanager.h \ ksyncprofile.h \ ksyncprefsdialog.h \ kcmconfigs/kcmkdepimconfig.h \ kcmconfigs/kdepimconfigwidget.h SOURCES = \ categoryeditdialog.cpp \ categoryeditdialog_base.cpp \ categoryselectdialog.cpp \ categoryselectdialog_base.cpp \ externalapphandler.cpp \ kdateedit.cpp \ kinputdialog.cpp \ kdatepicker.cpp \ kpimprefs.cpp \ kpimglobalprefs.cpp \ kprefsdialog.cpp \ kprefswidget.cpp \ + ksyncmanager.cpp \ ksyncprofile.cpp \ ksyncprefsdialog.cpp \ kcmconfigs/kcmkdepimconfig.cpp \ kcmconfigs/kdepimconfigwidget.cpp |