Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Xavier Thompson
erp5
Commits
9f6a1714
Commit
9f6a1714
authored
Apr 30, 2015
by
Romain Courteaud
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update jio development version.
Bug fixes + replicateStorage
parent
aa250aea
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1145 additions
and
51 deletions
+1145
-51
bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_jio_js.xml
...ui/PathTemplateItem/web_page_module/rjs_gadget_jio_js.xml
+6
-2
bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
...nderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
+1139
-49
No files found.
bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_jio_js.xml
View file @
9f6a1714
...
...
@@ -149,6 +149,10 @@
.declareMethod(\'removeAttachment\', function () {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.removeAttachment.apply(storage, arguments);\n
})\n
.declareMethod(\'repair\', function () {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.repair.apply(storage, arguments);\n
});\n
\n
}(window, rJS, jIO));
</string>
</value>
...
...
@@ -286,7 +290,7 @@
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
94
1.55610.36294.45499
</string>
</value>
<value>
<string>
94
2.15696.23962.61542
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -304,7 +308,7 @@
</tuple>
<state>
<tuple>
<float>
142
8655701.93
</float>
<float>
142
9085619.37
</float>
<string>
GMT
</string>
</tuple>
</state>
...
...
bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_jio_js.xml
View file @
9f6a1714
...
...
@@ -5678,7 +5678,8 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
function
declareMethod(klass,
name,
precondition_function,
post_function)
{\n
klass.prototype[name]
=
function
()
{\n
var
argument_list =
arguments,\n
context =
this;\n
context =
this,\n
precondition_result;\n
\n
return
new
RSVP.Queue()\n
.push(function
()
{\n
...
...
@@ -5689,8 +5690,9 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
);\n
}\n
})\n
.push(function
()
{\n
.push(function
(
result
)
{\n
var
storage_method =
context.__storage[name];\n
precondition_result =
result;\n
if
(
storage_method =
==
undefined)
{\n
throw
new
jIO.util.jIOError(\n
"Capacity
\'"
+
name
+
"\'
is
not
implemented
on
\'"
+\n
...
...
@@ -5708,7 +5710,8 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
return
post_function.call(\n
context,\n
argument_list,\n
result\n
result,\n
precondition_result\n
);\n
}\n
return
result;\n
...
...
@@ -5787,6 +5790,7 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
declareMethod(JioProxyStorage,
\'getAttachment\',
function
(argument_list,\n
storage,\n
method_name)
{\n
var
result =
"blob"
;\n
//
if
(param.storage_spec.type
!==
"indexeddb"
&&\n
//
param.storage_spec.type
!==
"dav"
&&\n
//
(param.kwargs._start
!==
undefined\n
...
...
@@ -5800,8 +5804,15 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
//
}\n
checkId(argument_list,
storage,
method_name);\n
checkAttachmentId(argument_list,
storage,
method_name);\n
},
function
(argument_list,
result)
{\n
if
(!(result
instanceof
Blob))
{\n
//
Drop
optional
parameters,
which
are
only
used
in
postfunction\n
if
(argument_list[2]
!==
undefined)
{\n
result =
argument_list[2].format
||
result;\n
delete
argument_list[2].format;\n
}\n
return
result;\n
},
function
(argument_list,
blob,
convert)
{\n
var
result;\n
if
(!(blob
instanceof
Blob))
{\n
throw
new
jIO.util.jIOError(\n
"\'getAttachment\'
("
+
argument_list[0]
+
"
,
"
+\n
argument_list[1]
+
")
on
\'"
+
this.__type
+\n
...
...
@@ -5809,6 +5820,47 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
501\n
);\n
}\n
if
(
convert =
==
"blob")
{\n
result =
blob;\n
}
else
if
(
convert =
==
"data_url")
{\n
result =
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.readBlobAsDataURL(blob);\n
})\n
.push(function
(evt)
{\n
return
evt.target.result;\n
});\n
}
else
if
(
convert =
==
"array_buffer")
{\n
result =
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.readBlobAsArrayBuffer(blob);\n
})\n
.push(function
(evt)
{\n
return
evt.target.result;\n
});\n
}
else
if
(
convert =
==
"text")
{\n
result =
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.readBlobAsText(blob);\n
})\n
.push(function
(evt)
{\n
return
evt.target.result;\n
});\n
}
else
if
(
convert =
==
"json")
{\n
result =
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.readBlobAsText(blob);\n
})\n
.push(function
(evt)
{\n
return
JSON.parse(evt.target.result);\n
});\n
}
else
{\n
throw
new
jIO.util.jIOError(\n
this.__type
+
".getAttachment
format:
\'"
+
convert
+\n
"\'
is
not
supported",\n
400\n
);\n
}\n
return
result;\n
});\n
\n
...
...
@@ -5872,6 +5924,20 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
};\n
\n
declareMethod(JioProxyStorage,
"allAttachments",
checkId);\n
declareMethod(JioProxyStorage,
"repair");\n
\n
JioProxyStorage.prototype.repair =
function
()
{\n
var
context =
this,\n
argument_list =
arguments;\n
return
new
RSVP.Queue()\n
.push(function
()
{\n
var
storage_method =
context.__storage.repair;\n
if
(storage_method
!==
undefined)
{\n
return
context.__storage.repair.apply(context.__storage,\n
argument_list);\n
}\n
});\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
//
Storage
builder\n
...
...
@@ -5926,6 +5992,838 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
window.jIO =
jIO;\n
\n
}(window,
RSVP,
Blob,
QueryFactory,
Query,
FileReader));\n
;/*\n
*
Rusha,
a
JavaScript
implementation
of
the
Secure
Hash
Algorithm,
SHA-1,\n
*
as
defined
in
FIPS
PUB
180-1,
tuned
for
high
performance
with
large
inputs.\n
*
(http://github.com/srijs/rusha)\n
*\n
*
Inspired
by
Paul
Johnstons
implementation
(http://pajhome.org.uk/crypt/md5).\n
*\n
*
Copyright
(c)
2013
Sam
Rijs
(http://awesam.de).\n
*
Released
under
the
terms
of
the
MIT
license
as
follows:\n
*\n
*
Permission
is
hereby
granted,
free
of
charge,
to
any
person
obtaining
a\n
*
copy
of
this
software
and
associated
documentation
files
(the
"Software"),\n
*
to
deal
in
the
Software
without
restriction,
including
without
limitation\n
*
the
rights
to
use,
copy,
modify,
merge,
publish,
distribute,
sublicense,\n
*
and/or
sell
copies
of
the
Software,
and
to
permit
persons
to
whom
the\n
*
Software
is
furnished
to
do
so,
subject
to
the
following
conditions:\n
*\n
*
The
above
copyright
notice
and
this
permission
notice
shall
be
included
in\n
*
all
copies
or
substantial
portions
of
the
Software.\n
*\n
*
THE
SOFTWARE
IS
PROVIDED
"AS
IS",
WITHOUT
WARRANTY
OF
ANY
KIND,
EXPRESS
OR\n
*
IMPLIED,
INCLUDING
BUT
NOT
LIMITED
TO
THE
WARRANTIES
OF
MERCHANTABILITY,\n
*
FITNESS
FOR
A
PARTICULAR
PURPOSE
AND
NONINFRINGEMENT.
IN
NO
EVENT
SHALL
THE\n
*
AUTHORS
OR
COPYRIGHT
HOLDERS
BE
LIABLE
FOR
ANY
CLAIM,
DAMAGES
OR
OTHER\n
*
LIABILITY,
WHETHER
IN
AN
ACTION
OF
CONTRACT,
TORT
OR
OTHERWISE,
ARISING\n
*
FROM,
OUT
OF
OR
IN
CONNECTION
WITH
THE
SOFTWARE
OR
THE
USE
OR
OTHER
DEALINGS\n
*
IN
THE
SOFTWARE.\n
*/\n
(function
()
{\n
//
If
we\'e
running
in
Node.JS,
export
a
module.\n
if
(typeof
module
!==
\'undefined\')
{\n
module.exports =
Rusha;\n
}
else
if
(typeof
window
!==
\'undefined\')
{\n
window.Rusha =
Rusha;\n
}\n
//
If
we\'re
running
in
a
webworker,
accept\n
//
messages
containing
a
jobid
and
a
buffer\n
//
or
blob
object,
and
return
the
hash
result.\n
if
(typeof
FileReaderSync
!==
\'undefined\')
{\n
var
reader =
new
FileReaderSync(),
hasher =
new
Rusha(4
*
1024
*
1024);\n
self.onmessage =
function
onMessage(event)
{\n
var
hash,
data =
event.data.data;\n
try
{\n
hash =
hasher.digest(data);\n
self.postMessage({\n
id:
event.data.id,\n
hash:
hash\n
});\n
}
catch
(e)
{\n
self.postMessage({\n
id:
event.data.id,\n
error:
e.name\n
});\n
}\n
};\n
}\n
var
util =
{\n
getDataType:
function
(data)
{\n
if
(typeof
data =
==
\'string\')
{\n
return
\'string\';\n
}\n
if
(data
instanceof
Array)
{\n
return
\'array\';\n
}\n
if
(typeof
global
!==
\'undefined\'
&&
global.Buffer
&&
global.Buffer.isBuffer(data))
{\n
return
\'buffer\';\n
}\n
if
(data
instanceof
ArrayBuffer)
{\n
return
\'arraybuffer\';\n
}\n
if
(data.buffer
instanceof
ArrayBuffer)
{\n
return
\'view\';\n
}\n
if
(data
instanceof
Blob)
{\n
return
\'blob\';\n
}\n
throw
new
Error(\'Unsupported
data
type.\');\n
}\n
};\n
//
The
Rusha
object
is
a
wrapper
around
the
low-level
RushaCore.\n
//
It
provides
means
of
converting
different
inputs
to
the\n
//
format
accepted
by
RushaCore
as
well
as
other
utility
methods.\n
function
Rusha(chunkSize)
{\n
\'use
strict\';\n
//
Private
object
structure.\n
var
self$
2 =
{
fill:
0
};\n
//
Calculate
the
length
of
buffer
that
the
sha1
routine
uses\n
//
including
the
padding.\n
var
padlen =
function
(len)
{\n
for
(len
+=
9;
len
%
64
>
0; len += 1);\n
return len;\n
};\n
var padZeroes = function (bin, len) {\n
for (var i = len >> 2; i
< bin.length
;
i++)\n
bin[i]
=
0;\n
};\n
var
padData =
function
(bin,
chunkLen,
msgLen)
{\n
bin[chunkLen
>
> 2] |= 128
<
< 24
-
(chunkLen
%
4
<<
3);\n
bin[((chunkLen
>
> 2) + 2
&
~15) + 14] = msgLen >> 29;\n
bin[((chunkLen >> 2) + 2
&
~15) + 15] = msgLen
<
< 3
;\n
};\n
//
Convert
a
binary
string
and
write
it
to
the
heap.\n
//
A
binary
string
is
expected
to
only
contain
char
codes
<
256.\n
var
convStr =
function
(H8,
H32,
start,
len,
off)
{\n
var
str =
this,
i,
om =
off
%
4,
lm =
len
%
4,
j =
len
-
lm;\n
if
(j
>
0) {\n
switch (om) {\n
case 0:\n
H8[off + 3 | 0] = str.charCodeAt(start);\n
case 1:\n
H8[off + 2 | 0] = str.charCodeAt(start + 1);\n
case 2:\n
H8[off + 1 | 0] = str.charCodeAt(start + 2);\n
case 3:\n
H8[off | 0] = str.charCodeAt(start + 3);\n
}\n
}\n
for (i = om; i
< j
;
i =
i
+
4
|
0)
{\n
H32[off
+
i
>
> 2] = str.charCodeAt(start + i)
<
< 24
|
str.charCodeAt(start
+
i
+
1)
<<
16
|
str.charCodeAt(start
+
i
+
2)
<<
8
|
str.charCodeAt(start
+
i
+
3);\n
}\n
switch
(lm)
{\n
case
3:\n
H8[off
+
j
+
1
|
0]
=
str.charCodeAt(start
+
j
+
2);\n
case
2:\n
H8[off
+
j
+
2
|
0]
=
str.charCodeAt(start
+
j
+
1);\n
case
1:\n
H8[off
+
j
+
3
|
0]
=
str.charCodeAt(start
+
j);\n
}\n
};\n
//
Convert
a
buffer
or
array
and
write
it
to
the
heap.\n
//
The
buffer
or
array
is
expected
to
only
contain
elements
<
256.\n
var
convBuf =
function
(H8,
H32,
start,
len,
off)
{\n
var
buf =
this,
i,
om =
off
%
4,
lm =
len
%
4,
j =
len
-
lm;\n
if
(j
>
0) {\n
switch (om) {\n
case 0:\n
H8[off + 3 | 0] = buf[start];\n
case 1:\n
H8[off + 2 | 0] = buf[start + 1];\n
case 2:\n
H8[off + 1 | 0] = buf[start + 2];\n
case 3:\n
H8[off | 0] = buf[start + 3];\n
}\n
}\n
for (i = 4 - om; i
< j
;
i =
i
+=
4
|
0)
{\n
H32[off
+
i
>
> 2] = buf[start + i]
<
< 24
|
buf[start
+
i
+
1]
<<
16
|
buf[start
+
i
+
2]
<<
8
|
buf[start
+
i
+
3];\n
}\n
switch
(lm)
{\n
case
3:\n
H8[off
+
j
+
1
|
0]
=
buf[start
+
j
+
2];\n
case
2:\n
H8[off
+
j
+
2
|
0]
=
buf[start
+
j
+
1];\n
case
1:\n
H8[off
+
j
+
3
|
0]
=
buf[start
+
j];\n
}\n
};\n
var
convBlob =
function
(H8,
H32,
start,
len,
off)
{\n
var
blob =
this,
i,
om =
off
%
4,
lm =
len
%
4,
j =
len
-
lm;\n
var
buf =
new
Uint8Array(reader.readAsArrayBuffer(blob.slice(start,
start
+
len)));\n
if
(j
>
0) {\n
switch (om) {\n
case 0:\n
H8[off + 3 | 0] = buf[0];\n
case 1:\n
H8[off + 2 | 0] = buf[1];\n
case 2:\n
H8[off + 1 | 0] = buf[2];\n
case 3:\n
H8[off | 0] = buf[3];\n
}\n
}\n
for (i = 4 - om; i
< j
;
i =
i
+=
4
|
0)
{\n
H32[off
+
i
>
> 2] = buf[i]
<
< 24
|
buf[i
+
1]
<<
16
|
buf[i
+
2]
<<
8
|
buf[i
+
3];\n
}\n
switch
(lm)
{\n
case
3:\n
H8[off
+
j
+
1
|
0]
=
buf[j
+
2];\n
case
2:\n
H8[off
+
j
+
2
|
0]
=
buf[j
+
1];\n
case
1:\n
H8[off
+
j
+
3
|
0]
=
buf[j];\n
}\n
};\n
var
convFn =
function
(data)
{\n
switch
(util.getDataType(data))
{\n
case
\'string\':\n
return
convStr.bind(data);\n
case
\'array\':\n
return
convBuf.bind(data);\n
case
\'buffer\':\n
return
convBuf.bind(data);\n
case
\'arraybuffer\':\n
return
convBuf.bind(new
Uint8Array(data));\n
case
\'view\':\n
return
convBuf.bind(new
Uint8Array(data.buffer,
data.byteOffset,
data.byteLength));\n
case
\'blob\':\n
return
convBlob.bind(data);\n
}\n
};\n
var
slice =
function
(data,
offset)
{\n
switch
(util.getDataType(data))
{\n
case
\'string\':\n
return
data.slice(offset);\n
case
\'array\':\n
return
data.slice(offset);\n
case
\'buffer\':\n
return
data.slice(offset);\n
case
\'arraybuffer\':\n
return
data.slice(offset);\n
case
\'view\':\n
return
data.buffer.slice(offset);\n
}\n
};\n
//
Convert
an
ArrayBuffer
into
its
hexadecimal
string
representation.\n
var
hex =
function
(arrayBuffer)
{\n
var
i,
x,
hex_tab =
\'0123456789abcdef\',
res =
[],
binarray =
new
Uint8Array(arrayBuffer);\n
for
(
i =
0;
i
<
binarray.length;
i++)
{\n
x =
binarray[i];\n
res[i]
=
hex_tab.charAt(x
>
> 4
&
15) + hex_tab.charAt(x >> 0
&
15);\n
}\n
return res.join(\'\');\n
};\n
var ceilHeapSize = function (v) {\n
// The asm.js spec says:\n
// The heap object\'s byteLength must be either\n
// 2^n for n in [12, 24) or 2^24 * n for n ≥ 1.\n
// Also, byteLengths smaller than 2^16 are deprecated.\n
var p;\n
// If v is smaller than 2^16, the smallest possible solution\n
// is 2^16.\n
if (v
<
= 65536)\n
return 65536;\n
// If v
< 2
^24,
we
round
up
to
2^n,\n
//
otherwise
we
round
up
to
2^24
*
n.\n
if
(v
<
16777216)
{\n
for
(
p =
1;
p
<
v;
p =
p
<<
1);\n
}
else
{\n
for
(
p =
16777216;
p
<
v;
p
+=
16777216);\n
}\n
return
p;\n
};\n
//
Initialize
the
internal
data
structures
to
a
new
capacity.\n
var
init =
function
(size)
{\n
if
(size
%
64
>
0) {\n
throw new Error(\'Chunk size must be a multiple of 128 bit\');\n
}\n
self$2.maxChunkLen = size;\n
self$2.padMaxChunkLen = padlen(size);\n
// The size of the heap is the sum of:\n
// 1. The padded input message size\n
// 2. The extended space the algorithm needs (320 byte)\n
// 3. The 160 bit state the algoritm uses\n
self$2.heap = new ArrayBuffer(ceilHeapSize(self$2.padMaxChunkLen + 320 + 20));\n
self$2.h32 = new Int32Array(self$2.heap);\n
self$2.h8 = new Int8Array(self$2.heap);\n
self$2.core = RushaCore({\n
Int32Array: Int32Array,\n
DataView: DataView\n
}, {}, self$2.heap);\n
self$2.buffer = null;\n
};\n
// Iinitializethe datastructures according\n
// to a chunk siyze.\n
init(chunkSize || 64 * 1024);\n
var initState = function (heap, padMsgLen) {\n
var io = new Int32Array(heap, padMsgLen + 320, 5);\n
io[0] = 1732584193;\n
io[1] = -271733879;\n
io[2] = -1732584194;\n
io[3] = 271733878;\n
io[4] = -1009589776;\n
};\n
var padChunk = function (chunkLen, msgLen) {\n
var padChunkLen = padlen(chunkLen);\n
var view = new Int32Array(self$2.heap, 0, padChunkLen >> 2);\n
padZeroes(view, chunkLen);\n
padData(view, chunkLen, msgLen);\n
return padChunkLen;\n
};\n
// Write data to the heap.\n
var write = function (data, chunkOffset, chunkLen) {\n
convFn(data)(self$2.h8, self$2.h32, chunkOffset, chunkLen, 0);\n
};\n
// Initialize and call the RushaCore,\n
// assuming an input buffer of length len * 4.\n
var coreCall = function (data, chunkOffset, chunkLen, msgLen, finalize) {\n
var padChunkLen = chunkLen;\n
if (finalize) {\n
padChunkLen = padChunk(chunkLen, msgLen);\n
}\n
write(data, chunkOffset, chunkLen);\n
self$2.core.hash(padChunkLen, self$2.padMaxChunkLen);\n
};\n
var getRawDigest = function (heap, padMaxChunkLen) {\n
var io = new Int32Array(heap, padMaxChunkLen + 320, 5);\n
var out = new Int32Array(5);\n
var arr = new DataView(out.buffer);\n
arr.setInt32(0, io[0], false);\n
arr.setInt32(4, io[1], false);\n
arr.setInt32(8, io[2], false);\n
arr.setInt32(12, io[3], false);\n
arr.setInt32(16, io[4], false);\n
return out;\n
};\n
// Calculate the hash digest as an array of 5 32bit integers.\n
var rawDigest = this.rawDigest = function (str) {\n
var msgLen = str.byteLength || str.length || str.size || 0;\n
initState(self$2.heap, self$2.padMaxChunkLen);\n
var chunkOffset = 0, chunkLen = self$2.maxChunkLen, last;\n
for (chunkOffset = 0; msgLen > chunkOffset + chunkLen; chunkOffset += chunkLen) {\n
coreCall(str, chunkOffset, chunkLen, msgLen, false);\n
}\n
coreCall(str, chunkOffset, msgLen - chunkOffset, msgLen, true);\n
return getRawDigest(self$2.heap, self$2.padMaxChunkLen);\n
};\n
// The digest and digestFrom* interface returns the hash digest\n
// as a hex string.\n
this.digest = this.digestFromString = this.digestFromBuffer = this.digestFromArrayBuffer = function (str) {\n
return hex(rawDigest(str).buffer);\n
};\n
}\n
;\n
// The low-level RushCore module provides the heart of Rusha,\n
// a high-speed sha1 implementation working on an Int32Array heap.\n
// At first glance, the implementation seems complicated, however\n
// with the SHA1 spec at hand, it is obvious this almost a textbook\n
// implementation that has a few functions hand-inlined and a few loops\n
// hand-unrolled.\n
function RushaCore(stdlib, foreign, heap) {\n
\'use asm\';\n
var H = new stdlib.Int32Array(heap);\n
function hash(k, x) {\n
// k in bytes\n
k = k | 0;\n
x = x | 0;\n
var i = 0, j = 0, y0 = 0, z0 = 0, y1 = 0, z1 = 0, y2 = 0, z2 = 0, y3 = 0, z3 = 0, y4 = 0, z4 = 0, t0 = 0, t1 = 0;\n
y0 = H[x + 320 >> 2] | 0;\n
y1 = H[x + 324 >> 2] | 0;\n
y2 = H[x + 328 >> 2] | 0;\n
y3 = H[x + 332 >> 2] | 0;\n
y4 = H[x + 336 >> 2] | 0;\n
for (i = 0; (i | 0)
<
(k | 0); i = i + 64 | 0) {\n
z0 = y0;\n
z1 = y1;\n
z2 = y2;\n
z3 = y3;\n
z4 = y4;\n
for (j = 0; (j | 0)
< 64
;
j =
j
+
4
|
0)
{\n
t1 =
H[i
+
j
>
> 2] | 0;\n
t0 = ((y0
<
< 5
|
y0
>
>> 27) + (y1
&
y2 | ~y1
&
y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0;\n
y4 = y3;\n
y3 = y2;\n
y2 = y1
<
< 30
|
y1
>
>> 2;\n
y1 = y0;\n
y0 = t0;\n
;\n
H[k + j >> 2] = t1;\n
}\n
for (j = k + 64 | 0; (j | 0)
<
(k + 80 | 0); j = j + 4 | 0) {\n
t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2])
<
< 1
|
(H[j
-
12
>
> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n
t0 = ((y0
<
< 5
|
y0
>
>> 27) + (y1
&
y2 | ~y1
&
y3) | 0) + ((t1 + y4 | 0) + 1518500249 | 0) | 0;\n
y4 = y3;\n
y3 = y2;\n
y2 = y1
<
< 30
|
y1
>
>> 2;\n
y1 = y0;\n
y0 = t0;\n
;\n
H[j >> 2] = t1;\n
}\n
for (j = k + 80 | 0; (j | 0)
<
(k + 160 | 0); j = j + 4 | 0) {\n
t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2])
<
< 1
|
(H[j
-
12
>
> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n
t0 = ((y0
<
< 5
|
y0
>
>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) + 1859775393 | 0) | 0;\n
y4 = y3;\n
y3 = y2;\n
y2 = y1
<
< 30
|
y1
>
>> 2;\n
y1 = y0;\n
y0 = t0;\n
;\n
H[j >> 2] = t1;\n
}\n
for (j = k + 160 | 0; (j | 0)
<
(k + 240 | 0); j = j + 4 | 0) {\n
t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2])
<
< 1
|
(H[j
-
12
>
> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n
t0 = ((y0
<
< 5
|
y0
>
>> 27) + (y1
&
y2 | y1
&
y3 | y2
&
y3) | 0) + ((t1 + y4 | 0) - 1894007588 | 0) | 0;\n
y4 = y3;\n
y3 = y2;\n
y2 = y1
<
< 30
|
y1
>
>> 2;\n
y1 = y0;\n
y0 = t0;\n
;\n
H[j >> 2] = t1;\n
}\n
for (j = k + 240 | 0; (j | 0)
<
(k + 320 | 0); j = j + 4 | 0) {\n
t1 = (H[j - 12 >> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2])
<
< 1
|
(H[j
-
12
>
> 2] ^ H[j - 32 >> 2] ^ H[j - 56 >> 2] ^ H[j - 64 >> 2]) >>> 31;\n
t0 = ((y0
<
< 5
|
y0
>
>> 27) + (y1 ^ y2 ^ y3) | 0) + ((t1 + y4 | 0) - 899497514 | 0) | 0;\n
y4 = y3;\n
y3 = y2;\n
y2 = y1
<
< 30
|
y1
>
>> 2;\n
y1 = y0;\n
y0 = t0;\n
;\n
H[j >> 2] = t1;\n
}\n
y0 = y0 + z0 | 0;\n
y1 = y1 + z1 | 0;\n
y2 = y2 + z2 | 0;\n
y3 = y3 + z3 | 0;\n
y4 = y4 + z4 | 0;\n
}\n
H[x + 320 >> 2] = y0;\n
H[x + 324 >> 2] = y1;\n
H[x + 328 >> 2] = y2;\n
H[x + 332 >> 2] = y3;\n
H[x + 336 >> 2] = y4;\n
}\n
return { hash: hash };\n
}\n
}());;/*\n
* JIO extension for resource replication.\n
* Copyright (C) 2013, 2015 Nexedi SA\n
*\n
* This library is free software: you can redistribute it and/or modify\n
* it under the terms of the GNU Lesser General Public License as published by\n
* the Free Software Foundation, either version 3 of the License, or\n
* (at your option) any later version.\n
*\n
* This library is distributed in the hope that it will be useful,\n
* but WITHOUT ANY WARRANTY; without even the implied warranty of\n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n
* GNU Lesser General Public License for more details.\n
*\n
* You should have received a copy of the GNU Lesser General Public License\n
* along with this program. If not, see
<http:
//www.gnu.org/licenses
/>
.\n
*/\n
\n
/*jslint nomen: true*/\n
/*global jIO, RSVP, Rusha*/\n
\n
(function (jIO, RSVP, Rusha) {\n
"use strict";\n
\n
var rusha = new Rusha();\n
\n
/****************************************************\n
Use a local jIO to read/write/search documents\n
Synchronize in background those document with a remote jIO.\n
Synchronization status is stored for each document as an local attachment.\n
****************************************************/\n
\n
function generateHash(content) {\n
// XXX Improve performance by moving calculation to WebWorker\n
return rusha.digestFromString(content);\n
}\n
\n
function ReplicateStorage(spec) {\n
this._query_options = spec.query || {};\n
\n
this._local_sub_storage = jIO.createJIO(spec.local_sub_storage);\n
this._remote_sub_storage = jIO.createJIO(spec.remote_sub_storage);\n
\n
this._signature_hash = "_replicate_" + generateHash(\n
JSON.stringify(spec.local_sub_storage) +\n
JSON.stringify(spec.remote_sub_storage) +\n
JSON.stringify(this._query_options)\n
);\n
this._signature_sub_storage = jIO.createJIO({\n
type: "document",\n
document_id: this._signature_hash,\n
sub_storage: spec.local_sub_storage\n
});\n
\n
this._use_remote_post = spec.use_remote_post || false;\n
}\n
\n
ReplicateStorage.prototype.remove = function (id) {\n
if (id === this._signature_hash) {\n
throw new jIO.util.jIOError(this._signature_hash + " is frozen",\n
403);\n
}\n
return this._local_sub_storage.remove.apply(this._local_sub_storage,\n
arguments);\n
};\n
ReplicateStorage.prototype.post = function () {\n
return this._local_sub_storage.post.apply(this._local_sub_storage,\n
arguments);\n
};\n
ReplicateStorage.prototype.put = function (id) {\n
if (id === this._signature_hash) {\n
throw new jIO.util.jIOError(this._signature_hash + " is frozen",\n
403);\n
}\n
return this._local_sub_storage.put.apply(this._local_sub_storage,\n
arguments);\n
};\n
ReplicateStorage.prototype.get = function () {\n
return this._local_sub_storage.get.apply(this._local_sub_storage,\n
arguments);\n
};\n
ReplicateStorage.prototype.hasCapacity = function () {\n
return this._local_sub_storage.hasCapacity.apply(this._local_sub_storage,\n
arguments);\n
};\n
ReplicateStorage.prototype.buildQuery = function () {\n
// XXX Remove signature document?\n
return this._local_sub_storage.buildQuery.apply(this._local_sub_storage,\n
arguments);\n
};\n
\n
ReplicateStorage.prototype.repair = function () {\n
var context = this,\n
argument_list = arguments,\n
skip_document_dict = {};\n
\n
// Do not sync the signature document\n
skip_document_dict[context._signature_hash] = null;\n
\n
function propagateModification(destination, doc, hash, id, options) {\n
var result,\n
to_skip = true;\n
if (options === undefined) {\n
options = {};\n
}\n
if (options.use_post) {\n
result = destination.post(doc)\n
.push(function () {\n
to_skip = false;\n
});\n
} else {\n
result = destination.put(id, doc);\n
}\n
return result\n
.push(function () {\n
return context._signature_sub_storage.put(id, {\n
"hash": hash\n
});\n
})\n
.push(function () {\n
if (to_skip) {\n
skip_document_dict[id] = null;\n
}\n
});\n
}\n
\n
function checkLocalCreation(queue, source, destination, id, options) {\n
var remote_doc;\n
queue\n
.push(function () {\n
return destination.get(id);\n
})\n
.push(function (doc) {\n
remote_doc = doc;\n
}, function (error) {\n
if ((error instanceof jIO.util.jIOError)
&&
\n
(error.status_code === 404)) {\n
// This document was never synced.\n
// Push it to the remote storage and store sync information\n
return;\n
}\n
throw error;\n
})\n
.push(function () {\n
// This document was never synced.\n
// Push it to the remote storage and store sync information\n
return source.get(id);\n
})\n
.push(function (doc) {\n
var local_hash = generateHash(JSON.stringify(doc)),\n
remote_hash;\n
if (remote_doc === undefined) {\n
return propagateModification(destination, doc, local_hash, id,\n
options);\n
}\n
\n
remote_hash = generateHash(JSON.stringify(remote_doc));\n
if (local_hash === remote_hash) {\n
// Same document\n
return context._signature_sub_storage.put(id, {\n
"hash": local_hash\n
})\n
.push(function () {\n
skip_document_dict[id] = null;\n
});\n
}\n
// Already exists on destination\n
throw new jIO.util.jIOError("Conflict on \'" + id + "\'",\n
409);\n
});\n
}\n
\n
function checkLocalDeletion(queue, destination, id, source) {\n
var status_hash;\n
queue\n
.push(function () {\n
return context._signature_sub_storage.get(id);\n
})\n
.push(function (result) {\n
status_hash = result.hash;\n
return destination.get(id)\n
.push(function (doc) {\n
var remote_hash = generateHash(JSON.stringify(doc));\n
if (remote_hash === status_hash) {\n
return destination.remove(id)\n
.push(function () {\n
return context._signature_sub_storage.remove(id);\n
})\n
.push(function () {\n
skip_document_dict[id] = null;\n
});\n
}\n
// Modifications on remote side\n
// Push them locally\n
return propagateModification(source, doc, remote_hash, id);\n
}, function (error) {\n
if ((error instanceof jIO.util.jIOError)
&&
\n
(error.status_code === 404)) {\n
return context._signature_sub_storage.remove(id)\n
.push(function () {\n
skip_document_dict[id] = null;\n
});\n
}\n
throw error;\n
});\n
});\n
}\n
\n
function checkSignatureDifference(queue, source, destination, id) {\n
queue\n
.push(function () {\n
return RSVP.all([\n
source.get(id),\n
context._signature_sub_storage.get(id)\n
]);\n
})\n
.push(function (result_list) {\n
var doc = result_list[0],\n
local_hash = generateHash(JSON.stringify(doc)),\n
status_hash = result_list[1].hash;\n
\n
if (local_hash !== status_hash) {\n
// Local modifications\n
return destination.get(id)\n
.push(function (remote_doc) {\n
var remote_hash = generateHash(JSON.stringify(remote_doc));\n
if (remote_hash !== status_hash) {\n
// Modifications on both sides\n
if (local_hash === remote_hash) {\n
// Same modifications on both side \\o/\n
return context._signature_sub_storage.put(id, {\n
"hash": local_hash\n
})\n
.push(function () {\n
skip_document_dict[id] = null;\n
});\n
}\n
throw new jIO.util.jIOError("Conflict on \'" + id + "\'",\n
409);\n
}\n
return propagateModification(destination, doc, local_hash, id);\n
}, function (error) {\n
if ((error instanceof jIO.util.jIOError)
&&
\n
(error.status_code === 404)) {\n
// Document has been deleted remotely\n
return propagateModification(destination, doc, local_hash,\n
id);\n
}\n
throw error;\n
});\n
}\n
});\n
}\n
\n
function pushStorage(source, destination, options) {\n
var queue = new RSVP.Queue();\n
if (!options.hasOwnProperty("use_post")) {\n
options.use_post = false;\n
}\n
return queue\n
.push(function () {\n
return RSVP.all([\n
source.allDocs(context._query_options),\n
context._signature_sub_storage.allDocs()\n
]);\n
})\n
.push(function (result_list) {\n
var i,\n
local_dict = {},\n
signature_dict = {},\n
key;\n
for (i = 0; i
< result_list
[0].data.total_rows;
i
+=
1)
{\n
if
(!skip_document_dict.hasOwnProperty(\n
result_list[0].data.rows[i].id\n
))
{\n
local_dict[result_list[0].data.rows[i].id]
=
i;\n
}\n
}\n
for
(
i =
0;
i
<
result_list[1].data.total_rows;
i
+=
1)
{\n
if
(!skip_document_dict.hasOwnProperty(\n
result_list[1].data.rows[i].id\n
))
{\n
signature_dict[result_list[1].data.rows[i].id]
=
i;\n
}\n
}\n
for
(key
in
local_dict)
{\n
if
(local_dict.hasOwnProperty(key))
{\n
if
(!signature_dict.hasOwnProperty(key))
{\n
checkLocalCreation(queue,
source,
destination,
key,
options);\n
}\n
}\n
}\n
for
(key
in
signature_dict)
{\n
if
(signature_dict.hasOwnProperty(key))
{\n
if
(local_dict.hasOwnProperty(key))
{\n
checkSignatureDifference(queue,
source,
destination,
key);\n
}
else
{\n
checkLocalDeletion(queue,
destination,
key,
source);\n
}\n
}\n
}\n
});\n
}\n
\n
return
new
RSVP.Queue()\n
.push(function
()
{\n
//
Ensure
that
the
document
storage
is
usable\n
return
context._signature_sub_storage.__storage._sub_storage.get(\n
context._signature_hash\n
);\n
})\n
.push(undefined,
function
(error)
{\n
if
((error
instanceof
jIO.util.jIOError)
&&\n
(
error.status_code =
==
404))
{\n
return
context._signature_sub_storage.__storage._sub_storage.put(\n
context._signature_hash,\n
{}\n
);\n
}\n
throw
error;\n
})\n
\n
.push(function
()
{\n
return
RSVP.all([\n
//
Don\'t
repair
local_sub_storage
twice\n
//
context._signature_sub_storage.repair.apply(\n
//
context._signature_sub_storage,\n
//
argument_list\n
//
),\n
context._local_sub_storage.repair.apply(\n
context._local_sub_storage,\n
argument_list\n
),\n
context._remote_sub_storage.repair.apply(\n
context._remote_sub_storage,\n
argument_list\n
)\n
]);\n
})\n
\n
.push(function
()
{\n
return
pushStorage(context._local_sub_storage,\n
context._remote_sub_storage,\n
{use_post:
context._use_remote_post});\n
})\n
.push(function
()
{\n
return
pushStorage(context._remote_sub_storage,\n
context._local_sub_storage,
{});\n
});\n
};\n
\n
jIO.addStorage(\'replicate\',
ReplicateStorage);\n
\n
}(jIO,
RSVP,
Rusha));\n
;/*\n
*
Copyright
2015,
Nexedi
SA\n
*
Released
under
the
LGPL
license.\n
*
http://www.gnu.org/licenses/lgpl.html\n
*/\n
\n
/*jslint
nomen:
true*/\n
/*global
Rusha*/\n
\n
/**\n
*
JIO
Sha
Storage.
Type =
\'sha\'.\n
*/\n
\n
(function
(Rusha)
{\n
"use
strict";\n
\n
var
rusha =
new
Rusha();\n
\n
function
ShaStorage(spec)
{\n
this._sub_storage =
jIO.createJIO(spec.sub_storage);\n
}\n
\n
ShaStorage.prototype.post =
function
(param)
{\n
return
this._sub_storage.put(\n
rusha.digestFromString(JSON.stringify(param)),\n
param\n
);\n
};\n
\n
ShaStorage.prototype.get =
function
()
{\n
return
this._sub_storage.get.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.remove =
function
()
{\n
return
this._sub_storage.remove.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.hasCapacity =
function
()
{\n
return
this._sub_storage.hasCapacity.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.buildQuery =
function
()
{\n
return
this._sub_storage.buildQuery.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.getAttachment =
function
()
{\n
return
this._sub_storage.getAttachment.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.putAttachment =
function
()
{\n
return
this._sub_storage.putAttachment.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.removeAttachment =
function
()
{\n
return
this._sub_storage.removeAttachment.apply(this._sub_storage,\n
arguments);\n
};\n
ShaStorage.prototype.allAttachments =
function
()
{\n
return
this._sub_storage.allAttachments.apply(this._sub_storage,
arguments);\n
};\n
ShaStorage.prototype.repair =
function
()
{\n
return
this._sub_storage.repair.apply(this._sub_storage,
arguments);\n
};\n
\n
jIO.addStorage(\'sha\',
ShaStorage);\n
\n
}(Rusha));\n
;/*jslint
nomen:
true*/\n
(function
(jIO)
{\n
"use
strict";\n
...
...
@@ -5978,6 +6876,9 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
return
this._sub_storage.removeAttachment.apply(this._sub_storage,\n
arguments);\n
};\n
UUIDStorage.prototype.repair =
function
()
{\n
return
this._sub_storage.repair.apply(this._sub_storage,
arguments);\n
};\n
UUIDStorage.prototype.hasCapacity =
function
(name)
{\n
return
this._sub_storage.hasCapacity(name);\n
};\n
...
...
@@ -6754,6 +7655,48 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
}\n
return
false;\n
};\n
\n
UnionStorage.prototype.repair =
function
()
{\n
var
i,\n
promise_list =
[];\n
for
(
i =
0;
i
<
this._storage_list.length;
i
+=
1)
{\n
promise_list.push(this._storage_list[i].repair.apply(\n
this._storage_list[i],\n
arguments\n
));\n
}\n
return
RSVP.all(promise_list);\n
};\n
\n
UnionStorage.prototype.getAttachment =
function
()
{\n
var
argument_list =
arguments,\n
context =
this;\n
return
this._getWithStorageIndex.apply(this,
arguments)\n
.push(function
(result)
{\n
var
sub_storage =
context._storage_list[result[0]];\n
return
sub_storage.getAttachment.apply(sub_storage,
argument_list);\n
});\n
};\n
\n
UnionStorage.prototype.putAttachment =
function
()
{\n
var
argument_list =
arguments,\n
context =
this;\n
return
this._getWithStorageIndex.apply(this,
arguments)\n
.push(function
(result)
{\n
var
sub_storage =
context._storage_list[result[0]];\n
return
sub_storage.putAttachment.apply(sub_storage,
argument_list);\n
});\n
};\n
\n
UnionStorage.prototype.removeAttachment =
function
()
{\n
var
argument_list =
arguments,\n
context =
this;\n
return
this._getWithStorageIndex.apply(this,
arguments)\n
.push(function
(result)
{\n
var
sub_storage =
context._storage_list[result[0]];\n
return
sub_storage.removeAttachment.apply(sub_storage,
argument_list);\n
});\n
};\n
\n
jIO.addStorage(\'union\',
UnionStorage);\n
\n
...
...
@@ -6798,6 +7741,8 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
return
getSiteDocument(storage)\n
.push(function
(site_hal)
{\n
//
XXX
need
to
get
modified
metadata\n
return
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.ajax({\n
"type":
"GET",\n
"url":
UriTemplate.parse(site_hal._links.traverse.href)\n
...
...
@@ -6809,6 +7754,67 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
withCredentials:
true\n
}\n
});\n
})\n
.push(undefined,
function
(error)
{\n
if
((error.target
!==
undefined)
&&\n
(
error.target.status =
==
404))
{\n
throw
new
jIO.util.jIOError("Cannot
find
document:
"
+
id,
404);\n
}\n
throw
error;\n
});\n
});\n
}\n
\n
var
allowed_field_dict =
{\n
"StringField":
null,\n
"IntegerField":
null,\n
"FloatField":
null,\n
"TextAreaField":
null\n
};\n
\n
function
extractPropertyFromForm(context,
id)
{\n
return
context.getAttachment(id,
"view")\n
.push(function
(blob)
{\n
return
jIO.util.readBlobAsText(blob);\n
})\n
.push(function
(evt)
{\n
return
JSON.parse(evt.target.result);\n
})\n
.push(function
(json)
{\n
var
form =
json._embedded._view,\n
converted_json =
{\n
portal_type:
json.portal_type\n
},\n
form_data_json =
{},\n
field,\n
key;\n
\n
form_data_json.form_id =
{\n
"key":
[form.form_id.key],\n
"default":
form.form_id["default"]\n
};\n
//
XXX
How
to
store
datetime\n
for
(key
in
form)
{\n
if
(form.hasOwnProperty(key))
{\n
field =
form[key];\n
if
((key.indexOf(\'my_\')
===
0)
&&\n
(field.editable)
&&\n
(allowed_field_dict.hasOwnProperty(field.type)))
{\n
\n
form_data_json[key.substring(3)]
=
{\n
"default":
field["default"],\n
"key":
field.key\n
};\n
converted_json[key.substring(3)]
=
field["default"];\n
}\n
}\n
}\n
\n
return
{\n
action_href:
form._actions.put.href,\n
data:
converted_json,\n
form_data:
form_data_json\n
};\n
});\n
}\n
\n
...
...
@@ -6823,29 +7829,98 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
}\n
\n
ERP5Storage.prototype.get =
function
(id)
{\n
return
getDocumentAndHateoas(this,
id)\n
.push(function
(response)
{\n
var
result =
JSON.parse(response.target.responseText),\n
key;\n
//
action_type;\n
result.portal_type =
result._links.type.name;\n
\n
return
extractPropertyFromForm(this,
id)\n
.push(function
(result)
{\n
var
key;\n
result =
result.data;\n
//
Remove
all
ERP5
hateoas
links
/
convert
them
into
jIO
ID\n
for
(key
in
result)
{\n
if
(result.hasOwnProperty(key))
{\n
if
(
key.indexOf("_")
===
0
)
{\n
if
(
!result[key]
)
{\n
delete
result[key];\n
}\n
}\n
}\n
\n
return
result;\n
});\n
};\n
\n
ERP5Storage.prototype.post =
function
(data)
{\n
var
context =
this,\n
new_id;\n
\n
return
getSiteDocument(this)\n
.push(function
(site_hal)
{\n
var
form_data =
new
FormData();\n
form_data.append("portal_type",
data.portal_type);\n
form_data.append("parent_relative_url",
data.parent_relative_url);\n
return
jIO.util.ajax({\n
type:
"POST",\n
url:
site_hal._actions.add.href,\n
data:
form_data,\n
xhrFields:
{\n
withCredentials:
true\n
}\n
});\n
})\n
.push(function
(evt)
{\n
var
location =
evt.target.getResponseHeader("X-Location"),\n
uri =
new
URI(location);\n
new_id =
uri.segment(2);\n
return
context.put(new_id,
data);\n
})\n
.push(function
()
{\n
return
new_id;\n
});\n
};\n
\n
ERP5Storage.prototype.put =
function
(id,
data)
{\n
var
context =
this;\n
\n
return
extractPropertyFromForm(context,
id)\n
.push(function
(result)
{\n
var
key,\n
json =
result.form_data,\n
form_data =
{};\n
form_data[json.form_id.key]
=
json.form_id["default"];\n
\n
//
XXX
How
to
store
datetime:!!!!!\n
for
(key
in
data)
{\n
if
(data.hasOwnProperty(key))
{\n
if
(
key =
==
"form_id")
{\n
throw
new
jIO.util.jIOError(\n
"ERP5:
forbidden
property:
"
+
key,\n
400\n
);\n
}\n
if
((key
!==
"portal_type")
&&
(key
!==
"parent_relative_url"))
{\n
if
(!json.hasOwnProperty(key))
{\n
throw
new
jIO.util.jIOError(\n
"ERP5:
can
not
store
property:
"
+
key,\n
400\n
);\n
}\n
form_data[json[key].key]
=
data[key];\n
}\n
}\n
}\n
return
context.putAttachment(\n
id,\n
result.action_href,\n
new
Blob([JSON.stringify(form_data)],
{type:
"application/json"})\n
);\n
});\n
};\n
\n
ERP5Storage.prototype.allAttachments =
function
(id)
{\n
var
context =
this;\n
return
getDocumentAndHateoas(this,
id)\n
.push(function
()
{\n
if
(
context._default_view_reference =
==
undefined)
{\n
return
{\n
links:
{}\n
};\n
}\n
return
{\n
view:
{},\n
links:
{}\n
...
...
@@ -6856,6 +7931,12 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
ERP5Storage.prototype.getAttachment =
function
(id,
action)
{\n
\n
if
(
action =
==
"view")
{\n
if
(
this._default_view_reference =
==
undefined)
{\n
throw
new
jIO.util.jIOError(\n
"Cannot
find
attachment
view
for:
"
+
id,\n
404\n
);\n
}\n
return
getDocumentAndHateoas(this,
id,\n
{"_view":
this._default_view_reference})\n
.push(function
(response)
{\n
...
...
@@ -7032,6 +8113,9 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
return
this._sub_storage.removeAttachment.apply(this._sub_storage,\n
arguments);\n
};\n
QueryStorage.prototype.repair =
function
()
{\n
return
this._sub_storage.repair.apply(this._sub_storage,
arguments);\n
};\n
\n
QueryStorage.prototype.hasCapacity =
function
(name)
{\n
if
(
name =
==
"list")
{\n
...
...
@@ -7208,10 +8292,12 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
this._sub_storage =
jIO.createJIO(spec.sub_storage);\n
}\n
var
DOCUMENT_EXTENSION =
".json"
,\n
DOCUMENT_REGEXP =
new
RegExp("^([\\\\
w=
]+)"
+\n
DOCUMENT_EXTENSION
+
"$"),\n
DOCUMENT_KEY =
"/.jio_documents/"
,\n
ROOT =
"/"
;\n
\n
function
endsWith(str,
suffix)
{\n
return
str.indexOf(suffix,
str.length
-
suffix.length)
!==
-1;\n
}\n
\n
FileSystemBridgeStorage.prototype.get =
function
(id)
{\n
var
context =
this;\n
...
...
@@ -7223,18 +8309,11 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
//
First
get
the
document
itself
if
it
exists\n
return
context._sub_storage.getAttachment(\n
DOCUMENT_KEY,\n
id
+
DOCUMENT_EXTENSION\n
id
+
DOCUMENT_EXTENSION,\n
{format:
"json"}\n
);\n
})\n
.push(function
(blob)
{\n
return
new
RSVP.Queue()\n
.push(function
()
{\n
return
jIO.util.readBlobAsText(blob);\n
})\n
.push(function
(text)
{\n
return
JSON.parse(text.target.result);\n
});\n
},
function
(error)
{\n
.push(undefined,
function
(error)
{\n
if
((error
instanceof
jIO.util.jIOError)
&&\n
(
error.status_code =
==
404))
{\n
\n
...
...
@@ -7368,8 +8447,11 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
var
key;\n
for
(key
in
result)
{\n
if
(result.hasOwnProperty(key))
{\n
if
(DOCUMENT_REGEXP.test(key))
{\n
result_dict[DOCUMENT_REGEXP.exec(key)[1]]
=
null;\n
if
(endsWith(key,
DOCUMENT_EXTENSION))
{\n
result_dict[key.substring(\n
0,\n
key.length
-
DOCUMENT_EXTENSION.length\n
)]
=
null;\n
}\n
}\n
}\n
...
...
@@ -7443,6 +8525,10 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
\n
return
this._sub_storage.removeAttachment(ROOT,
id);\n
};\n
\n
FileSystemBridgeStorage.prototype.repair =
function
()
{\n
return
this._sub_storage.repair.apply(this._sub_storage,
arguments);\n
};\n
\n
jIO.addStorage(\'drivetojiomapping\',
FileSystemBridgeStorage);\n
\n
...
...
@@ -7478,14 +8564,9 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
DocumentStorage.prototype.get =
function
(id)
{\n
return
this._sub_storage.getAttachment(\n
this._document_id,\n
getSubAttachmentIdFromParam(id)\n
)\n
.push(function
(blob)
{\n
return
jIO.util.readBlobAsText(blob);\n
})\n
.push(function
(text)
{\n
return
JSON.parse(text.target.result);\n
});\n
getSubAttachmentIdFromParam(id),\n
{format:
"json"}\n
);\n
};\n
\n
DocumentStorage.prototype.allAttachments =
function
(id)
{\n
...
...
@@ -7536,6 +8617,10 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
return
id;\n
});\n
};\n
\n
DocumentStorage.prototype.repair =
function
()
{\n
return
this._sub_storage.repair.apply(this._sub_storage,
arguments);\n
};\n
\n
DocumentStorage.prototype.hasCapacity =
function
(capacity)
{\n
return
(
capacity =
==
"list");\n
...
...
@@ -7877,6 +8962,7 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
\n
IndexedDBStorage.prototype.getAttachment = function (id, name, options) {\n
var transaction,\n
type,\n
start,\n
end;\n
if (options === undefined) {\n
...
...
@@ -7897,6 +8983,7 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
start_index,\n
end_index;\n
\n
type = attachment.info.content_type;\n
start = options.start || 0;\n
end = options.end || total_length;\n
if (end > total_length) {\n
...
...
@@ -7934,8 +9021,11 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
for (i = 0; i
< len
;
i
+=
1)
{\n
array_buffer_list.push(result_list[i].blob);\n
}\n
if
((
options.start =
==
undefined)
&&
(
options.end =
==
undefined))
{\n
return
new
Blob(array_buffer_list,
{type:
type});\n
}\n
blob =
new
Blob(array_buffer_list,
{type:
"application/octet-stream"});\n
return
blob.slice(start,
end);\n
return
blob.slice(start,
end
,
"application/octet-stream"
);\n
});\n
};\n
\n
...
...
@@ -8162,7 +9252,7 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
94
1.55617.298.51882
</string>
</value>
<value>
<string>
94
2.40553.20339.32529
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
...
...
@@ -8180,7 +9270,7 @@ Query.searchTextToRegExp = searchTextToRegExp;\n
</tuple>
<state>
<tuple>
<float>
14
28655194.19
</float>
<float>
14
30410922.96
</float>
<string>
GMT
</string>
</tuple>
</state>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment