From 7c6edb42e087356ef2747799f88635e780725009 Mon Sep 17 00:00:00 2001
From: Boris Kocherov <bk@raskon.ru>
Date: Mon, 29 Jan 2018 18:05:18 +0300
Subject: [PATCH] [erp5_only_office] use Editor.bin as file content document
 and simplify save/open

---
 .../erp5_only_office/onlyoffice.gadget.js.js  | 104 +++++++++++++-----
 .../onlyoffice/sdkjs/cell/api.js.js           |   3 -
 .../sdkjs/common/Local/common.js.js           |  60 ++++------
 .../onlyoffice/sdkjs/slide/Local/api.js.js    |   6 +-
 .../onlyoffice/sdkjs/slide/api.js.js          |   3 -
 .../onlyoffice/sdkjs/word/Local/api.js.js     |  17 ++-
 .../onlyoffice/sdkjs/word/api.js.js           |   3 -
 .../main/app/controller/Main.js.js            |   5 +-
 .../main/app/controller/Main.js.js            |   5 +-
 .../main/app/controller/Main.js.js            |   5 +-
 10 files changed, 115 insertions(+), 96 deletions(-)

diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice.gadget.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice.gadget.js.js
index 184b0d8f05..9e31b4a51a 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice.gadget.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice.gadget.js.js
@@ -1,6 +1,7 @@
 /*global window, rJS, RSVP, DocsAPI, console, document,
  Common, require, jIO, URL, FileReader, atob, ArrayBuffer,
-  Uint8Array, XMLHttpRequest, Blob, Rusha, define*/
+ Uint8Array, XMLHttpRequest, Blob, Rusha, define,
+ TextDecoder, DesktopOfflineAppDocumentEndSave*/
 /*jslint nomen: true, maxlen:80, indent:2*/
 "use strict";
 if (Common === undefined) {
@@ -71,8 +72,8 @@ DocsAPI.DocEditor.version = function () {
     .declareMethod("jio_getAttachment", function (docId, attId, opt) {
       var g = this,
         queue;
-      if (attId === 'body.txt') {
-        opt = 'asText';
+      if (attId === 'body.txt' || attId === 'Editor.bin') {
+        opt = 'asBinArray';
         if (!docId) {
           docId = '/';
         }
@@ -89,6 +90,11 @@ DocsAPI.DocEditor.version = function () {
               .then(function (evt) {
                 return evt.target.result;
               });
+          } else if (opt === "asBinArray") {
+            data = jIO.util.readBlobAsArrayBuffer(blob)
+              .then(function (evt) {
+                return new Uint8ClampedArray(evt.target.result);
+              });
           } else if (opt === "asBlobURL") {
             data = URL.createObjectURL(blob);
           } else if (opt === "asDataURL") {
@@ -246,7 +252,7 @@ DocsAPI.DocEditor.version = function () {
           return "";
         })
         .push(function (portal_type) {
-          var value, documentType, magic;
+          var value;
           portal_type = portal_type || options.portal_type;
           g.props.binary_loader = false;
           g.props.jio_key = options.jio_key;
@@ -276,27 +282,36 @@ DocsAPI.DocEditor.version = function () {
                 type: "zipfile",
                 file: value
               });
-              return g.props.value_zip_storage.getAttachment('/', 'body.txt')
+              return g.jio_getAttachment('/', 'body.txt')
                 .push(undefined, function (error) {
                   if (error.status_code === 404) {
-                    throw 'not supported format of document: body.txt absent "' +
-                    value.slice(0, 100) + '"';
+                    return g.jio_getAttachment('/', 'Editor.bin')
+                      .push(undefined, function (error) {
+                        if (error.status_code === 404) {
+                          throw 'not supported format of document:' +
+                          ' body.txt/Editor.bin absent "' +
+                          value.slice(0, 100) + '"';
+                        }
+                        throw error;
+                      });
                   }
                   throw error;
-                })
-                .push(jIO.util.readBlobAsText)
-                .push(function (evt) {
-                  return evt.target.result;
                 });
             }
           }
+        })
+        .push(function (value) {
+          var documentType, magic;
           g.props.value = value;
           if (!g.props.documentType && value === "") {
             throw "can not create empty document " +
             "because portal_type is unknown";
           }
           if (value) {
-            magic = g.props.value.slice(0, 4);
+            magic = value.slice(0, 4);
+            if (typeof magic !== 'string') {
+              magic = String.fromCharCode.apply(null, magic);
+            }
             switch (magic) {
             case 'XLSY':
               documentType = "spreadsheet";
@@ -427,27 +442,62 @@ DocsAPI.DocEditor.version = function () {
         });
     })
 
+    .declareMethod("jio_save", function (data) {
+      var g = this,
+        zip = g.props.value_zip_storage;
+      return new RSVP.Queue()
+        .push(function () {
+          if (data) {
+            return g.jio_putAttachment('/', 'body.txt', data)
+              .push(function () {
+                // cleanup if Editor.bin exist
+                return zip.removeAttachment('/', 'Editor.bin')
+                  .push(undefined, function (error) {
+                    if (error.status_code !== 404) {
+                      throw error;
+                    }
+                  });
+              })
+              .push(undefined, function (error) {
+                display_error(g, error);
+              });
+          }
+        })
+        .push(function () {
+          if (g.props.save_defer) {
+            // if we are run from getContent
+            g.props.save_defer.resolve();
+            g.props.save_defer = null;
+          } else {
+            g.triggerSubmit();
+          }
+        });
+    })
     .declareMethod('getContent', function () {
       var g = this,
         zip = g.props.value_zip_storage,
-        queue = new RSVP.Queue(),
-        save_defer = RSVP.defer();
-      g.props.save_defer = save_defer;
-      g.props.handlers.save();
+        queue = new RSVP.Queue();
+      if (g.props.handlers.save()) {
+        g.props.save_defer = RSVP.defer();
+      }
       return queue.push(function () {
-        return save_defer.promise;
+        if (g.props.save_defer) {
+          return g.props.save_defer.promise;
+        }
       })
-        .push(function (data) {
-          if (data) {
-            var body = data[g.props.key];
-            return zip.putAttachment('/', 'body.txt', body);
-          }
-        })
         .push(function () {
-          return zip.getAttachment('/', 'body.txt')
+          // prevent save empty zip archive
+          // check document exist in archive
+          return zip.getAttachment('/', 'Editor.bin')
             .push(undefined, function (error) {
               if (error.status_code === 404) {
-                return "";
+                return zip.getAttachment('/', 'body.txt')
+                  .push(undefined, function (error) {
+                    if (error.status_code === 404) {
+                      return "";
+                    }
+                    throw error;
+                  });
               }
               throw error;
             });
@@ -465,6 +515,10 @@ DocsAPI.DocEditor.version = function () {
         .push(function (evt) {
           var data = {};
           data[g.props.key] = evt.target.result;
+          // TODO it should be run on state change
+          // if fail send int:1
+          // it clear modification state onlyoffice
+          DesktopOfflineAppDocumentEndSave(0);
           return data;
         });
     });
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/cell/api.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/cell/api.js.js
index ef6e802603..a8e21834cf 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/cell/api.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/cell/api.js.js
@@ -3302,9 +3302,6 @@ var editor;
     var oBinaryFileWriter = new AscCommonExcel.BinaryFileWriter(this.wbModel);
     oBinaryFileWriter.Write(undefined, true);
 
-    var _header = oBinaryFileWriter.WriteFileHeader(oBinaryFileWriter.Memory.GetCurPosition(), Asc.c_nVersionNoBase64);
-    window["native"]["Save_End"](_header, oBinaryFileWriter.Memory.GetCurPosition());
-
     return oBinaryFileWriter.Memory.ImData.data;
   };
 
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/common/Local/common.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/common/Local/common.js.js
index 9dadfcc24e..a8500ee234 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/common/Local/common.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/common/Local/common.js.js
@@ -276,50 +276,28 @@ AscCommon.downloadUrlAsBlob = function (url) {
 
 AscCommon.baseEditorsApi.prototype.jio_open = function () {
 	var t = this,
-		g = Common.Gateway;
-	return g.jio_getAttachment('/', 'body.txt')
-		.push(undefined, function (error) {
-			if (error["status_code"] === 404) {
-				return g.props.value;
-			}
-			throw error;
-		})
-		.push(function (doc) {
-			if (!doc) {
-				switch (g.props.documentType) {
-					case "presentation":
-						doc = t.getEmpty();
-						break;
-					case "spreadsheet":
-						doc = "XLSY;v2;2286;BAKAAgAAA+cHAAAEAwgAAADqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMFAAAAEQAAAAEMAAAABwEAAAAACAEAAAAABAoAAAAFAAAAAAUAAAAABnwAAAAHGgAAAAQGCgAAAEEAcgBpAGEAbAAGBQAAAAAAACRABxoAAAAEBgoAAABBAHIAaQBhAGwABgUAAAAAAAAkQAcaAAAABAYKAAAAQQByAGkAYQBsAAYFAAAAAAAAJEAHGgAAAAQGCgAAAEEAcgBpAGEAbAAGBQAAAAAAACRACB8AAAAJGgAAAAAGDgAAAEcARQBOAEUAUgBBAEwAAQSkAAAADhYDAAADPwAAAAABAQEBAQMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEpAAAAA0GGAAAAAABBAEEAAAAAAUBAAYEAAAAAAcBAAgBAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAEAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAgAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQCAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAQAAAAkEKwAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQpAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAEAAAAJBCwAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAQAAAAkEKgAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQJAAAAAkoAAAADRQAAAAABAAEBAAMBAAYEAAAAAAcEAAAAAAgEAAAAAAkEpAAAAAwEAAAAAA0GGAAAAAABBAEEAAAAAAUBAAYEAAAAAAcBAAgBAA8qAQAAECkAAAAABAAAAAAAAAABAQAAAAAEDAAAAE4AbwByAG0AYQBsAAUEAAAAAAAAABAnAAAAAAQAAAADAAAAAQEAAAAABAoAAABDAG8AbQBtAGEABQQAAAAPAAAAEC8AAAAABAAAAAYAAAABAQAAAAAEEgAAAEMAbwBtAG0AYQAgAFsAMABdAAUEAAAAEAAAABAtAAAAAAQAAAAEAAAAAQEAAAAABBAAAABDAHUAcgByAGUAbgBjAHkABQQAAAARAAAAEDUAAAAABAAAAAcAAAABAQAAAAAEGAAAAEMAdQByAHIAZQBuAGMAeQAgAFsAMABdAAUEAAAAEgAAABArAAAAAAQAAAAFAAAAAQEAAAAABA4AAABQAGUAcgBjAGUAbgB0AAUEAAAAEwAAABgAAAAAAwAAAAEBAAELAAAAAgYAAAAABAAAAADjAAAAAN4AAAABGwAAAAAGDAAAAFMAaABlAGUAdAAxAAEEAQAAAAIBAgIkAAAAAx8AAAABAQACBAEEAAADBAEAAAAEBAAAAAAFBXnalahdiStABAQAAABBADEAFhEAAAAXDAAAAAQBAAAAAQYBAAAAAQsKAAAAAQWamZmZmZkpQA48AAAAAAVxPQrXowA0QAEFKFyPwvUIOkACBXE9CtejADRAAwUoXI/C9Qg6QAQFcT0K16MANEAFBXE9CtejADRADwYAAAAAAQEBAQkQBgAAAAABAQEBAAkAAAAAGAYAAAACAQAAAAAAAAAA";
-						break;
-					case "text":
-						doc = window.g_sEmpty_bin;
-						break;
-				}
-			}
-			t._OfflineAppDocumentEndLoad('', doc);
-		})
-		.push(undefined, function (error) {
-			console.log(error);
-		});
+		g = Common.Gateway,
+		doc = g.props.value;
+	if (!doc) {
+		switch (g.props.documentType) {
+			case "presentation":
+				doc = t.getEmpty();
+				break;
+			case "spreadsheet":
+				doc = "XLSY;v2;2286;BAKAAgAAA+cHAAAEAwgAAADqCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGMFAAAAEQAAAAEMAAAABwEAAAAACAEAAAAABAoAAAAFAAAAAAUAAAAABnwAAAAHGgAAAAQGCgAAAEEAcgBpAGEAbAAGBQAAAAAAACRABxoAAAAEBgoAAABBAHIAaQBhAGwABgUAAAAAAAAkQAcaAAAABAYKAAAAQQByAGkAYQBsAAYFAAAAAAAAJEAHGgAAAAQGCgAAAEEAcgBpAGEAbAAGBQAAAAAAACRACB8AAAAJGgAAAAAGDgAAAEcARQBOAEUAUgBBAEwAAQSkAAAADhYDAAADPwAAAAABAQEBAQMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEpAAAAA0GGAAAAAABBAEEAAAAAAUBAAYEAAAAAAcBAAgBAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAEAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAgAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQCAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAAAAAAkEAAAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQAAAAACQQAAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAAAAAAJBAAAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAQAAAAkEKwAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQpAAAAAyEAAAAAAQABAQADAQEGBAAAAAAHBAAAAAAIBAEAAAAJBCwAAAADIQAAAAABAAEBAAMBAQYEAAAAAAcEAAAAAAgEAQAAAAkEKgAAAAMhAAAAAAEAAQEAAwEBBgQAAAAABwQAAAAACAQBAAAACQQJAAAAAkoAAAADRQAAAAABAAEBAAMBAAYEAAAAAAcEAAAAAAgEAAAAAAkEpAAAAAwEAAAAAA0GGAAAAAABBAEEAAAAAAUBAAYEAAAAAAcBAAgBAA8qAQAAECkAAAAABAAAAAAAAAABAQAAAAAEDAAAAE4AbwByAG0AYQBsAAUEAAAAAAAAABAnAAAAAAQAAAADAAAAAQEAAAAABAoAAABDAG8AbQBtAGEABQQAAAAPAAAAEC8AAAAABAAAAAYAAAABAQAAAAAEEgAAAEMAbwBtAG0AYQAgAFsAMABdAAUEAAAAEAAAABAtAAAAAAQAAAAEAAAAAQEAAAAABBAAAABDAHUAcgByAGUAbgBjAHkABQQAAAARAAAAEDUAAAAABAAAAAcAAAABAQAAAAAEGAAAAEMAdQByAHIAZQBuAGMAeQAgAFsAMABdAAUEAAAAEgAAABArAAAAAAQAAAAFAAAAAQEAAAAABA4AAABQAGUAcgBjAGUAbgB0AAUEAAAAEwAAABgAAAAAAwAAAAEBAAELAAAAAgYAAAAABAAAAADjAAAAAN4AAAABGwAAAAAGDAAAAFMAaABlAGUAdAAxAAEEAQAAAAIBAgIkAAAAAx8AAAABAQACBAEEAAADBAEAAAAEBAAAAAAFBXnalahdiStABAQAAABBADEAFhEAAAAXDAAAAAQBAAAAAQYBAAAAAQsKAAAAAQWamZmZmZkpQA48AAAAAAVxPQrXowA0QAEFKFyPwvUIOkACBXE9CtejADRAAwUoXI/C9Qg6QAQFcT0K16MANEAFBXE9CtejADRADwYAAAAAAQEBAQkQBgAAAAABAQEBAAkAAAAAGAYAAAACAQAAAAAAAAAA";
+				break;
+			case "text":
+				doc = window.g_sEmpty_bin;
+				break;
+		}
+	}
+	t._OfflineAppDocumentEndLoad('', doc);
 };
 
 AscCommon.baseEditorsApi.prototype.jio_save = function () {
 	var t = this,
 		g = Common.Gateway,
-		result = {},
-		data = t.asc_nativeGetFile();
-	if (g.props.save_defer) {
-		// if we are run from getContent
-		result[g.props.key] = data;
-		g.props.save_defer.resolve(result);
-		g.props.save_defer = null;
-	} else {
-		// TODO: rewrite to put_attachment
-		return g.jio_putAttachment('/', 'body.txt', data)
-			.push(undefined, function (error) {
-				console.log(error);
-			});
-	}
+		// data = t.asc_nativeGetFile(); // base64 file
+		data = new Blob([t.asc_nativeGetFileData()]); // binary file
+	return g.jio_save(data);
 };
\ No newline at end of file
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/Local/api.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/Local/api.js.js
index 6b01fc3325..472b6e9915 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/Local/api.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/Local/api.js.js
@@ -49,16 +49,16 @@ Asc['asc_docs_api'].prototype._OfflineAppDocumentStartLoad = function()
 	AscCommon.History.UserSaveMode = true;
 	return this.jio_open();
 };
-Asc['asc_docs_api'].prototype._OfflineAppDocumentEndLoad = function(_url, _data)
+Asc['asc_docs_api'].prototype._OfflineAppDocumentEndLoad = function(_url, _binary)
 {
 	//AscCommon.g_oIdCounter.m_sUserId = window["AscDesktopEditor"]["CheckUserId"]();
-	if (_data == "")
+	if (_binary == "")
 	{
 		this.sendEvent("asc_onError", c_oAscError.ID.ConvertationOpenError, c_oAscError.Level.Critical);
 		return;
 	}
 
-	this.OpenDocument2(_url, _data);
+    this.OpenDocument2(_url, _binary);
 	this.WordControl.m_oLogicDocument.Set_FastCollaborativeEditing(false);
 	this.DocumentOrientation = (null == this.WordControl.m_oLogicDocument) ? true : !this.WordControl.m_oLogicDocument.Orientation;
 	DesktopOfflineUpdateLocalName(this);
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/api.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/api.js.js
index 088f385214..b9c9c40d17 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/api.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/slide/api.js.js
@@ -6704,9 +6704,6 @@ background-repeat: no-repeat;\
 		this.WordControl.m_oLogicDocument.CalculateComments();
 		writer.WriteDocument3(this.WordControl.m_oLogicDocument);
 
-		var _header = "PPTY;v10;" + writer.pos + ";";
-		window["native"]["Save_End"](_header, writer.pos);
-
 		return writer.ImData.data;
 	};
 
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/Local/api.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/Local/api.js.js
index 6f6d073d7f..dfd132347c 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/Local/api.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/Local/api.js.js
@@ -49,21 +49,26 @@ Asc['asc_docs_api'].prototype._OfflineAppDocumentStartLoad = function()
 	AscCommon.History.UserSaveMode = true;
 	return this.jio_open();
 };
-Asc['asc_docs_api'].prototype._OfflineAppDocumentEndLoad = function(_url, _data)
+Asc['asc_docs_api'].prototype._OfflineAppDocumentEndLoad = function(_url, _binary)
 {
 	//AscCommon.g_oIdCounter.m_sUserId = window["AscDesktopEditor"]["CheckUserId"]();
-	if (_data == "")
+	if (_binary == "")
 	{
 		this.sendEvent("asc_onError", c_oAscError.ID.ConvertationOpenError, c_oAscError.Level.Critical);
 		return;
 	}
-	if (AscCommon.c_oSerFormat.Signature !== _data.substring(0, AscCommon.c_oSerFormat.Signature.length))
+	var _sign_len = AscCommon.c_oSerFormat.Signature.length;
+    var _signature = _binary.slice(0, _sign_len);
+	if (typeof _signature !== 'string') {
+		_signature = String.fromCharCode.apply(null, _signature);
+	}
+	if (AscCommon.c_oSerFormat.Signature !== _signature)
 	{
-		this.OpenDocument(_url, _data);
+		this.OpenDocument(_url, _binary);
 	}
-	else
+    else
 	{
-		this.OpenDocument2(_url, _data);
+		this.OpenDocument2(_url, _binary);
 		this.WordControl.m_oLogicDocument.Set_FastCollaborativeEditing(false);
 	}
 	DesktopOfflineUpdateLocalName(this);
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/api.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/api.js.js
index 67d9464ed8..5e5cae8da5 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/api.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/sdkjs/word/api.js.js
@@ -7985,9 +7985,6 @@ background-repeat: no-repeat;\
 
 		oBinaryFileWriter.Write(true);
 
-		var _header = AscCommon.c_oSerFormat.Signature + ";v" + Asc.c_nVersionNoBase64 + ";" + _memory.GetCurPosition() + ";";
-		window["native"]["Save_End"](_header, _memory.GetCurPosition());
-
 		return _memory.ImData.data;
 	};
 
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/documenteditor/main/app/controller/Main.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/documenteditor/main/app/controller/Main.js.js
index 54c0a8869a..2659f4da00 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/documenteditor/main/app/controller/Main.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/documenteditor/main/app/controller/Main.js.js
@@ -933,12 +933,9 @@ define([
                 Common.Gateway.on('processmouse',           _.bind(me.onProcessMouse, me));
                 Common.Gateway.on('refreshhistory',         _.bind(me.onRefreshHistory, me));
                 Common.Gateway.on('save', function () {
-                    var g = Common.Gateway;
                     if (me.api.isDocumentModified()) {
                         me.api.asc_Save();
-                    }
-                    if (g.props.save_defer) {
-                      g.props.save_defer.resolve(undefined);
+                        return true;
                     }
                 });
                 Common.Gateway.on('downloadas',             _.bind(me.onDownloadAs, me));
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/presentationeditor/main/app/controller/Main.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/presentationeditor/main/app/controller/Main.js.js
index 40675917e9..b496ddee6c 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/presentationeditor/main/app/controller/Main.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/presentationeditor/main/app/controller/Main.js.js
@@ -713,12 +713,9 @@ define([
                 Common.Gateway.on('processrightschange',    _.bind(me.onProcessRightsChange, me));
                 Common.Gateway.on('processmouse',           _.bind(me.onProcessMouse, me));
                 Common.Gateway.on('save', function () {
-                    var g = Common.Gateway;
                     if (me.api.isDocumentModified()) {
                         me.api.asc_Save();
-                    }
-                    if (g.props.save_defer) {
-                      g.props.save_defer.resolve(undefined);
+                        return true;
                     }
                 });
                 Common.Gateway.on('downloadas',             _.bind(me.onDownloadAs, me));
diff --git a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/spreadsheeteditor/main/app/controller/Main.js.js b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/spreadsheeteditor/main/app/controller/Main.js.js
index 7401001be7..9a757f3265 100644
--- a/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/spreadsheeteditor/main/app/controller/Main.js.js
+++ b/bt5/erp5_only_office/SkinTemplateItem/portal_skins/erp5_only_office/onlyoffice/web-apps/apps/spreadsheeteditor/main/app/controller/Main.js.js
@@ -716,12 +716,9 @@ define([
                 Common.Gateway.on('processrightschange', _.bind(me.onProcessRightsChange, me));
                 Common.Gateway.on('processmouse', _.bind(me.onProcessMouse, me));
                 Common.Gateway.on('save', function () {
-                    var g = Common.Gateway;
                     if (me.api.asc_isDocumentModified()) {
                         me.api.asc_Save();
-                    }
-                    if (g.props.save_defer) {
-                      g.props.save_defer.resolve(undefined);
+                        return true;
                     }
                 });
                 Common.Gateway.on('downloadas',   _.bind(me.onDownloadAs, me));
-- 
2.30.9