ksyncer.cpp
00001
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
00189 if (sourceEntry->equals(targetEntry)) {
00190
00191 } else {
00192
00193 if (override) {
00194
00195 target->replaceEntry(targetEntry,sourceEntry);
00196 } else {
00197 if (source->hasChanged(sourceEntry) &&
00198 target->hasChanged(targetEntry)) {
00199
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
00207 target->replaceEntry(targetEntry,sourceEntry);
00208 } else if (!source->hasChanged(sourceEntry) &&
00209 target->hasChanged(targetEntry)) {
00210
00211 }
00212 }
00213 }
00214 } else {
00215
00216 target->addEntry(sourceEntry);
00217 }
00218
00219 sourceEntry = source->nextEntry();
00220 }
00221
00222 source->writeLog();
00223 }
This file is part of the documentation for kdelibs Version 3.1.4.