00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <qregexp.h>
00023
00024
#include <kdebug.h>
00025
#include <ksimpleconfig.h>
00026
#include <kstandarddirs.h>
00027
00028
#include "ksyncui.h"
00029
00030
#include "ksyncer.h"
00031
00032 KSyncEntry::KSyncEntry() :
00033 mSyncee(0)
00034 {
00035 }
00036
00037 KSyncEntry::~KSyncEntry()
00038 {
00039 }
00040
00041 void KSyncEntry::setSyncee(
KSyncee *syncee)
00042 {
00043 mSyncee = syncee;
00044 }
00045
00046 KSyncee *
KSyncEntry::syncee()
00047 {
00048
return mSyncee;
00049 }
00050
00051
00052 KSyncee::KSyncee() :
00053 mStatusLog(0)
00054 {
00055 }
00056
00057 KSyncee::~KSyncee()
00058 {
00059
delete mStatusLog;
00060 }
00061
00062 void KSyncee::setFilename(
const QString &filename)
00063 {
00064 mFilename = filename;
00065 }
00066
00067 QString KSyncee::filename()
00068 {
00069
return mFilename;
00070 }
00071
00072 KSyncEntry *
KSyncee::findEntry(
const QString &
id)
00073 {
00074 kdDebug() <<
"KSyncee::findEntry() '" <<
id <<
"'" << endl;
00075
00076
KSyncEntry *entry =
firstEntry();
00077
while (entry) {
00078
if (entry->
id() ==
id)
return entry;
00079 entry =
nextEntry();
00080 }
00081
00082
return 0;
00083 }
00084
00085 void KSyncee::replaceEntry(
KSyncEntry *oldEntry,
KSyncEntry *newEntry)
00086 {
00087
removeEntry(oldEntry);
00088
addEntry(newEntry);
00089 }
00090
00091 bool KSyncee::hasChanged(
KSyncEntry *entry)
00092 {
00093
if ( entry->
timestamp().isEmpty() )
return true;
00094
00095 mStatusLog->setGroup(entry->
id());
00096
QString timestamp = mStatusLog->readEntry(
"Timestamp");
00097
00098
return (timestamp != entry->
timestamp());
00099 }
00100
00101 bool KSyncee::load()
00102 {
00103
delete mStatusLog;
00104 mStatusLog =
new KSimpleConfig(locateLocal(
"appdata",
statusLogName()));
00105
00106
return read();
00107 }
00108
00109 bool KSyncee::save()
00110 {
00111
bool success =
write();
00112
if (success) {
00113
writeLog();
00114
return true;
00115 }
else {
00116
return false;
00117 }
00118 }
00119
00120 void KSyncee::writeLog()
00121 {
00122
for (
KSyncEntry *entry =
firstEntry();entry;entry =
nextEntry()) {
00123 mStatusLog->setGroup(entry->
id());
00124 mStatusLog->writeEntry(
"Name",entry->
name());
00125 mStatusLog->writeEntry(
"Timestamp",entry->
timestamp());
00126 }
00127
00128 mStatusLog->sync();
00129 }
00130
00131 QString KSyncee::statusLogName()
00132 {
00133
QString name =
filename();
00134
00135 name.replace(
QRegExp(
"/"),
"_");
00136 name.replace(
QRegExp(
":"),
"_");
00137
00138 name +=
".syncee";
00139
00140
return name;
00141 }
00142
00143
00144 KSyncer::KSyncer(
KSyncUi *ui)
00145 {
00146 mSyncees.setAutoDelete(
true);
00147
if (!ui) {
00148 mUi =
new KSyncUi();
00149 }
else {
00150 mUi = ui;
00151 }
00152 }
00153
00154 KSyncer::~KSyncer()
00155 {
00156 }
00157
00158 void KSyncer::addSyncee(
KSyncee *syncee)
00159 {
00160 mSyncees.append(syncee);
00161 }
00162
00163 void KSyncer::sync()
00164 {
00165
KSyncee *target = mSyncees.last();
00166
KSyncee *syncee = mSyncees.first();
00167
while (syncee != target) {
00168
syncToTarget(syncee,target);
00169 syncee = mSyncees.next();
00170 }
00171 target->
save();
00172 syncee = mSyncees.first();
00173
while (syncee != target) {
00174
syncToTarget(target,syncee,
true);
00175 syncee->
save();
00176 syncee = mSyncees.next();
00177 }
00178 }
00179
00180 void KSyncer::syncAllToTarget(
KSyncee *target,
bool writeback)
00181 {
00182
KSyncee *syncee = mSyncees.first();
00183
while(syncee) {
00184
syncToTarget(syncee,target);
00185 syncee = mSyncees.next();
00186 }
00187
00188 target->
writeLog();
00189
00190
if (writeback) {
00191
for (
KSyncee *syncee=mSyncees.first();syncee;syncee = mSyncees.next()) {
00192
syncToTarget(target,syncee,
true);
00193 }
00194 }
00195 }
00196
00197 void KSyncer::syncToTarget(
KSyncee *source,
KSyncee *target,
bool override)
00198 {
00199 kdDebug() <<
"KSyncer::syncToTarget(): from: " << source->
filename()
00200 <<
" to: " << target->
filename() <<
" override: "
00201 << (override ?
"true" :
"false") << endl;
00202
00203
KSyncEntry *sourceEntry = source->
firstEntry();
00204
while (sourceEntry) {
00205
KSyncEntry *targetEntry = target->
findEntry(sourceEntry->
id());
00206
if (targetEntry) {
00207
00208
if (sourceEntry->
equals(targetEntry)) {
00209
00210 }
else {
00211
00212
if (override) {
00213
00214 target->
replaceEntry(targetEntry,sourceEntry);
00215 }
else {
00216
if (source->
hasChanged(sourceEntry) &&
00217 target->
hasChanged(targetEntry)) {
00218
00219
KSyncEntry *result = mUi->
deconflict(sourceEntry,targetEntry);
00220
if (result == sourceEntry) {
00221 target->
replaceEntry(targetEntry,sourceEntry);
00222 }
00223 }
else if (source->
hasChanged(sourceEntry) &&
00224 !target->
hasChanged(targetEntry)) {
00225
00226 target->
replaceEntry(targetEntry,sourceEntry);
00227 }
else if (!source->
hasChanged(sourceEntry) &&
00228 target->
hasChanged(targetEntry)) {
00229
00230 }
00231 }
00232 }
00233 }
else {
00234
00235 target->
addEntry(sourceEntry);
00236 }
00237
00238 sourceEntry = source->
nextEntry();
00239 }
00240
00241 source->
writeLog();
00242 }