зеркало из https://github.com/mozilla/pjs.git
refactoring more stuff out of the service
This commit is contained in:
Родитель
ae9e1d1e92
Коммит
e7493064c7
|
@ -269,7 +269,7 @@ BookmarksSyncService.prototype = {
|
||||||
}
|
}
|
||||||
catch (ex) { /* use defaults */ }
|
catch (ex) { /* use defaults */ }
|
||||||
|
|
||||||
this._readSnapshot();
|
this._snapshot.load();
|
||||||
|
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
this._log.info("Bookmarks sync disabled");
|
this._log.info("Bookmarks sync disabled");
|
||||||
|
@ -341,85 +341,6 @@ BookmarksSyncService.prototype = {
|
||||||
root.addAppender(vapp);
|
root.addAppender(vapp);
|
||||||
},
|
},
|
||||||
|
|
||||||
_saveSnapshot: function BSS__saveSnapshot() {
|
|
||||||
this._log.info("Saving snapshot to disk");
|
|
||||||
|
|
||||||
let file = this._dirSvc.get("ProfD", Ci.nsIFile);
|
|
||||||
file.append("bm-sync-snapshot.json");
|
|
||||||
file.QueryInterface(Ci.nsILocalFile);
|
|
||||||
|
|
||||||
if (!file.exists())
|
|
||||||
file.create(file.NORMAL_FILE_TYPE, PERMS_FILE);
|
|
||||||
|
|
||||||
let fos = Cc["@mozilla.org/network/file-output-stream;1"].
|
|
||||||
createInstance(Ci.nsIFileOutputStream);
|
|
||||||
let flags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
|
|
||||||
fos.init(file, flags, PERMS_FILE, 0);
|
|
||||||
|
|
||||||
let out = {version: this._snapshot.version,
|
|
||||||
GUID: this._snapshot.GUID,
|
|
||||||
snapshot: this._snapshot};
|
|
||||||
out = uneval(out);
|
|
||||||
fos.write(out, out.length);
|
|
||||||
fos.close();
|
|
||||||
},
|
|
||||||
|
|
||||||
_readSnapshot: function BSS__readSnapshot() {
|
|
||||||
let file = this._dirSvc.get("ProfD", Ci.nsIFile);
|
|
||||||
file.append("bm-sync-snapshot.json");
|
|
||||||
|
|
||||||
if (!file.exists())
|
|
||||||
return;
|
|
||||||
|
|
||||||
let fis = Cc["@mozilla.org/network/file-input-stream;1"].
|
|
||||||
createInstance(Ci.nsIFileInputStream);
|
|
||||||
fis.init(file, MODE_RDONLY, PERMS_FILE, 0);
|
|
||||||
fis.QueryInterface(Ci.nsILineInputStream);
|
|
||||||
|
|
||||||
let json = "";
|
|
||||||
while (fis.available()) {
|
|
||||||
let ret = {};
|
|
||||||
fis.readLine(ret);
|
|
||||||
json += ret.value;
|
|
||||||
}
|
|
||||||
fis.close();
|
|
||||||
json = eval(json);
|
|
||||||
|
|
||||||
if (json && 'snapshot' in json && 'version' in json && 'GUID' in json) {
|
|
||||||
this._log.info("Read saved snapshot from disk");
|
|
||||||
this._snapshot = json.snapshot;
|
|
||||||
this._snapshot.version = json.version;
|
|
||||||
this._snapshot.GUID = json.GUID;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_mungeNodes: function BSS__mungeNodes(nodes) {
|
|
||||||
let json = uneval(nodes);
|
|
||||||
json = json.replace(/:{type/g, ":\n\t{type");
|
|
||||||
json = json.replace(/}, /g, "},\n ");
|
|
||||||
json = json.replace(/, parentGUID/g, ",\n\t parentGUID");
|
|
||||||
json = json.replace(/, index/g, ",\n\t index");
|
|
||||||
json = json.replace(/, title/g, ",\n\t title");
|
|
||||||
json = json.replace(/, URI/g, ",\n\t URI");
|
|
||||||
json = json.replace(/, tags/g, ",\n\t tags");
|
|
||||||
json = json.replace(/, keyword/g, ",\n\t keyword");
|
|
||||||
return json;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mungeCommands: function BSS__mungeCommands(commands) {
|
|
||||||
let json = uneval(commands);
|
|
||||||
json = json.replace(/ {action/g, "\n {action");
|
|
||||||
//json = json.replace(/, data/g, ",\n data");
|
|
||||||
return json;
|
|
||||||
},
|
|
||||||
|
|
||||||
_mungeConflicts: function BSS__mungeConflicts(conflicts) {
|
|
||||||
let json = uneval(conflicts);
|
|
||||||
json = json.replace(/ {action/g, "\n {action");
|
|
||||||
//json = json.replace(/, data/g, ",\n data");
|
|
||||||
return json;
|
|
||||||
},
|
|
||||||
|
|
||||||
_lock: function BSS__lock() {
|
_lock: function BSS__lock() {
|
||||||
if (this._locked) {
|
if (this._locked) {
|
||||||
this._log.warn("Service lock failed: already locked");
|
this._log.warn("Service lock failed: already locked");
|
||||||
|
@ -557,9 +478,9 @@ BookmarksSyncService.prototype = {
|
||||||
this._sync.detectUpdates(cont, this._snapshot.data, localJson.data);
|
this._sync.detectUpdates(cont, this._snapshot.data, localJson.data);
|
||||||
let localUpdates = yield;
|
let localUpdates = yield;
|
||||||
|
|
||||||
this._log.debug("local json:\n" + this._mungeNodes(localJson.data));
|
this._log.debug("local json:\n" + localJson.serialize());
|
||||||
this._log.debug("Local updates: " + this._mungeCommands(localUpdates));
|
this._log.debug("Local updates: " + serializeCommands(localUpdates));
|
||||||
this._log.debug("Server updates: " + this._mungeCommands(server.updates));
|
this._log.debug("Server updates: " + serializeCommands(server.updates));
|
||||||
|
|
||||||
if (server.updates.length == 0 && localUpdates.length == 0) {
|
if (server.updates.length == 0 && localUpdates.length == 0) {
|
||||||
this._snapshot.version = server.maxVersion;
|
this._snapshot.version = server.maxVersion;
|
||||||
|
@ -583,17 +504,17 @@ BookmarksSyncService.prototype = {
|
||||||
this._log.info("Predicted changes for server: " + serverChanges.length);
|
this._log.info("Predicted changes for server: " + serverChanges.length);
|
||||||
this._log.info("Client conflicts: " + clientConflicts.length);
|
this._log.info("Client conflicts: " + clientConflicts.length);
|
||||||
this._log.info("Server conflicts: " + serverConflicts.length);
|
this._log.info("Server conflicts: " + serverConflicts.length);
|
||||||
this._log.debug("Changes for client: " + this._mungeCommands(clientChanges));
|
this._log.debug("Changes for client: " + serializeCommands(clientChanges));
|
||||||
this._log.debug("Predicted changes for server: " + this._mungeCommands(serverChanges));
|
this._log.debug("Predicted changes for server: " + serializeCommands(serverChanges));
|
||||||
this._log.debug("Client conflicts: " + this._mungeConflicts(clientConflicts));
|
this._log.debug("Client conflicts: " + serializeConflicts(clientConflicts));
|
||||||
this._log.debug("Server conflicts: " + this._mungeConflicts(serverConflicts));
|
this._log.debug("Server conflicts: " + serializeConflicts(serverConflicts));
|
||||||
|
|
||||||
if (!(clientChanges.length || serverChanges.length ||
|
if (!(clientChanges.length || serverChanges.length ||
|
||||||
clientConflicts.length || serverConflicts.length)) {
|
clientConflicts.length || serverConflicts.length)) {
|
||||||
this._log.info("Sync complete (2): no changes needed on client or server");
|
this._log.info("Sync complete (2): no changes needed on client or server");
|
||||||
this._snapshot.data = localJson.data;
|
this._snapshot.data = localJson.data;
|
||||||
this._snapshot.version = server.maxVersion;
|
this._snapshot.version = server.maxVersion;
|
||||||
this._saveSnapshot();
|
this._snapshot.save();
|
||||||
synced = true;
|
synced = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -624,13 +545,13 @@ BookmarksSyncService.prototype = {
|
||||||
this._log.warn("Commands did not apply correctly");
|
this._log.warn("Commands did not apply correctly");
|
||||||
this._log.debug("Diff from snapshot+commands -> " +
|
this._log.debug("Diff from snapshot+commands -> " +
|
||||||
"new snapshot after commands:\n" +
|
"new snapshot after commands:\n" +
|
||||||
this._mungeCommands(diff));
|
serializeCommands(diff));
|
||||||
// FIXME: do we really want to revert the snapshot here?
|
// FIXME: do we really want to revert the snapshot here?
|
||||||
this._snapshot.data = eval(uneval(savedSnap));
|
this._snapshot.data = eval(uneval(savedSnap));
|
||||||
this._snapshot.version = savedVersion;
|
this._snapshot.version = savedVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._saveSnapshot();
|
this._snapshot.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.2) Append server delta to the delta file and upload
|
// 3.2) Append server delta to the delta file and upload
|
||||||
|
@ -651,7 +572,7 @@ BookmarksSyncService.prototype = {
|
||||||
|
|
||||||
this._log.info("Actual changes for server: " + serverDelta.length);
|
this._log.info("Actual changes for server: " + serverDelta.length);
|
||||||
this._log.debug("Actual changes for server: " +
|
this._log.debug("Actual changes for server: " +
|
||||||
this._mungeCommands(serverDelta));
|
serializeCommands(serverDelta));
|
||||||
|
|
||||||
if (serverDelta.length) {
|
if (serverDelta.length) {
|
||||||
this._log.info("Uploading changes to server");
|
this._log.info("Uploading changes to server");
|
||||||
|
@ -671,7 +592,7 @@ BookmarksSyncService.prototype = {
|
||||||
} else {
|
} else {
|
||||||
let data;
|
let data;
|
||||||
if (this.encryption == "none") {
|
if (this.encryption == "none") {
|
||||||
data = this._mungeCommands(server.deltas);
|
data = serializeCommands(server.deltas);
|
||||||
} else if (this.encryption == "XXXTEA") {
|
} else if (this.encryption == "XXXTEA") {
|
||||||
this._log.debug("Encrypting snapshot");
|
this._log.debug("Encrypting snapshot");
|
||||||
data = this._encrypter.encrypt(uneval(server.deltas), this.passphrase);
|
data = this._encrypter.encrypt(uneval(server.deltas), this.passphrase);
|
||||||
|
@ -700,7 +621,7 @@ BookmarksSyncService.prototype = {
|
||||||
if (deltasPut.status >= 200 && deltasPut.status < 300 &&
|
if (deltasPut.status >= 200 && deltasPut.status < 300 &&
|
||||||
statusPut.status >= 200 && statusPut.status < 300) {
|
statusPut.status >= 200 && statusPut.status < 300) {
|
||||||
this._log.info("Successfully updated deltas and status on server");
|
this._log.info("Successfully updated deltas and status on server");
|
||||||
this._saveSnapshot();
|
this.snapshot.save();
|
||||||
} else {
|
} else {
|
||||||
// FIXME: revert snapshot here? - can't, we already applied
|
// FIXME: revert snapshot here? - can't, we already applied
|
||||||
// updates locally! - need to save and retry
|
// updates locally! - need to save and retry
|
||||||
|
@ -905,7 +826,7 @@ BookmarksSyncService.prototype = {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._log.info("Initial upload to server successful");
|
this._log.info("Initial upload to server successful");
|
||||||
this._saveSnapshot();
|
this.snapshot.save();
|
||||||
|
|
||||||
ret.status = 0;
|
ret.status = 0;
|
||||||
ret.formatVersion = STORAGE_FORMAT_VERSION;
|
ret.formatVersion = STORAGE_FORMAT_VERSION;
|
||||||
|
@ -943,7 +864,7 @@ BookmarksSyncService.prototype = {
|
||||||
try {
|
try {
|
||||||
let data;
|
let data;
|
||||||
if (this.encryption == "none") {
|
if (this.encryption == "none") {
|
||||||
data = this._mungeNodes(this._snapshot.data);
|
data = this._snapshot.serialize();
|
||||||
} else if (this.encryption == "XXXTEA") {
|
} else if (this.encryption == "XXXTEA") {
|
||||||
this._log.debug("Encrypting snapshot");
|
this._log.debug("Encrypting snapshot");
|
||||||
data = this._encrypter.encrypt(uneval(this._snapshot.data), this.passphrase);
|
data = this._encrypter.encrypt(uneval(this._snapshot.data), this.passphrase);
|
||||||
|
@ -1103,7 +1024,7 @@ BookmarksSyncService.prototype = {
|
||||||
|
|
||||||
this._snapshot.data = {};
|
this._snapshot.data = {};
|
||||||
this._snapshot.version = -1;
|
this._snapshot.version = -1;
|
||||||
this._saveSnapshot();
|
this.snapshot.save();
|
||||||
done = true;
|
done = true;
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -1203,6 +1124,18 @@ BookmarksSyncService.prototype = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
serializeCommands: function serializeCommands(commands) {
|
||||||
|
let json = uneval(commands);
|
||||||
|
json = json.replace(/ {action/g, "\n {action");
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
serializeConflicts: function serializeConflicts(conflicts) {
|
||||||
|
let json = uneval(conflicts);
|
||||||
|
json = json.replace(/ {action/g, "\n {action");
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SyncCore objects
|
* SyncCore objects
|
||||||
* Sync cores deal with diff creation and conflict resolution.
|
* Sync cores deal with diff creation and conflict resolution.
|
||||||
|
@ -1615,6 +1548,71 @@ SnapshotStore.prototype = {
|
||||||
this._GUID = GUID;
|
this._GUID = GUID;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
save: function SStore_save() {
|
||||||
|
this._log.info("Saving snapshot to disk");
|
||||||
|
|
||||||
|
let file = this._dirSvc.get("ProfD", Ci.nsIFile);
|
||||||
|
file.append("bm-sync-snapshot.json");
|
||||||
|
file.QueryInterface(Ci.nsILocalFile);
|
||||||
|
|
||||||
|
if (!file.exists())
|
||||||
|
file.create(file.NORMAL_FILE_TYPE, PERMS_FILE);
|
||||||
|
|
||||||
|
let fos = Cc["@mozilla.org/network/file-output-stream;1"].
|
||||||
|
createInstance(Ci.nsIFileOutputStream);
|
||||||
|
let flags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
|
||||||
|
fos.init(file, flags, PERMS_FILE, 0);
|
||||||
|
|
||||||
|
let out = {version: this._snapshot.version,
|
||||||
|
GUID: this._snapshot.GUID,
|
||||||
|
snapshot: this._snapshot};
|
||||||
|
out = uneval(out);
|
||||||
|
fos.write(out, out.length);
|
||||||
|
fos.close();
|
||||||
|
},
|
||||||
|
|
||||||
|
load: function SStore_load() {
|
||||||
|
let file = this._dirSvc.get("ProfD", Ci.nsIFile);
|
||||||
|
file.append("bm-sync-snapshot.json");
|
||||||
|
|
||||||
|
if (!file.exists())
|
||||||
|
return;
|
||||||
|
|
||||||
|
let fis = Cc["@mozilla.org/network/file-input-stream;1"].
|
||||||
|
createInstance(Ci.nsIFileInputStream);
|
||||||
|
fis.init(file, MODE_RDONLY, PERMS_FILE, 0);
|
||||||
|
fis.QueryInterface(Ci.nsILineInputStream);
|
||||||
|
|
||||||
|
let json = "";
|
||||||
|
while (fis.available()) {
|
||||||
|
let ret = {};
|
||||||
|
fis.readLine(ret);
|
||||||
|
json += ret.value;
|
||||||
|
}
|
||||||
|
fis.close();
|
||||||
|
json = eval(json);
|
||||||
|
|
||||||
|
if (json && 'snapshot' in json && 'version' in json && 'GUID' in json) {
|
||||||
|
this._log.info("Read saved snapshot from disk");
|
||||||
|
this._snapshot = json.snapshot;
|
||||||
|
this._snapshot.version = json.version;
|
||||||
|
this._snapshot.GUID = json.GUID;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
serialize: function SStore_serialize() {
|
||||||
|
let json = uneval(this.data);
|
||||||
|
json = json.replace(/:{type/g, ":\n\t{type");
|
||||||
|
json = json.replace(/}, /g, "},\n ");
|
||||||
|
json = json.replace(/, parentGUID/g, ",\n\t parentGUID");
|
||||||
|
json = json.replace(/, index/g, ",\n\t index");
|
||||||
|
json = json.replace(/, title/g, ",\n\t title");
|
||||||
|
json = json.replace(/, URI/g, ",\n\t URI");
|
||||||
|
json = json.replace(/, tags/g, ",\n\t tags");
|
||||||
|
json = json.replace(/, keyword/g, ",\n\t keyword");
|
||||||
|
return json;
|
||||||
|
},
|
||||||
|
|
||||||
wrap: function SStore_wrap() {
|
wrap: function SStore_wrap() {
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче