1
/* ***** BEGIN LICENSE BLOCK *****
2
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
* The contents of this file are subject to the Mozilla Public License Version
5
* 1.1 (the "License"); you may not use this file except in compliance with
6
* the License. You may obtain a copy of the License at
7
* http://www.mozilla.org/MPL/
9
* Software distributed under the License is distributed on an "AS IS" basis,
10
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
* for the specific language governing rights and limitations under the
14
* The Original Code is Weave.
16
* The Initial Developer of the Original Code is Mozilla.
17
* Portions created by the Initial Developer are Copyright (C) 2008
18
* the Initial Developer. All Rights Reserved.
21
* Dan Mills <thunder@mozilla.com>
23
* Alternatively, the contents of this file may be used under the terms of
24
* either the GNU General Public License Version 2 or later (the "GPL"), or
25
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26
* in which case the provisions of the GPL or the LGPL are applicable instead
27
* of those above. If you wish to allow use of your version of this file only
28
* under the terms of either the GPL or the LGPL, and not to allow others to
29
* use your version of this file under the terms of the MPL, indicate your
30
* decision by deleting the provisions above and replace them with the notice
31
* and other provisions required by the GPL or the LGPL. If you do not delete
32
* the provisions above, a recipient may use your version of this file under
33
* the terms of any one of the MPL, the GPL or the LGPL.
35
* ***** END LICENSE BLOCK ***** */
37
const EXPORTED_SYMBOLS = ['Collection'];
39
const Cc = Components.classes;
40
const Ci = Components.interfaces;
41
const Cr = Components.results;
42
const Cu = Components.utils;
44
Cu.import("resource://services-sync/resource.js");
45
Cu.import("resource://services-sync/util.js");
47
function Collection(uri, recordObj) {
48
Resource.call(this, uri);
49
this._recordObj = recordObj;
58
Collection.prototype = {
59
__proto__: Resource.prototype,
60
_logName: "Collection",
62
_rebuildURL: function Coll__rebuildURL() {
63
// XXX should consider what happens if it's not a URL...
64
this.uri.QueryInterface(Ci.nsIURL);
68
args.push('older=' + this.older);
69
else if (this.newer) {
70
args.push('newer=' + this.newer);
75
args.push('sort=' + this.sort);
77
args.push("ids=" + this.ids);
78
if (this.limit > 0 && this.limit != Infinity)
79
args.push("limit=" + this.limit);
81
this.uri.query = (args.length > 0)? '?' + args.join('&') : '';
85
get full() { return this._full; },
91
// Apply the action to a certain set of ids
98
// Limit how many records to get
99
get limit() this._limit,
105
// get only items modified before some date
106
get older() { return this._older; },
112
// get only items modified since some date
113
get newer() { return this._newer; },
119
// get items sorted by some criteria. valid values:
120
// oldest (oldest first)
121
// newest (newest first)
123
get sort() { return this._sort; },
129
pushData: function Coll_pushData(data) {
130
this._data.push(data);
133
clearRecords: function Coll_clearRecords() {
137
set recordHandler(onRecord) {
138
// Save this because onProgress is called with this as the ChannelListener
141
// Switch to newline separated records for incremental parsing
142
coll.setHeader("Accept", "application/newlines");
144
this._onProgress = function() {
146
while ((newline = this._data.indexOf("\n")) > 0) {
147
// Split the json record from the rest of the data
148
let json = this._data.slice(0, newline);
149
this._data = this._data.slice(newline + 1);
151
// Deserialize a record from json and give it to the callback
152
let record = new coll._recordObj();
153
record.deserialize(json);
154
record.baseUri = coll.uri;