2012-09-25 00:42:31 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
2012-10-31 20:13:28 +04:00
|
|
|
this.EXPORTED_SYMBOLS = [
|
2012-09-25 00:42:31 +04:00
|
|
|
"RotaryEngine",
|
|
|
|
"RotaryRecord",
|
|
|
|
"RotaryStore",
|
|
|
|
"RotaryTracker",
|
|
|
|
];
|
|
|
|
|
2015-10-07 15:03:21 +03:00
|
|
|
var {utils: Cu} = Components;
|
2012-09-25 00:42:31 +04:00
|
|
|
|
|
|
|
Cu.import("resource://services-sync/engines.js");
|
|
|
|
Cu.import("resource://services-sync/record.js");
|
|
|
|
Cu.import("resource://services-sync/util.js");
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A fake engine implementation.
|
|
|
|
* This is used all over the place.
|
|
|
|
*
|
|
|
|
* Complete with record, store, and tracker implementations.
|
|
|
|
*/
|
|
|
|
|
2012-10-31 20:13:28 +04:00
|
|
|
this.RotaryRecord = function RotaryRecord(collection, id) {
|
2012-09-25 00:42:31 +04:00
|
|
|
CryptoWrapper.call(this, collection, id);
|
|
|
|
}
|
|
|
|
RotaryRecord.prototype = {
|
|
|
|
__proto__: CryptoWrapper.prototype
|
|
|
|
};
|
|
|
|
Utils.deferGetSet(RotaryRecord, "cleartext", ["denomination"]);
|
|
|
|
|
2015-09-16 04:18:04 +03:00
|
|
|
this.RotaryStore = function RotaryStore(name, engine) {
|
|
|
|
Store.call(this, name, engine);
|
2012-09-25 00:42:31 +04:00
|
|
|
this.items = {};
|
|
|
|
}
|
|
|
|
RotaryStore.prototype = {
|
|
|
|
__proto__: Store.prototype,
|
|
|
|
|
|
|
|
create: function create(record) {
|
|
|
|
this.items[record.id] = record.denomination;
|
|
|
|
},
|
|
|
|
|
|
|
|
remove: function remove(record) {
|
|
|
|
delete this.items[record.id];
|
|
|
|
},
|
|
|
|
|
|
|
|
update: function update(record) {
|
|
|
|
this.items[record.id] = record.denomination;
|
|
|
|
},
|
|
|
|
|
|
|
|
itemExists: function itemExists(id) {
|
|
|
|
return (id in this.items);
|
|
|
|
},
|
|
|
|
|
|
|
|
createRecord: function createRecord(id, collection) {
|
|
|
|
let record = new RotaryRecord(collection, id);
|
|
|
|
|
|
|
|
if (!(id in this.items)) {
|
|
|
|
record.deleted = true;
|
|
|
|
return record;
|
|
|
|
}
|
|
|
|
|
|
|
|
record.denomination = this.items[id] || "Data for new record: " + id;
|
|
|
|
return record;
|
|
|
|
},
|
|
|
|
|
|
|
|
changeItemID: function changeItemID(oldID, newID) {
|
|
|
|
if (oldID in this.items) {
|
|
|
|
this.items[newID] = this.items[oldID];
|
|
|
|
}
|
|
|
|
|
|
|
|
delete this.items[oldID];
|
|
|
|
},
|
|
|
|
|
|
|
|
getAllIDs: function getAllIDs() {
|
|
|
|
let ids = {};
|
|
|
|
for (let id in this.items) {
|
|
|
|
ids[id] = true;
|
|
|
|
}
|
|
|
|
return ids;
|
|
|
|
},
|
|
|
|
|
|
|
|
wipe: function wipe() {
|
|
|
|
this.items = {};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-09-16 04:18:04 +03:00
|
|
|
this.RotaryTracker = function RotaryTracker(name, engine) {
|
|
|
|
Tracker.call(this, name, engine);
|
2012-09-25 00:42:31 +04:00
|
|
|
}
|
|
|
|
RotaryTracker.prototype = {
|
|
|
|
__proto__: Tracker.prototype
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-10-31 20:13:28 +04:00
|
|
|
this.RotaryEngine = function RotaryEngine(service) {
|
2012-09-25 00:42:31 +04:00
|
|
|
SyncEngine.call(this, "Rotary", service);
|
|
|
|
// Ensure that the engine starts with a clean slate.
|
|
|
|
this.toFetch = [];
|
|
|
|
this.previousFailed = [];
|
|
|
|
}
|
|
|
|
RotaryEngine.prototype = {
|
|
|
|
__proto__: SyncEngine.prototype,
|
|
|
|
_storeObj: RotaryStore,
|
|
|
|
_trackerObj: RotaryTracker,
|
|
|
|
_recordObj: RotaryRecord,
|
|
|
|
|
|
|
|
_findDupe: function _findDupe(item) {
|
|
|
|
// This is a semaphore used for testing proper reconciling on dupe
|
|
|
|
// detection.
|
|
|
|
if (item.id == "DUPE_INCOMING") {
|
|
|
|
return "DUPE_LOCAL";
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let [id, value] in Iterator(this._store.items)) {
|
|
|
|
if (item.denomination == value) {
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|