summaryrefslogtreecommitdiff
path: root/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js
Unidiff
Diffstat (limited to 'frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js328
1 files changed, 328 insertions, 0 deletions
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js
new file mode 100644
index 0000000..87b319c
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js
@@ -0,0 +1,328 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
26}
27
28Clipperz.PM.DataModel.Record.Version = function(args) {
29 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
30
31 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
32 this._fields = null;
33
34 return this;
35}
36
37
38Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
39
40 'toString': function() {
41 return "Record.Version (" + this.reference() + ")";
42 },
43
44 //-------------------------------------------------------------------------
45
46 'reference': function () {
47 return this._reference;
48 },
49
50 //-------------------------------------------------------------------------
51/*
52 'hasPendingChanges': function () {
53 var deferredResult;
54
55 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
56 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
57 deferredResult.callback();
58
59 return deferredResult;
60 },
61*/
62 //-------------------------------------------------------------------------
63
64
65 'hasPendingChangesWhenBrandNew': function () {
66 var deferredResult;
67
68 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
69 deferredResult.addMethod(this, 'fields');
70 deferredResult.addCallback(MochiKit.Base.values);
71 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
72 deferredResult.addCallback(Clipperz.Async.collectAll);
73 deferredResult.addCallback(function(someValues) {
74 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
75 });
76 deferredResult.addCallback(MochiKit.Base.operator.lognot)
77 deferredResult.callback();
78
79 return deferredResult;
80 },
81
82 //=========================================================================
83
84 'commitTransientState': function () {
85 var deferredResult;
86
87 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
88 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
89 deferredResult.callback();
90
91 return deferredResult;
92 },
93
94 //=========================================================================
95
96 'unpackData': function (someData) { //++
97 varresult;
98
99 result = someData;
100 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
101 varfields;
102 var i,c;
103
104 fields = someData['fields'];
105 delete someData['fields'];
106
107 someData['fields'] = {};
108 c = fields.length;
109 for (i=0; i<c; i++) {
110 someData['fields'][i] = fields[i];
111 }
112 }
113
114
115
116 return result;
117 },
118
119 //=========================================================================
120
121 'fields': function () {
122 vardeferredResult;
123 var deferredLock;
124
125 deferredLock = this.getDeferredLockForKey('fields');
126
127 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
128 deferredResult.acquireLock(deferredLock);
129 deferredResult.addCallback(MochiKit.Base.bind(function () {
130 var innerDeferredResult;
131
132 if (this._fields == null) {
133 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
134 innerDeferredResult.addMethod(this, 'getValue', 'fields');
135 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
136 var reference;
137
138 this._fields = {};
139
140 for (reference in someObjectData) {
141 varrecordVersionField;
142
143 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
144 'recordVersion':this,
145 'reference': reference
146 });
147
148 this._fields[reference] = recordVersionField;
149 }
150
151 return this._fields;
152 }, this));
153 innerDeferredResult.callback();
154 } else {
155 innerDeferredResult = MochiKit.Async.succeed(this._fields);
156 }
157
158 return innerDeferredResult;
159 }, this));
160 deferredResult.releaseLock(deferredLock);
161 deferredResult.callback();
162
163 return deferredResult;
164 },
165
166 //-------------------------------------------------------------------------
167
168 'getFieldsValues': function () {
169 return this.getValue('fields');
170 },
171
172 //-------------------------------------------------------------------------
173
174 'addField': function (someParameters) {
175 varnewField;
176
177 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
178
179 return Clipperz.Async.callbacks("Record.Version.addField", [
180 MochiKit.Base.method(this, 'fields'),
181
182 MochiKit.Base.method(this, '_getObjectDataStore'),
183 MochiKit.Base.methodcaller('values'),
184 Clipperz.Base.serializeJSON,
185
186 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
187 MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
188 MochiKit.Base.method(newField, 'setValue', someParameters['value']),
189 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']),
190
191 MochiKit.Base.method(this, '_getObjectDataStore'),
192 MochiKit.Base.methodcaller('values'),
193 Clipperz.Base.serializeJSON,
194
195 MochiKit.Base.partial(MochiKit.Async.succeed, newField)
196 ], {trace:false});
197 },
198
199 //-------------------------------------------------------------------------
200
201 'removeField': function (aField) {
202 return Clipperz.Async.callbacks("Record.Version.removeField", [
203 MochiKit.Base.method(this, 'fields'),
204 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
205 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
206 ], {trace:false});
207 },
208
209 //-------------------------------------------------------------------------
210/*
211 'sortFieldReference': function (someSortedFieldReferences) {
212
213
214
215 },
216*/
217 //=========================================================================
218/*
219 'directLogins': function () {
220 return MochiKit.Base.values(this._directLogins);
221 },
222
223 'addDirectLogin': function (aDirectLogin) {
224 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
225 },
226*/
227
228 //=========================================================================
229/*
230 'updateValues': function (anotherVersion) {
231 return Clipperz.Async.callbacks("Record.Version.updateValue", [
232 MochiKit.Base.partial(MochiKit.Async.succeed, this)
233 ], {trace:false});
234 },
235*/
236 //=========================================================================
237
238 'setRemoteData': function (aValue) {
239 this._remoteData = aValue;
240
241 return aValue;
242 },
243
244 //=========================================================================
245
246 'getVersionFunction': function () {
247 return this._getVersionFunction;
248 },
249
250 'previousVersion': function () {
251 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
252 MochiKit.Base.method(this, 'previousVersionReference'),
253 this.getVersionFunction()
254 ], {trace:false});
255 },
256
257 'previousVersionReference': function () {
258 return this.getValue('previousVersionReference');
259 },
260
261 'previousVersionKey': function () {
262 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
263 return this.getValue('previousVersionKey');
264 },
265
266 //-------------------------------------------------------------------------
267
268 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
269 // this._previousVersion = anotherVersion;
270 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
271 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']),
272 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
273 ], {trace:false});
274 },
275
276 //=========================================================================
277
278 'revertChanges': function () {
279 this.setReference(this.transientState()['originalReference']);
280 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
281 },
282
283 //-------------------------------------------------------------------------
284
285 'prepareRemoteDataWithKey': function (aKey) {
286 var deferredResult;
287 var result;
288
289 result = {};
290
291 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
292 if (this.isBrandNew() == false) {
293 this.transientState()['originalReference'] = this.reference();
294
295 deferredResult.collectResults({
296 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
297 'value': MochiKit.Base.method(this, 'getKey'),
298 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
299 });
300 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
301 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
302 } else {
303 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
304 }
305 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
306 deferredResult.addCallback(MochiKit.Base.update, result);
307 deferredResult.addMethod(this, 'setRemoteData');
308
309 deferredResult.callback();
310
311 return deferredResult;
312 },
313
314 //=========================================================================
315/*
316 'deleteAllCleanTextData': function () {
317 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
318 },
319
320 'hasAnyCleanTextData': function () {
321 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
322 },
323*/
324 //=========================================================================
325 __syntaxFix__: "syntax fix"
326});
327
328