From c222dc584d67331c218c693031e1330510f61162 Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Fri, 4 Sep 2015 09:40:24 +0000
Subject: [PATCH] [erp5_officejs] Add gadgets to share/access a jIO storage
 through WebRTC

---
 ...et_officejs_page_share_webrtc_jio_html.xml | 380 ++++++++++++
 ...dget_officejs_page_share_webrtc_jio_js.xml | 573 ++++++++++++++++++
 .../gadget_officejs_webrtc_jio_html.xml       | 353 +++++++++++
 .../gadget_officejs_webrtc_jio_js.xml         | 487 +++++++++++++++
 4 files changed, 1793 insertions(+)
 create mode 100644 bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_html.xml
 create mode 100644 bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_js.xml
 create mode 100644 bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_html.xml
 create mode 100644 bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_js.xml

diff --git a/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_html.xml b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_html.xml
new file mode 100644
index 0000000000..7f3d3df8c2
--- /dev/null
+++ b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_html.xml
@@ -0,0 +1,380 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Page" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>text/html</string> </value>
+        </item>
+        <item>
+            <key> <string>contributors</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_officejs_page_share_webrtc_jio.html</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>gadget_officejs_page_share_webrtc_jio_html</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value> <string>en</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Page</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+<!doctype html>\n
+<html>\n
+  <head>\n
+    <meta charset="utf-8">\n
+    <meta name="viewport" content="width=device-width, initial-scale=1">\n
+\n
+    <title>Share jIO</title>\n
+\n
+    <script src="rsvp.js"></script>\n
+    <script src="renderjs.js"></script>\n
+    <script src="gadget_officejs_page_share_webrtc_jio.js"></script>\n
+  </head>\n
+\n
+  <body>\n
+    <div class="ui-grid-b ui-responsive">\n
+      <div class="ui-block-a"></div>\n
+      <div class="ui-block-b">\n
+        <p data-i18n="This is a renderJS gadget which shares a jIO storage via WebRTC.">This is a renderJS gadget which shares a jIO storage via WebRTC.</p>\n
+        <h2 data-i18n="Peer list">Peer list</h2>\n
+        <p><span data-i18n="Connected peers:">Connected peers:</span> <span class="peer_count">0</span></p>\n
+        <pre class="info"></pre>\n
+      </div>\n
+      <div class="ui-block-c"></div>\n
+    </div>\n
+\n
+    <div class="gadget_websocket">\n
+      <div data-gadget-url="gadget_websocket.html" data-gadget-scope="gadget_websocket.html">\n
+      </div>\n
+    </div>\n
+    <div class="gadget_webrtc_datachannel"></div>\n
+  </body>\n
+</html>\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>text_content_substitution_mapping_method_id</string> </key>
+            <value> <string>WebPage_getRenderJSSubstitutionMappingDict</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>OfficeJS Share jIO Page</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>001</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>publish_alive</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441024774.39</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+            <item>
+                <key> <string>validation_state</string> </key>
+                <value> <string>published_alive</string> </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>edit</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value>
+                  <none/>
+                </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>945.33680.60468.51660</string> </value>
+            </item>
+            <item>
+                <key> <string>state</string> </key>
+                <value> <string>current</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441358472.38</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>detect_converted_file</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>external_processing_state</string> </key>
+                <value> <string>converted</string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>0.0.0.0</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1440770697.61</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_js.xml b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_js.xml
new file mode 100644
index 0000000000..3a084b6710
--- /dev/null
+++ b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_page_share_webrtc_jio_js.xml
@@ -0,0 +1,573 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Script" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>contributors</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_officejs_page_share_webrtc_jio.js</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>gadget_officejs_page_share_webrtc_jio_js</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value> <string>en</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Script</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/*global window, rJS, document, RSVP, console, DOMException */\n
+/*jslint indent: 2, maxerr: 3 */\n
+(function (window, rJS, document, RSVP, console, DOMException) {\n
+  "use strict";\n
+\n
+  function dropSubGadget(gadget, scope) {\n
+    return gadget.getDeclaredGadget(scope)\n
+      .push(function (result) {\n
+        return result.getElement();\n
+      })\n
+      .push(function (element) {\n
+        if (element.parentElement) {\n
+          element.parentElement.removeChild(element);\n
+        }\n
+        delete gadget.state_parameter_dict.scope_ip[scope];\n
+        return gadget.dropGadget(scope);\n
+      });\n
+  }\n
+\n
+  function getWebRTCScopeList(gadget) {\n
+    var result_list = [],\n
+      element_list = gadget.state_parameter_dict.element.querySelector(".gadget_webrtc_datachannel")\n
+                                                        .childNodes,\n
+      i;\n
+    for (i = 0; i < element_list.length; i += 1) {\n
+      result_list.push(element_list[i].getAttribute("data-gadget-scope"));\n
+    }\n
+    return result_list;\n
+  }\n
+\n
+  function updateInfo(gadget) {\n
+    var scope_list = getWebRTCScopeList(gadget),\n
+      i,\n
+      result = "";\n
+    for (i = 0; i < scope_list.length; i += 1) {\n
+      result += gadget.state_parameter_dict.scope_ip[scope_list[i]] + "\\n";\n
+    }\n
+    gadget.state_parameter_dict.element.querySelector(".info").textContent = result;\n
+    gadget.state_parameter_dict.element.querySelector(".peer_count").textContent = i;\n
+  }\n
+\n
+  function sendWebRTC(gadget, rtc_gadget, scope, message) {\n
+    return rtc_gadget.send(message)\n
+      .push(undefined, function (error) {\n
+        if ((error instanceof DOMException) && (error.name === \'InvalidStateError\')) {\n
+          return dropSubGadget(gadget, scope)\n
+            .push(function () {\n
+              return updateInfo(gadget);\n
+            }, function (error) {\n
+              console.log("-- Can not drop remote subgadget " + scope);\n
+              console.log(error);\n
+              return;\n
+            });\n
+        }\n
+        throw error;\n
+      });\n
+  }\n
+\n
+  rJS(window)\n
+\n
+    .ready(function (gadget) {\n
+      // Initialize the gadget local parameters\n
+      gadget.state_parameter_dict = {\n
+        websocket_initialized: false,\n
+        counter: 0,\n
+        connecting: false,\n
+        scope_ip: {}\n
+      };\n
+      return gadget.getElement()\n
+        .push(function (element) {\n
+          gadget.state_parameter_dict.element = element;\n
+        })\n
+        .push(function () {\n
+          return updateInfo(gadget);\n
+        });\n
+    })\n
+\n
+    .declareAcquiredMethod("jio_allDocs", "jio_allDocs")\n
+    .declareAcquiredMethod("jio_post", "jio_post")\n
+    .declareAcquiredMethod("jio_put", "jio_put")\n
+    .declareAcquiredMethod("jio_get", "jio_get")\n
+    .declareAcquiredMethod("jio_repair", "jio_repair")\n
+\n
+    .allowPublicAcquisition(\'notifyDataChannelClosed\', function (argument_list, scope) {\n
+      /*jslint unparam:true*/\n
+      var gadget = this;\n
+      return dropSubGadget(this, scope)\n
+        .push(function () {\n
+          return updateInfo(gadget);\n
+        });\n
+    })\n
+\n
+    .allowPublicAcquisition("notifyDataChannelMessage", function (argument_list, scope) {\n
+      var json = JSON.parse(argument_list[0]),\n
+        rtc_gadget,\n
+        context = this;\n
+      return context.getDeclaredGadget(scope)\n
+        .push(function (g) {\n
+          rtc_gadget = g;\n
+          // Call jio API\n
+          return context["jio_" + json.method_name].apply(context, json.argument_list);\n
+        })\n
+        .push(function (result) {\n
+          return sendWebRTC(context, rtc_gadget, scope, JSON.stringify({\n
+            id: json.id,\n
+            result: result,\n
+            type: "jio_response"\n
+          }));\n
+        }, function (error) {\n
+          return sendWebRTC(context, rtc_gadget, scope, JSON.stringify({\n
+            id: json.id,\n
+            result: error,\n
+            type: "error"\n
+          }));\n
+        });\n
+    })\n
+/*\n
+    .allowPublicAcquisition("notifyWebSocketClosed", function () {\n
+      if (this.state_parameter_dict.user_type !== "user") {\n
+        throw new Error("Unexpected Web Socket connection close");\n
+      }\n
+    })\n
+*/\n
+    .allowPublicAcquisition("notifyWebSocketMessage", function (argument_list) {\n
+      var json = JSON.parse(argument_list[0]),\n
+        scope,\n
+        rtc_gadget,\n
+        socket_gadget,\n
+        gadget = this;\n
+\n
+      if (json.action === "offer") {\n
+        // XXX https://github.com/diafygi/webrtc-ips\n
+        return gadget.getDeclaredGadget("gadget_websocket.html")\n
+          .push(function (gg) {\n
+            gadget.state_parameter_dict.connecting = true;\n
+            gadget.state_parameter_dict.counter += 1;\n
+            socket_gadget = gg;\n
+            var new_element = document.createElement("div");\n
+            gadget.state_parameter_dict.element.querySelector(".gadget_webrtc_datachannel").appendChild(new_element);\n
+            scope = "webrtc" + gadget.state_parameter_dict.counter;\n
+            return gadget.declareGadget("gadget_webrtc_datachannel.html", {\n
+              scope: scope,\n
+              element: new_element\n
+            });\n
+          })\n
+          .push(function (gg) {\n
+            rtc_gadget = gg;\n
+            // https://github.com/diafygi/webrtc-ips\n
+            var ip_regex = /([0-9]{1,3}(\\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/,\n
+              ip_list = [],\n
+              ip_dict = {},\n
+              ip_addr,\n
+              line_list = JSON.parse(json.data).sdp.split(\'\\n\'),\n
+              i;\n
+            for (i = 0; i < line_list.length; i += 1) {\n
+              if (line_list[i].indexOf(\'a=candidate:\') === 0) {\n
+                ip_addr = ip_regex.exec(line_list[i])[1];\n
+                if (!ip_addr.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/)) {\n
+                  // Hide ipv6\n
+                  if (!ip_dict[ip_addr]) {\n
+                    ip_list.push(ip_addr);\n
+                    ip_dict[ip_addr] = true;\n
+                  }\n
+                }\n
+              }\n
+            }\n
+            gadget.state_parameter_dict.scope_ip[scope] = ip_list;\n
+            return rtc_gadget.createAnswer(json.from, json.data);\n
+          })\n
+          .push(function (local_connection) {\n
+            return socket_gadget.send(JSON.stringify({to: json.from, action: "answer", data: local_connection}));\n
+          })\n
+          .push(function () {\n
+            return RSVP.any([\n
+              RSVP.Queue()\n
+                .push(function () {\n
+                  return RSVP.delay(10000);\n
+                })\n
+                .push(function () {\n
+                  console.info(\'-- webrtc client disappears...\');\n
+                  return dropSubGadget(gadget, scope);\n
+                }),\n
+              rtc_gadget.waitForConnection()\n
+            ]);\n
+          })\n
+          .push(function () {\n
+            gadget.state_parameter_dict.connecting = false;\n
+            return updateInfo(gadget);\n
+          });\n
+      }\n
+    })\n
+\n
+    .declareService(function () {\n
+      var sgadget,\n
+        gadget = this;\n
+      return this.getDeclaredGadget(\'gadget_websocket.html\')\n
+        .push(function (socket_gadget) {\n
+          sgadget = socket_gadget;\n
+          return socket_gadget.createSocket("ws://127.0.0.1:9999/");\n
+        })\n
+        .push(function () {\n
+          // Wait for the gadget to be dropped from the page\n
+          // and close the socket/rtc connections\n
+          return RSVP.defer().promise;\n
+        })\n
+        .push(undefined, function (error) {\n
+          if (sgadget === undefined) {\n
+            return;\n
+          }\n
+          return sgadget.close()\n
+            .push(function () {\n
+              var scope_list = getWebRTCScopeList(gadget),\n
+                i,\n
+                promise_list = [];\n
+\n
+              function close(scope) {\n
+                return gadget.getDeclaredGadget(scope)\n
+                  .push(function (rtc_gadget) {\n
+                    return rtc_gadget.close();\n
+                  });\n
+              }\n
+\n
+              for (i = 0; i < scope_list.length; i += 1) {\n
+                promise_list.push(close(scope_list[i]));\n
+              }\n
+              return RSVP.all(promise_list);\n
+            })\n
+            .push(function () {\n
+              throw error;\n
+            });\n
+        });\n
+    });\n
+\n
+}(window, rJS, document, RSVP, console, DOMException));
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>OfficeJS Share jIO Page JS</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>001</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>publish_alive</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441026776.09</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+            <item>
+                <key> <string>validation_state</string> </key>
+                <value> <string>published_alive</string> </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>edit</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value>
+                  <none/>
+                </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>945.33680.49983.21452</string> </value>
+            </item>
+            <item>
+                <key> <string>state</string> </key>
+                <value> <string>current</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441358513.14</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>detect_converted_file</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>external_processing_state</string> </key>
+                <value> <string>converted</string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>0.0.0.0</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1440770697.62</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_html.xml b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_html.xml
new file mode 100644
index 0000000000..fba811e4e2
--- /dev/null
+++ b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_html.xml
@@ -0,0 +1,353 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Page" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>text/html</string> </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_officejs_webrtc_jio.html</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string>Jio access</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>gadget_officejs_webrtc_jio_html</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value> <string>en</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Page</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+<!DOCTYPE html>\n
+<html>\n
+  <head>\n
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
+    <meta name="viewport" content="width=device-width, user-scalable=no" />\n
+    <title>Jio Gadget</title>\n
+\n
+    <!-- renderjs -->\n
+    <script src="rsvp.js" type="text/javascript"></script>\n
+    <script src="renderjs.js" type="text/javascript"></script>\n
+\n
+    <!-- custom script -->\n
+    <script src="gadget_officejs_webrtc_jio.js" type="text/javascript"></script>\n
+  </head>\n
+  <body>\n
+    <div data-gadget-url="gadget_jio.html"\n
+         data-gadget-scope="jio_gadget"\n
+         data-gadget-sandbox="public"></div>\n
+\n
+    <div class="gadget_websocket"></div>\n
+    <div class="gadget_webrtc_datachannel"></div>\n
+\n
+  </body>\n
+</html>
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>OfficeJS WebRTC Jio Gadget</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>001</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>publish_alive</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1440000227.2</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+            <item>
+                <key> <string>validation_state</string> </key>
+                <value> <string>published_alive</string> </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>edit</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value>
+                  <none/>
+                </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>945.32246.38846.38144</string> </value>
+            </item>
+            <item>
+                <key> <string>state</string> </key>
+                <value> <string>current</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441283008.98</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>detect_converted_file</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>external_processing_state</string> </key>
+                <value> <string>converted</string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>0.0.0.0</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1439999508.12</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_js.xml b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_js.xml
new file mode 100644
index 0000000000..f63c91d3cf
--- /dev/null
+++ b/bt5/erp5_officejs/PathTemplateItem/web_page_module/gadget_officejs_webrtc_jio_js.xml
@@ -0,0 +1,487 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Script" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+                <string>Owner</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_officejs_webrtc_jio.js</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>gadget_officejs_webrtc_jio_js</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value> <string>en</string> </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Script</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>text_content</string> </key>
+            <value> <string>/*global window, rJS, document, RSVP */\n
+/*jslint indent: 2, maxerr: 3 */\n
+(function (window, rJS, document, RSVP) {\n
+  "use strict";\n
+\n
+  var timeout = 60000;\n
+\n
+  function S4() {\n
+    return (\'0000\' + Math.floor(\n
+      Math.random() * 0x10000 /* 65536 */\n
+    ).toString(16)).slice(-4);\n
+  }\n
+\n
+  function UUID() {\n
+    return S4() + S4() + "-" +\n
+      S4() + "-" +\n
+      S4() + "-" +\n
+      S4() + "-" +\n
+      S4() + S4() + S4();\n
+  }\n
+\n
+  function wrapJioAccess(gadget, method_name, argument_list) {\n
+    return gadget.getDeclaredGadget(\'gadget_webrtc_datachannel.html\')\n
+      .push(function (rtc_gadget) {\n
+        gadget.state_parameter_dict.message_count += 1;\n
+        gadget.state_parameter_dict.message_dict[gadget.state_parameter_dict.message_count] = RSVP.defer();\n
+        return RSVP.all([\n
+          rtc_gadget.send(JSON.stringify({\n
+            id: gadget.state_parameter_dict.message_count,\n
+            type: "jio_query",\n
+            method_name: method_name,\n
+            argument_list: Array.prototype.slice.call(argument_list)\n
+          })),\n
+          RSVP.any([\n
+            RSVP.timeout(timeout),\n
+            gadget.state_parameter_dict.message_dict[gadget.state_parameter_dict.message_count].promise\n
+          ])\n
+        ]);\n
+      })\n
+      .push(function (result_list) {\n
+        return result_list[1];\n
+      });\n
+\n
+  }\n
+\n
+  function declareSubGadget(gadget, url) {\n
+    var container_element = gadget.state_parameter_dict.element.querySelector("." + url.split(".")[0]),\n
+      element = document.createElement("div");\n
+    container_element.innerHTML = "";\n
+    container_element.appendChild(element);\n
+    return gadget.declareGadget(url, {\n
+      element: element,\n
+      scope: url,\n
+      sandbox: "public"\n
+    });\n
+  }\n
+\n
+  rJS(window)\n
+\n
+    .ready(function (gadget) {\n
+      // Initialize the gadget local parameters\n
+      gadget.state_parameter_dict = {};\n
+      return gadget.getElement()\n
+        .push(function (element) {\n
+          gadget.state_parameter_dict.element = element;\n
+        });\n
+    })\n
+\n
+    .allowPublicAcquisition("notifyDataChannelMessage", function (argument_list) {\n
+      var json = JSON.parse(argument_list[0]),\n
+        context = this;\n
+      if (json.type === "jio_response") {\n
+        context.state_parameter_dict.message_dict[json.id].resolve(json.result);\n
+      } else if (json.type === "jio_error") {\n
+        context.state_parameter_dict.message_dict[json.id].reject(json.result);\n
+      }\n
+      // Drop all other kind of messages\n
+    })\n
+\n
+    .allowPublicAcquisition("notifyWebSocketMessage", function (argument_list) {\n
+\n
+      var json = JSON.parse(argument_list[0]),\n
+        gadget = this;\n
+\n
+      if (json.action === "answer") {\n
+        if (json.to === gadget.state_parameter_dict.uuid) {\n
+          gadget.state_parameter_dict.answer_defer.resolve(json.data);\n
+        }\n
+      }\n
+\n
+    })\n
+\n
+    .allowPublicAcquisition("notifyWebSocketClosed", function () {\n
+      // WebSocket get closed as soon as webrtc connection is created\n
+      return;\n
+    })\n
+\n
+    .declareMethod(\'createJio\', function (options) {\n
+      var context = this,\n
+        socket_gadget,\n
+        rtc_gadget;\n
+\n
+      return declareSubGadget(context, \'gadget_websocket.html\')\n
+        .push(function (gadget) {\n
+          socket_gadget = gadget;\n
+\n
+          context.state_parameter_dict.uuid = UUID();\n
+          context.state_parameter_dict.answer_defer = RSVP.defer();\n
+          context.state_parameter_dict.message_count = 0;\n
+          context.state_parameter_dict.message_dict = {};\n
+          return declareSubGadget(context, \'gadget_websocket.html\')\n
+            .push(function (gadget) {\n
+              socket_gadget = gadget;\n
+              // XXX Drop hardcoded URL\n
+              return socket_gadget.createSocket(options.socket_url);\n
+            })\n
+            .push(function () {\n
+              return declareSubGadget(context, \'gadget_webrtc_datachannel.html\');\n
+            })\n
+            .push(function (gadget) {\n
+              rtc_gadget = gadget;\n
+              return rtc_gadget.createOffer(context.state_parameter_dict.uuid);\n
+            })\n
+            .push(function (description) {\n
+              // Send offer and expect answer in less than XXXms (arbitrary value...)\n
+              return RSVP.any([\n
+                RSVP.Queue()\n
+                  .push(function () {\n
+                    return RSVP.timeout(timeout);\n
+                  })\n
+                  .push(undefined, function () {\n
+                    throw new Error("No remote WebRTC connection available");\n
+                  }),\n
+                RSVP.all([\n
+                  socket_gadget.send(JSON.stringify({from: context.state_parameter_dict.uuid, action: "offer", data: description})),\n
+                  context.state_parameter_dict.answer_defer.promise\n
+                ])\n
+              ]);\n
+            })\n
+            .push(function (response_list) {\n
+              return rtc_gadget.registerAnswer(response_list[1]);\n
+            })\n
+            .push(function () {\n
+              return socket_gadget.close();\n
+            });\n
+        });\n
+    })\n
+    .declareMethod(\'allDocs\', function () {\n
+      return wrapJioAccess(this, \'allDocs\', arguments);\n
+    })\n
+    .declareMethod(\'get\', function () {\n
+      return wrapJioAccess(this, \'get\', arguments);\n
+    })\n
+    .declareMethod(\'put\', function () {\n
+      return wrapJioAccess(this, \'put\', arguments);\n
+    })\n
+    .declareMethod(\'post\', function () {\n
+      return wrapJioAccess(this, \'post\', arguments);\n
+    })\n
+    .declareMethod(\'remove\', function () {\n
+      return wrapJioAccess(this, \'remove\', arguments);\n
+    });\n
+\n
+}(window, rJS, document, RSVP));</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>OfficeJS WebRTC Jio Gadget JS</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value> <string>001</string> </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>publish_alive</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1440000628.95</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+            <item>
+                <key> <string>validation_state</string> </key>
+                <value> <string>published_alive</string> </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>edit</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value>
+                  <none/>
+                </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>945.33670.33244.37512</string> </value>
+            </item>
+            <item>
+                <key> <string>state</string> </key>
+                <value> <string>current</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1441357867.08</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
+    </pickle>
+    <pickle>
+      <tuple>
+        <none/>
+        <list>
+          <dictionary>
+            <item>
+                <key> <string>action</string> </key>
+                <value> <string>detect_converted_file</string> </value>
+            </item>
+            <item>
+                <key> <string>actor</string> </key>
+                <value> <string>romain</string> </value>
+            </item>
+            <item>
+                <key> <string>comment</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>error_message</string> </key>
+                <value> <string></string> </value>
+            </item>
+            <item>
+                <key> <string>external_processing_state</string> </key>
+                <value> <string>converted</string> </value>
+            </item>
+            <item>
+                <key> <string>serial</string> </key>
+                <value> <string>0.0.0.0</string> </value>
+            </item>
+            <item>
+                <key> <string>time</string> </key>
+                <value>
+                  <object>
+                    <klass>
+                      <global name="DateTime" module="DateTime.DateTime"/>
+                    </klass>
+                    <tuple>
+                      <none/>
+                    </tuple>
+                    <state>
+                      <tuple>
+                        <float>1439999508.1</float>
+                        <string>GMT</string>
+                      </tuple>
+                    </state>
+                  </object>
+                </value>
+            </item>
+          </dictionary>
+        </list>
+      </tuple>
+    </pickle>
+  </record>
+</ZopeData>
-- 
2.30.9