ksync Library API Documentation

ksyncer.cpp

00001 // $Id: ksyncer.cpp,v 1.2 2002/05/20 22:50:35 cschumac Exp $
00002 
00003 #include <qregexp.h>
00004 
00005 #include <kdebug.h>
00006 #include <ksimpleconfig.h>
00007 #include <kstddirs.h>
00008 
00009 #include "ksyncui.h"
00010 
00011 #include "ksyncer.h"
00012 
00013 KSyncEntry::KSyncEntry() :
00014   mSyncee(0)
00015 {
00016 }
00017 
00018 KSyncEntry::~KSyncEntry()
00019 {
00020 }
00021 
00022 void KSyncEntry::setSyncee(KSyncee *syncee)
00023 {
00024   mSyncee = syncee;
00025 }
00026 
00027 KSyncee *KSyncEntry::syncee()
00028 {
00029   return mSyncee;
00030 }
00031 
00032 
00033 KSyncee::KSyncee() :
00034   mStatusLog(0)
00035 {
00036 }
00037 
00038 KSyncee::~KSyncee()
00039 {
00040   delete mStatusLog;
00041 }
00042 
00043 void KSyncee::setFilename(const QString &filename)
00044 {
00045   mFilename = filename;
00046 }
00047 
00048 QString KSyncee::filename()
00049 {
00050   return mFilename;
00051 }
00052 
00053 KSyncEntry *KSyncee::findEntry(const QString &id)
00054 {
00055   kdDebug() << "KSyncee::findEntry() '" << id << "'" << endl;
00056 
00057   KSyncEntry *entry = firstEntry();
00058   while (entry) {
00059     if (entry->id() == id) return entry;
00060     entry = nextEntry();
00061   }
00062 
00063   return 0;
00064 }
00065 
00066 void KSyncee::replaceEntry(KSyncEntry *oldEntry,KSyncEntry *newEntry)
00067 {
00068   removeEntry(oldEntry);
00069   addEntry(newEntry);
00070 }
00071 
00072 bool KSyncee::hasChanged(KSyncEntry *entry)
00073 {
00074   if ( entry->timestamp().isEmpty() ) return true;
00075 
00076   mStatusLog->setGroup(entry->id());
00077   QString timestamp = mStatusLog->readEntry("Timestamp");
00078 
00079   return (timestamp != entry->timestamp());
00080 }
00081 
00082 bool KSyncee::load()
00083 {
00084   delete mStatusLog;
00085   mStatusLog = new KSimpleConfig(locateLocal("appdata",statusLogName()));
00086 
00087   return read();
00088 }
00089 
00090 bool KSyncee::save()
00091 {
00092   bool success = write();
00093   if (success) {
00094     writeLog();
00095     return true;
00096   } else {
00097     return false;
00098   }
00099 }
00100 
00101 void KSyncee::writeLog()
00102 {  
00103   for (KSyncEntry *entry = firstEntry();entry;entry = nextEntry()) {
00104     mStatusLog->setGroup(entry->id());
00105     mStatusLog->writeEntry("Name",entry->name());
00106     mStatusLog->writeEntry("Timestamp",entry->timestamp());
00107   }
00108   
00109   mStatusLog->sync();
00110 }
00111 
00112 QString KSyncee::statusLogName()
00113 {
00114   QString name = filename();
00115 
00116   name.replace(QRegExp("/"),"_");
00117   name.replace(QRegExp(":"),"_");
00118 
00119   name += ".syncee";
00120   
00121   return name;
00122 }
00123 
00124 
00125 KSyncer::KSyncer(KSyncUi *ui)
00126 {
00127   mSyncees.setAutoDelete(true);
00128   if (!ui) {
00129     mUi = new KSyncUi();
00130   } else {
00131     mUi = ui;
00132   }
00133 }
00134 
00135 KSyncer::~KSyncer()
00136 {
00137 }
00138 
00139 void KSyncer::addSyncee(KSyncee *syncee)
00140 {
00141   mSyncees.append(syncee);
00142 }
00143 
00144 void KSyncer::sync()
00145 {
00146   KSyncee *target = mSyncees.last();
00147   KSyncee *syncee = mSyncees.first();
00148   while (syncee != target) {
00149     syncToTarget(syncee,target);
00150     syncee = mSyncees.next();
00151   }
00152   target->save();
00153   syncee = mSyncees.first();
00154   while (syncee != target) {
00155     syncToTarget(target,syncee,true);
00156     syncee->save();
00157     syncee = mSyncees.next();
00158   }
00159 }
00160 
00161 void KSyncer::syncAllToTarget(KSyncee *target, bool writeback)
00162 {
00163   KSyncee *syncee = mSyncees.first();
00164   while(syncee) {
00165     syncToTarget(syncee,target);
00166     syncee = mSyncees.next();
00167   }
00168 
00169   target->writeLog();
00170 
00171   if (writeback) {
00172     for (KSyncee *syncee=mSyncees.first();syncee;syncee = mSyncees.next()) {
00173       syncToTarget(target,syncee,true);
00174     }
00175   }
00176 }
00177 
00178 void KSyncer::syncToTarget(KSyncee *source, KSyncee *target, bool override)
00179 {
00180   kdDebug() << "KSyncer::syncToTarget(): from: " << source->filename()
00181             << " to: " << target->filename() << "  override: "
00182             << (override ? "true" : "false") << endl;
00183 
00184   KSyncEntry *sourceEntry = source->firstEntry();
00185   while (sourceEntry) {
00186     KSyncEntry *targetEntry = target->findEntry(sourceEntry->id());
00187     if (targetEntry) {
00188       // Entry already exists in target
00189       if (sourceEntry->equals(targetEntry)) {
00190         // Entries are equal, no action required
00191       } else {
00192         // Entries are different, resolve conflict
00193         if (override) {
00194           // Force override
00195           target->replaceEntry(targetEntry,sourceEntry);
00196         } else {
00197           if (source->hasChanged(sourceEntry) &&
00198               target->hasChanged(targetEntry)) {
00199             // Both entries have changed
00200             KSyncEntry *result = mUi->deconflict(sourceEntry,targetEntry);
00201             if (result == sourceEntry) {
00202               target->replaceEntry(targetEntry,sourceEntry);
00203             }
00204           } else if (source->hasChanged(sourceEntry) &&
00205                      !target->hasChanged(targetEntry)) {
00206             // take source entry
00207             target->replaceEntry(targetEntry,sourceEntry);
00208           } else if (!source->hasChanged(sourceEntry) &&
00209                      target->hasChanged(targetEntry)) {
00210             // take target entry, no action required
00211           }
00212         }
00213       }
00214     } else {
00215       // New entry
00216       target->addEntry(sourceEntry);
00217     }
00218 
00219     sourceEntry = source->nextEntry();
00220   }
00221 
00222   source->writeLog();
00223 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 15 11:40:48 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001