summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressbook.cpp5
-rw-r--r--kabc/addressbook.h2
-rw-r--r--kabc/addressee.cpp1
-rw-r--r--kaddressbook/kabcore.cpp200
-rw-r--r--kaddressbook/kabcore.h1
5 files changed, 171 insertions, 38 deletions
diff --git a/kabc/addressbook.cpp b/kabc/addressbook.cpp
index 6e8d027..3ec0795 100644
--- a/kabc/addressbook.cpp
+++ b/kabc/addressbook.cpp
@@ -436,40 +436,41 @@ Ticket *AddressBook::requestSaveTicket( Resource *resource )
for ( it = d->mManager->activeBegin(); it != d->mManager->activeEnd(); ++it ) {
if ( (*it) == resource ) {
if ( (*it)->readOnly() || !(*it)->isOpen() )
return 0;
else
return (*it)->requestSaveTicket();
}
}
return 0;
}
-void AddressBook::insertAddressee( const Addressee &a )
+void AddressBook::insertAddressee( const Addressee &a, bool setRev )
{
Addressee::List::Iterator it;
for ( it = d->mAddressees.begin(); it != d->mAddressees.end(); ++it ) {
if ( a.uid() == (*it).uid() ) {
bool changed = false;
Addressee addr = a;
if ( addr != (*it) )
changed = true;
(*it) = a;
if ( (*it).resource() == 0 )
(*it).setResource( standardResource() );
if ( changed ) {
- (*it).setRevision( QDateTime::currentDateTime() );
+ if ( setRev )
+ (*it).setRevision( QDateTime::currentDateTime() );
(*it).setChanged( true );
}
return;
}
}
d->mAddressees.append( a );
Addressee& addr = d->mAddressees.last();
if ( addr.resource() == 0 )
addr.setResource( standardResource() );
addr.setChanged( true );
diff --git a/kabc/addressbook.h b/kabc/addressbook.h
index 650a638..253de68 100644
--- a/kabc/addressbook.h
+++ b/kabc/addressbook.h
@@ -164,25 +164,25 @@ class AddressBook : public QObject
ConstIterator end() const;
/**
Removes all entries from address book.
*/
void clear();
/**
Insert an Addressee object into address book. If an object with the same
unique id already exists in the address book it it replaced by the new
one. If not the new object is appended to the address book.
*/
- void insertAddressee( const Addressee & );
+ void insertAddressee( const Addressee &, bool setRev = true );
/**
Removes entry from the address book.
*/
void removeAddressee( const Addressee & );
/**
This is like @ref removeAddressee() just above, with the difference that
the first element is a iterator, returned by @ref begin().
*/
void removeAddressee( const Iterator & );
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index fb32f6e..7f04d8f 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -84,24 +84,25 @@ struct Addressee::AddresseeData : public KShared
bool empty :1;
bool changed :1;
};
Addressee::Addressee()
{
mData = new AddresseeData;
mData->empty = true;
mData->changed = false;
mData->resource = 0;
mData->mExternalId = ":";
+ mData->revision = QDateTime ( QDate( 2004,1,1));
mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
}
Addressee::~Addressee()
{
}
Addressee::Addressee( const Addressee &a )
{
mData = a.mData;
mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
}
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp
index f497541..226d5e4 100644
--- a/kaddressbook/kabcore.cpp
+++ b/kaddressbook/kabcore.cpp
@@ -2514,85 +2514,224 @@ QString KABCore::getPassword( )
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 );
+ qDebug("Creating new last-syncAddressee ");
+ lse.setUid( "last-syncAddressee-"+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;
}
-
+int KABCore::takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full )
+{
+
+ //void setZaurusId(int id);
+ // 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;
+ if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
+ bool remCh, locCh;
+ remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
+ //if ( remCh )
+ //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
+ locCh = ( local->revision() > mLastAddressbookSync );
+ if ( !remCh && ! locCh ) {
+ //qDebug("both not changed ");
+ lastSync = local->revision().addDays(1);
+ } else {
+ if ( locCh ) {
+ //qDebug("loc changed %d %s %s", local->revision() , local->lastModified().toString().latin1(), mLastCalendarSync.toString().latin1());
+ lastSync = local->revision().addDays( -1 );
+ if ( !remCh )
+ remote->setRevision( lastSync.addDays( -1 ) );
+ } else {
+ //qDebug(" not loc changed ");
+ lastSync = local->revision().addDays( 1 );
+ if ( remCh )
+ remote->setRevision( lastSync.addDays( 1 ) );
+
+ }
+ }
+ full = true;
+ if ( mode < SYNC_PREF_ASK )
+ mode = SYNC_PREF_ASK;
+ } else {
+ if ( local->revision() == remote->revision() )
+ return 0;
+
+ }
+ // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() );
+
+ //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , local->revision(), remote->lastModified().toString().latin1(), remote->revision());
+ //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() );
+ //full = true; //debug only
+ if ( full ) {
+ bool equ = ( (*local) == (*remote) );
+ if ( equ ) {
+ //qDebug("equal ");
+ if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
+ local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
+ }
+ if ( mode < SYNC_PREF_FORCE_LOCAL )
+ return 0;
+
+ }//else //debug only
+ //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
+ }
+ int result;
+ bool localIsNew;
+ //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() );
+
+ if ( full && mode < SYNC_PREF_NEWEST )
+ mode = SYNC_PREF_ASK;
+
+ switch( mode ) {
+ case SYNC_PREF_LOCAL:
+ if ( lastSync > remote->revision() )
+ return 1;
+ if ( lastSync > local->revision() )
+ return 2;
+ return 1;
+ break;
+ case SYNC_PREF_REMOTE:
+ if ( lastSync > remote->revision() )
+ return 1;
+ if ( lastSync > local->revision() )
+ return 2;
+ return 2;
+ break;
+ case SYNC_PREF_NEWEST:
+ if ( local->revision() > remote->revision() )
+ return 1;
+ else
+ return 2;
+ break;
+ case SYNC_PREF_ASK:
+ qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->revision().toString().latin1(), remote->revision().toString().latin1() );
+ if ( lastSync > remote->revision() )
+ return 1;
+ if ( lastSync > local->revision() )
+ return 2;
+ //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), local->revision().toString().latin1(), remote->revision().toString().latin1() );
+ localIsNew = local->revision() >= remote->revision();
+#if 0
+ if ( localIsNew )
+ getEventViewerDialog()->setColorMode( 1 );
+ else
+ getEventViewerDialog()->setColorMode( 2 );
+ getEventViewerDialog()->setIncidence(local);
+ if ( localIsNew )
+ getEventViewerDialog()->setColorMode( 2 );
+ else
+ getEventViewerDialog()->setColorMode( 1 );
+ getEventViewerDialog()->addIncidence(remote);
+ getEventViewerDialog()->setColorMode( 0 );
+ //qDebug("local %d remote %d ",local->relatedTo(),remote->relatedTo() );
+ getEventViewerDialog()->setCaption( mCurrentSyncDevice +i18n(" : Conflict! Please choose entry!"));
+ getEventViewerDialog()->showMe();
+ result = getEventViewerDialog()->executeS( localIsNew );
+#endif
+ qDebug("conflict! ************************************** ");
+ result = 1;
+ return result;
+
+ break;
+ case SYNC_PREF_FORCE_LOCAL:
+ 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;
//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();
QDateTime modifiedCalendar = mLastAddressbookSync;;
addresseeLSync = getLastSyncAddressee();
+ qDebug("Last Sync %s ", addresseeLSync.revision().toString().latin1());
addresseeR = remote->findByUid("last-syncAddressee-"+mCurrentSyncName );
if ( !addresseeR.isEmpty() ) {
addresseeRSync = addresseeR;
remote->removeAddressee(addresseeR );
} else {
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
addresseeRSync = addresseeLSync ;
} else {
+ qDebug("FULLDATE 1");
fullDateRange = true;
Addressee newAdd;
addresseeRSync = newAdd;
addresseeRSync.setFamilyName(mCurrentSyncName + i18n(" - sync addressee"));
addresseeRSync.setUid("last-syncAddressee-"+mCurrentSyncName );
addresseeRSync.setRevision( mLastAddressbookSync );
addresseeRSync.setCategories( i18n("SyncAddressee") );
}
}
- if ( addresseeLSync.revision() == mLastAddressbookSync )
+ if ( addresseeLSync.revision() == mLastAddressbookSync ) {
+ qDebug("FULLDATE 2");
fullDateRange = true;
+ }
if ( ! fullDateRange ) {
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;
+ qDebug("FULLDATE 3 %s %s", addresseeLSync.revision().toString().latin1() , addresseeRSync.revision().toString().latin1() );
}
}
if ( fullDateRange )
mLastAddressbookSync = QDateTime::currentDateTime().addDays( -100*365);
else
mLastAddressbookSync = addresseeLSync.revision();
// for resyncing if own file has changed
// PENDING fixme later when implemented
#if 0
if ( mCurrentSyncDevice == "deleteaftersync" ) {
mLastAddressbookSync = loadedFileVersion;
qDebug("setting mLastAddressbookSync ");
@@ -2625,75 +2764,74 @@ bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBo
uid = er[ incCounter ];
bool skipIncidence = false;
if ( uid.left(20) == QString("last-syncAddressee-") )
skipIncidence = true;
QString idS;
qApp->processEvents();
if ( !skipIncidence ) {
inL = local->findByUid( uid );
inR = remote->findByUid( uid );
//inL.setResource( 0 );
//inR.setResource( 0 );
if ( !inL.isEmpty() ) { // maybe conflict - same uid in both calendars
- // pending if ( (take = takeAddressee( inL, inR, mode, fullDateRange )) > 0 ) {
- if ( true ) {
+ if ( take = takeAddressee( &inL, &inR, mode, fullDateRange ) ) {
//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) );
- local->insertAddressee( inL );
+ local->insertAddressee( inL, false );
}
else
idS = inR.IDStr();
remote->removeAddressee( inR );
inR = inL;
inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
if ( mGlobalSyncMode != SYNC_MODE_EXTERNAL )
inR.setIDStr( idS );
inR.setResource( 0 );
- remote->insertAddressee( inR );
+ remote->insertAddressee( inR , false);
++changedRemote;
} else {
idS = inL.IDStr();
local->removeAddressee( inL );
inL = inR;
inL.setIDStr( idS );
inL.setResource( 0 );
- local->insertAddressee( inL );
+ local->insertAddressee( inL , false );
++changedLocal;
}
}
} else { // no conflict
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
QString des = addresseeLSync.note();
QString pref = "a";
if ( des.find(pref+ inR.getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
inR.setTempSyncStat( SYNC_TEMPSTATE_DELETE );
++deletedAddresseeR;
} else {
inR.setRevision( modifiedCalendar );
- remote->insertAddressee( inR );
+ remote->insertAddressee( inR, false );
inL = inR;
inL.setResource( 0 );
- local->insertAddressee( inL );
+ local->insertAddressee( inL , false);
++addedAddressee;
}
} else {
if ( inR.revision() > mLastAddressbookSync || mode == 5 ) {
inR.setRevision( modifiedCalendar );
- remote->insertAddressee( inR );
+ remote->insertAddressee( inR, false );
inR.setResource( 0 );
- local->insertAddressee( inR );
+ local->insertAddressee( inR, false );
++addedAddressee;
} else {
// pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
remote->removeAddressee( inR );
++deletedAddresseeR;
}
}
}
}
++incCounter;
}
er.clear();
@@ -2722,96 +2860,88 @@ bool KABCore::synchronizeAddressbooks( KABC::AddressBook* local, KABC::AddressBo
if ( inR.isEmpty() ) {
if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
if ( !inL.getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
// pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
local->removeAddressee( inL );
++deletedAddresseeL;
} else {
if ( ! KABPrefs::instance()->mWriteBackExistingOnly ) {
inL.removeID(mCurrentSyncDevice );
++addedAddresseeR;
//qDebug("remote added Incidence %s ", inL.summary().latin1());
inL.setRevision( modifiedCalendar );
- local->insertAddressee( inL );
+ local->insertAddressee( inL, false );
inR = inL;
inR.setTempSyncStat( SYNC_TEMPSTATE_INITIAL );
inR.setResource( 0 );
- remote->insertAddressee( inR );
+ remote->insertAddressee( inR, false );
}
}
} else {
if ( inL.revision() < mLastAddressbookSync && mode != 4 ) {
// pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
local->removeAddressee( inL );
++deletedAddresseeL;
} else {
if ( ! KABPrefs::instance()->mWriteBackExistingOnly ) {
++addedAddresseeR;
inL.setRevision( modifiedCalendar );
- local->insertAddressee( inL );
+ local->insertAddressee( inL, false );
inR = inL;
inR.setResource( 0 );
- remote->insertAddressee( inR );
+ remote->insertAddressee( inR, false );
}
}
}
}
}
++incCounter;
}
el.clear();
- int delFut = 0;
- #if 0
+
bar.hide();
mLastAddressbookSync = QDateTime::currentDateTime().addSecs( 1 );
addresseeLSync.setRevision( mLastAddressbookSync );
addresseeRSync.setRevision( mLastAddressbookSync );
- addresseeRSync.setLocation( i18n("Remote from: ")+mCurrentSyncName ) ;
- addresseeLSync.setLocation(i18n("Local from: ") + mCurrentSyncName );
- addresseeLSync.setReadOnly( true );
+ addresseeRSync.setGivenName( i18n("Remote from: ")+mCurrentSyncName ) ;
+ addresseeLSync.setGivenName(i18n("Local from: ") + mCurrentSyncName );
if ( mGlobalSyncMode == SYNC_MODE_NORMAL)
- remote->addAddressee( addresseeRSync );
+ 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 );
- 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 ) {
+ if ( KABPrefs::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());
- }
+ //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 )
diff --git a/kaddressbook/kabcore.h b/kaddressbook/kabcore.h
index c67cee6..f01f306 100644
--- a/kaddressbook/kabcore.h
+++ b/kaddressbook/kabcore.h
@@ -465,19 +465,20 @@ class KABCore : public QWidget
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;
+ int takeAddressee( KABC::Addressee* local, KABC::Addressee* remote, int mode , bool full );
public slots:
void confSync();
// *********************
};
#endif