summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/kabcore.cpp460
-rw-r--r--kaddressbook/kabcore.h24
-rw-r--r--kaddressbook/kabprefs.h18
3 files changed, 496 insertions, 6 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index 32dd43a..49c3b19 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -32,6 +32,7 @@ $Id$
#include <stdaddressbook.h>
#include <klocale.h>
+#include <kfiledialog.h>
#ifndef KAB_EMBEDDED
#include <qclipboard.h>
@@ -142,7 +143,12 @@ $Id$
#ifdef _WIN32_
#include "kaimportoldialog.h"
+#else
+#include <unistd.h>
#endif
+// sync includes
+#include <libkdepim/ksyncprofile.h>
+
bool pasteWithNewUid = true;
@@ -159,6 +165,7 @@ KABCore::KABCore( KXMLGUIClient *client, bool readWrite, QWidget *parent, const
#endif //KAB_EMBEDDED
{
+ mBlockSaveFlag = false;
mExtensionBarSplitter = 0;
mIsPart = !parent->inherits( "KAddressBookMain" );
@@ -1061,6 +1068,9 @@ void KABCore::executeContact( const QString &uid /*US = QString::null*/ )
void KABCore::save()
{
+ if (mBlockSaveFlag)
+ return;
+ mBlockSaveFlag = true;
if ( !mModified )
return;
QString text = i18n( "There was an error while attempting to save\n the "
@@ -1081,6 +1091,7 @@ void KABCore::save()
statusMessage(i18n("Addressbook saved!"));
setModified( false );
+ mBlockSaveFlag = false;
}
void KABCore::statusMessage(QString mess , int time )
@@ -1436,7 +1447,7 @@ void KABCore::initGUI()
//filterMenu = new QPopupMenu( this );
ImportMenu = new QPopupMenu( this );
ExportMenu = new QPopupMenu( this );
-
+ syncMenu = new QPopupMenu( this );
changeMenu= new QPopupMenu( this );
//US since we have no splitter for the embedded system, setup
@@ -1754,6 +1765,7 @@ void KABCore::addActionsManually()
mb->insertItem( "&Edit", editMenu );
mb->insertItem( "&View", viewMenu );
mb->insertItem( "&Settings", settingsMenu );
+ mb->insertItem( i18n("Synchronize"), syncMenu );
mb->insertItem( "&Change selected", changeMenu );
mb->insertItem( "&Help", helpMenu );
mIncSearchWidget = new IncSearchWidget( tb );
@@ -1772,6 +1784,7 @@ void KABCore::addActionsManually()
popupBarTB->insertItem( "&Edit", editMenu );
popupBarTB->insertItem( "&View", viewMenu );
popupBarTB->insertItem( "&Settings", settingsMenu );
+ popupBarTB->insertItem( i18n("Synchronize"), syncMenu );
mViewManager->getFilterAction()->plug ( popupBarTB);
popupBarTB->insertItem( "&Change selected", changeMenu );
popupBarTB->insertItem( "&Help", helpMenu );
@@ -1883,6 +1896,10 @@ void KABCore::addActionsManually()
*/
#endif //KAB_EMBEDDED
+
+ connect ( syncMenu, SIGNAL( activated ( int ) ), this, SLOT (slotSyncMenu( int ) ) );
+ fillSyncMenu();
+
}
void KABCore::showLicence()
{
@@ -2084,8 +2101,443 @@ void KABCore::faq()
}
+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();
-#ifndef KAB_EMBEDDED
-#include "kabcore.moc"
-#endif //KAB_EMBEDDED
+ 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->getRemoteFileName( ), false ) )
+ KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileName();
+ } 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->getIncludeInRingSync() && ( 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->getRemoteFileName( ), true ) )
+ KABPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileName();
+ } 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->getPreSyncCommand();
+ 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->getLocalTempFile(), true ) ) {
+// Event* e = mView->getLastSyncEvent();
+// e->setReadOnly( false );
+// e->setLocation( KOPrefs::instance()->mSyncProfileNames[mCurrentSyncProfile]);
+// e->setReadOnly( true );
+ if ( KABPrefs::instance()->mWriteBackFile ) {
+ command = prof->getPostSyncCommand();
+ 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;
+
+}
+
+bool KABCore::syncAB(QString filename, int mode)
+{
+
+}
+
+
+void KABCore::confSync()
+{
+ //mView->confSync();
+ qDebug("pending KABCore::confSync() ");
+ fillSyncMenu();
+}
+void KABCore::syncSharp()
+{
+ if ( mModified )
+ save();
+ qDebug("pending syncSharp() ");
+ //mView->syncSharp();
+ mModified = true ;
+
+}
+void KABCore::syncPhone()
+{
+ if ( mModified )
+ save();
+ qDebug("pending syncPhone(); ");
+ //mView->syncPhone();
+ setModified();
+
+}
diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h
index 39d043f..10ce8f4 100644
--- a/kaddressbook/kabcore.h
+++ b/kaddressbook/kabcore.h
@@ -57,6 +57,7 @@ class KDGanttMinimizeSplitter;
class KAction;
class KActionCollection;
class KToggleAction;
+class KSyncProfile;
class QAction;
class QMenuBar;
@@ -340,6 +341,7 @@ class KABCore : public QWidget
public slots:
void setDetailsVisible( bool visible );
void setDetailsToState();
+ void slotSyncMenu( int );
private slots:
void setJumpButtonBarVisible( bool visible );
void importFromOL();
@@ -432,7 +434,6 @@ class KABCore : public QWidget
QPopupMenu *filterMenu;
QPopupMenu *settingsMenu;
QPopupMenu *changeMenu;
-
//US QAction *mActionSave;
QPopupMenu *ImportMenu;
QPopupMenu *ExportMenu;
@@ -446,10 +447,31 @@ class KABCore : public QWidget
class KABCorePrivate;
KABCorePrivate *d;
+ bool mBlockSaveFlag;
#ifdef KAB_EMBEDDED
KAddressBookMain *mMainWindow; // should be the same like mGUIClient
#endif //KAB_EMBEDDED
+ // LR *******************************
+ // sync stuff!
+ QPopupMenu *syncMenu;
+ void fillSyncMenu();
+ void confSync();
+ QString mCurrentSyncDevice;
+ QString mCurrentSyncName;
+ void quickSyncLocalFile();
+ bool syncWithFile( QString fn , bool quick );
+ void KABCore::syncLocalFile();
+ void KABCore::syncPhone();
+ void KABCore::syncSharp();
+ 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( );
+ // *********************
};
diff --git a/kaddressbook/kabprefs.h b/kaddressbook/kabprefs.h
index e4f359c..9926aa0 100644
--- a/kaddressbook/kabprefs.h
+++ b/kaddressbook/kabprefs.h
@@ -82,7 +82,23 @@ class KABPrefs : public KPimPrefs
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();