summaryrefslogtreecommitdiffabout
path: root/kaddressbook
authorzautrix <zautrix>2004-09-18 13:13:58 (UTC)
committer zautrix <zautrix>2004-09-18 13:13:58 (UTC)
commitbb16660f29fc709791aa0ee4cb63a40710a994a8 (patch) (side-by-side diff)
tree5d7387987848039bb3594a624b819d136a38b0cd /kaddressbook
parent4ec7c78ebd2c5a79ff224e9b07d9a3164f7fe602 (diff)
downloadkdepimpi-bb16660f29fc709791aa0ee4cb63a40710a994a8.zip
kdepimpi-bb16660f29fc709791aa0ee4cb63a40710a994a8.tar.gz
kdepimpi-bb16660f29fc709791aa0ee4cb63a40710a994a8.tar.bz2
more AB syncing
Diffstat (limited to 'kaddressbook') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/kabcore.cpp93
-rw-r--r--kaddressbook/kabcore.h2
2 files changed, 60 insertions, 35 deletions
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index 1196360..53c63ff 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -2420,445 +2420,468 @@ void KABCore::syncRemote( KSyncProfile* prof, bool ask)
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;
+ //qDebug("CurrentSyncDevice %s ",mCurrentSyncDevice .latin1() );
+ lse = mAddressBook->findByUid( "last-syncAddressee-"+mCurrentSyncDevice );
+ if (lse.isEmpty()) {
+ lse.setUid( "last-syncEvent-"+mCurrentSyncDevice );
+ QString sum = "";
+ if ( KABPrefs::instance()->mExternSyncProfiles.contains( mCurrentSyncDevice ) )
+ sum = "E: ";
+ lse.setFamilyName(sum+mCurrentSyncDevice + i18n(" - sync event"));
+ lse.setRevision( mLastAddressbookSync );
+ lse.setCategories( i18n("SyncEvent") );
+ mAddressBook->insertAddressee( lse );
+ }
+ return lse;
+}
+
bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode)
{
-#if 0
bool syncOK = true;
int addedAddressee = 0;
int addedAddresseeR = 0;
int deletedAddresseeR = 0;
int deletedAddresseeL = 0;
int changedLocal = 0;
int changedRemote = 0;
//QPtrList<Addressee> el = local->rawAddressees();
- Addressee* addresseeR;
+ Addressee addresseeR;
QString uid;
int take;
- Addressee* addresseeL;
- Addressee* addresseeRSync;
- Addressee* addresseeLSync;
- QPtrList<Addressee> addresseeRSyncSharp = remote->getExternLastSyncAddressees();
- QPtrList<Addressee> addresseeLSyncSharp = local->getExternLastSyncAddressees();
+ Addressee addresseeL;
+ Addressee addresseeRSync;
+ Addressee addresseeLSync;
+ KABC::Addressee::List addresseeRSyncSharp = remote->getExternLastSyncAddressees();
+ KABC::Addressee::List addresseeLSyncSharp = local->getExternLastSyncAddressees();
bool fullDateRange = false;
local->resetTempSyncStat();
- mLastCalendarSync = QDateTime::currentDateTime();
- QDateTime modifiedCalendar = mLastCalendarSync;;
+ mLastAddressbookSync = QDateTime::currentDateTime();
+ QDateTime modifiedCalendar = mLastAddressbookSync;;
addresseeLSync = getLastSyncAddressee();
- addresseeR = remote->addressee("last-syncAddressee-"+mCurrentSyncName );
- if ( addresseeR ) {
- addresseeRSync = (Addressee*) addresseeR->clone();
- remote->deleteAddressee(addresseeR );
+ addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName );
+ if ( !addresseeR.isEmpty() ) {
+ addresseeRSync = addresseeR;
+ remote->removeAddressee(addresseeR );
} else {
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
- addresseeRSync = (Addressee*)addresseeLSync->clone();
+ addresseeRSync = addresseeLSync ;
} else {
fullDateRange = true;
- addresseeRSync = new Addressee();
- addresseeRSync->setSummary(mCurrentSyncName + i18n(" - sync addressee"));
- addresseeRSync->setUid("last-syncAddressee-"+mCurrentSyncName );
- addresseeRSync->setDtStart( mLastCalendarSync );
- addresseeRSync->setDtEnd( mLastCalendarSync.addSecs( 7200 ) );
- addresseeRSync->setCategories( i18n("SyncAddressee") );
+ Addressee newAdd;
+ addresseeRSync = newAdd;
+ addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee"));
+ addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName );
+ addresseeRSync.setRevision( mLastAddressbookSync );
+ addresseeRSync.setCategories( i18n("SyncAddressee") );
}
}
- if ( addresseeLSync->dtStart() == mLastCalendarSync )
+ if ( addresseeLSync.revision() == mLastAddressbookSync )
fullDateRange = true;
-
if ( ! fullDateRange ) {
- if ( addresseeLSync->dtStart() != addresseeRSync->dtStart() ) {
+ if ( addresseeLSync.revision() != addresseeRSync.revision() ) {
// qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() );
//qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec());
fullDateRange = true;
}
}
if ( fullDateRange )
- mLastCalendarSync = QDateTime::currentDateTime().addDays( -100*365);
+ mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365);
else
- mLastCalendarSync = addresseeLSync->dtStart();
+ mLastAddressbookSync = addresseeLSync.revision();
// for resyncing if own file has changed
+ // PENDING fixme later when implemented
+#if 0
if ( mCurrentSyncDevice == "deleteaftersync" ) {
- mLastCalendarSync = loadedFileVersion;
- qDebug("setting mLastCalendarSync ");
+ mLastAddressbookSync = loadedFileVersion;
+ qDebug("setting mLastAddressbookSync ");
}
+#endif
+
+ #if 0
//qDebug("*************************** ");
- qDebug("mLastCalendarSync %s ",mLastCalendarSync.toString().latin1() );
+ qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() );
QPtrList<Incidence> er = remote->rawIncidences();
Incidence* inR = er.first();
Incidence* inL;
QProgressBar bar( er.count(),0 );
bar.setCaption (i18n("Syncing - close to abort!") );
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 );
bar.show();
int modulo = (er.count()/10)+1;
int incCounter = 0;
while ( inR ) {
if ( ! bar.isVisible() )
return false;
if ( incCounter % modulo == 0 )
bar.setProgress( incCounter );
++incCounter;
uid = inR->uid();
bool skipIncidence = false;
if ( uid.left(15) == QString("last-syncAddressee-") )
skipIncidence = true;
QString idS;
qApp->processAddressees();
if ( !skipIncidence ) {
inL = local->incidence( uid );
if ( inL ) { // maybe conflict - same uid in both calendars
int maxrev = inL->revision();
if ( maxrev < inR->revision() )
maxrev = inR->revision();
if ( (take = takeAddressee( inL, inR, mode, fullDateRange )) > 0 ) {
//qDebug("take %d %s ", take, inL->summary().latin1());
if ( take == 3 )
return false;
if ( take == 1 ) {// take local
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL )
inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
else
idS = inR->IDStr();
remote->deleteIncidence( inR );
if ( inL->revision() < maxrev )
inL->setRevision( maxrev );
inR = inL->clone();
inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
if ( mGlobalSyncMode != SYNC_MODE_EXTERNAL )
inR->setIDStr( idS );
remote->addIncidence( inR );
++changedRemote;
} else {
if ( inR->revision() < maxrev )
inR->setRevision( maxrev );
idS = inL->IDStr();
local->deleteIncidence( inL );
inL = inR->clone();
inL->setIDStr( idS );
local->addIncidence( inL );
++changedLocal;
}
}
} else { // no conflict
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
QString des = addresseeLSync->description();
QString pref = "e";
if ( inR->type() == "Todo" )
pref = "t";
if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE );
//remote->deleteIncidence( inR );
++deletedAddresseeR;
} else {
inR->setLastModified( modifiedCalendar );
inL = inR->clone();
local->addIncidence( inL );
++addedAddressee;
}
} else {
- if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) {
+ if ( inR->lastModified() > mLastAddressbookSync || mode == 5 ) {
inR->setLastModified( modifiedCalendar );
local->addIncidence( inR->clone() );
++addedAddressee;
} else {
checkExternSyncAddressee(addresseeRSyncSharp, inR);
remote->deleteIncidence( inR );
++deletedAddresseeR;
}
}
}
}
inR = er.next();
}
QPtrList<Incidence> el = local->rawIncidences();
inL = el.first();
modulo = (el.count()/10)+1;
bar.setCaption (i18n("Add / remove addressees") );
bar.setTotalSteps ( el.count() ) ;
bar.show();
incCounter = 0;
while ( inL ) {
qApp->processAddressees();
if ( ! bar.isVisible() )
return false;
if ( incCounter % modulo == 0 )
bar.setProgress( incCounter );
++incCounter;
uid = inL->uid();
bool skipIncidence = false;
if ( uid.left(15) == QString("last-syncAddressee-") )
skipIncidence = true;
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" )
skipIncidence = true;
if ( !skipIncidence ) {
inR = remote->incidence( uid );
if ( ! inR ) {
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
checkExternSyncAddressee(addresseeLSyncSharp, inL);
local->deleteIncidence( inL );
++deletedAddresseeL;
} else {
if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
inL->removeID(mCurrentSyncDevice );
++addedAddresseeR;
//qDebug("remote added Incidence %s ", inL->summary().latin1());
inL->setLastModified( modifiedCalendar );
inR = inL->clone();
inR->setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
remote->addIncidence( inR );
}
}
} else {
- if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) {
+ if ( inL->lastModified() < mLastAddressbookSync && mode != 4 ) {
checkExternSyncAddressee(addresseeLSyncSharp, inL);
local->deleteIncidence( inL );
++deletedAddresseeL;
} else {
if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
++addedAddresseeR;
inL->setLastModified( modifiedCalendar );
remote->addIncidence( inL->clone() );
}
}
}
}
}
inL = el.next();
}
int delFut = 0;
if ( KOPrefs::instance()->mWriteBackInFuture ) {
er = remote->rawIncidences();
inR = er.first();
QDateTime dt;
QDateTime cur = QDateTime::currentDateTime();
QDateTime end = cur.addSecs( KOPrefs::instance()->mWriteBackInFuture * 3600 *24 *7 );
while ( inR ) {
if ( inR->type() == "Todo" ) {
Todo * t = (Todo*)inR;
if ( t->hasDueDate() )
dt = t->dtDue();
else
dt = cur.addSecs( 62 );
}
else if (inR->type() == "Addressee" ) {
bool ok;
dt = inR->getNextOccurence( cur, &ok );
if ( !ok )
dt = cur.addSecs( -62 );
}
else
dt = inR->dtStart();
if ( dt < cur || dt > end ) {
remote->deleteIncidence( inR );
++delFut;
}
inR = er.next();
}
}
bar.hide();
- mLastCalendarSync = QDateTime::currentDateTime().addSecs( 1 );
+ mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 );
addresseeLSync->setReadOnly( false );
- addresseeLSync->setDtStart( mLastCalendarSync );
- addresseeRSync->setDtStart( mLastCalendarSync );
- addresseeLSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
- addresseeRSync->setDtEnd( mLastCalendarSync.addSecs( 3600 ) );
+ addresseeLSync->setDtStart( mLastAddressbookSync );
+ addresseeRSync->setDtStart( mLastAddressbookSync );
+ addresseeLSync->setDtEnd( mLastAddressbookSync.addSecs( 3600 ) );
+ addresseeRSync->setDtEnd( mLastAddressbookSync.addSecs( 3600 ) );
addresseeRSync->setLocation( i18n("Remote from: ")+mCurrentSyncName ) ;
addresseeLSync->setLocation(i18n("Local from: ") + mCurrentSyncName );
addresseeLSync->setReadOnly( true );
if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
remote->addAddressee( addresseeRSync );
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 );
QString delmess;
if ( delFut ) {
delmess.sprintf( i18n("%d items skipped on remote,\nbecause they are in the past or\nmore than %d weeks in the future.\n"),delFut, KOPrefs::instance()->mWriteBackInFuture );
mes += delmess;
}
if ( KOPrefs::instance()->mShowSyncSummary ) {
KMessageBox::information(this, mes, i18n("KO/Pi Synchronization") );
}
qDebug( mes );
mCalendar->checkAlarmForIncidence( 0, true );
return syncOK;
#endif
return false;
}
bool KABCore::syncAB(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;
AddressBook abLocal(filename,"syncContact");
bool syncOK = false;
if ( abLocal.load() ) {
qDebug("AB loaded %s mode %d",filename.latin1(), mode );
AddressBook::Iterator it;
QStringList vcards;
for ( it = abLocal.begin(); it != abLocal.end(); ++it ) {
qDebug("Name %s ", (*it).familyName().latin1());
}
syncOK = synchronizeAddressbooks( mAddressBook, &abLocal, mode );
if ( syncOK ) {
if ( KABPrefs::instance()->mWriteBackFile )
{
qDebug("saving remote AB ");
abLocal.saveAB();
}
}
setModified();
}
if ( syncOK )
mViewManager->refreshView();
return syncOK;
#if 0
if ( storage->load(KOPrefs::instance()->mUseQuicksave) ) {
getEventViewerDialog()->setSyncMode( true );
syncOK = synchronizeCalendar( mCalendar, calendar, mode );
getEventViewerDialog()->setSyncMode( false );
if ( syncOK ) {
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 ( mModified )
save();
qDebug("pending syncSharp() ");
//mView->syncSharp();
setModified();
}
diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h
index 4487a8a..c67cee6 100644
--- a/kaddressbook/kabcore.h
+++ b/kaddressbook/kabcore.h
@@ -379,103 +379,105 @@ class KABCore : public QWidget
JumpButtonBar *mJumpButtonBar;
IncSearchWidget *mIncSearchWidget;
ExtensionManager *mExtensionManager;
KCMultiDialog *mConfigureDialog;
#ifndef KAB_EMBEDDED
LDAPSearchDialog *mLdapSearchDialog;
#endif //KAB_EMBEDDED
// QDict<AddresseeEditorDialog> mEditorDict;
AddresseeEditorDialog *mEditorDialog;
bool mReadWrite;
bool mModified;
bool mIsPart;
bool mMultipleViewsAtOnce;
//US file menu
KAction *mActionMail;
KAction *mActionBeam;
KAction* mActionPrint;
KAction* mActionNewContact;
KAction *mActionSave;
KAction *mActionEditAddressee;
KAction *mActionMailVCard;
KAction *mActionBeamVCard;
KAction *mActionQuit;
//US edit menu
KAction *mActionCopy;
KAction *mActionCut;
KAction *mActionPaste;
KAction *mActionSelectAll;
KAction *mActionUndo;
KAction *mActionRedo;
KAction *mActionDelete;
//US settings menu
KAction *mActionConfigResources;
KAction *mActionConfigKAddressbook;
KAction *mActionConfigShortcuts;
KAction *mActionConfigureToolbars;
KAction *mActionKeyBindings;
KToggleAction *mActionJumpBar;
KToggleAction *mActionDetails;
KAction *mActionWhoAmI;
KAction *mActionCategories;
KAction *mActionAboutKAddressbook;
KAction *mActionLicence;
KAction *mActionFaq;
KAction *mActionDeleteView;
QPopupMenu *viewMenu;
QPopupMenu *filterMenu;
QPopupMenu *settingsMenu;
QPopupMenu *changeMenu;
//US QAction *mActionSave;
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;
#ifdef KAB_EMBEDDED
KAddressBookMain *mMainWindow; // should be the same like mGUIClient
#endif //KAB_EMBEDDED
// LR *******************************
// sync stuff!
QPopupMenu *syncMenu;
void fillSyncMenu();
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( );
int mGlobalSyncMode;
bool synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBook* remote,int mode);
+ KABC::Addressee getLastSyncAddressee();
+ QDateTime mLastAddressbookSync;
public slots:
void confSync();
// *********************
};
#endif