Commit ca29d5a9 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Поправил проблему с отключением соединения: могли поставить lock для...

Поправил проблему с отключением соединения: могли поставить lock для сохранения и не снять его из-за потери соединения, а также могли потерять данные пользователя (т.е. не дошел saveChanges).
Теперь lock с сохранения снимается автоматически при сохранении (и присылается callback, если он не приходит, то пробуем сохранить еще раз).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@58569 954022d7-b5bf-4e40-9824-e11837661b57
parent e39931fd
......@@ -4,7 +4,7 @@
'use strict';
var asc = window["Asc"];
var asc_coAuthV = '3.0.2';
var asc_coAuthV = '3.0.3';
// Класс надстройка, для online и offline работы
function CDocsCoApi (options) {
......@@ -48,7 +48,7 @@
// Callback есть пользователей больше 1
this._CoAuthoringApi.onStartCoAuthoring = function (e) {t.callback_OnStartCoAuthoring(e);};
this._CoAuthoringApi.onEndCoAuthoring = function (e) {t.callback_OnEndCoAuthoring(e);};
this._CoAuthoringApi.onUnSaveLock = function (e) {t.callback_OnUnSaveLock(e);};
this._CoAuthoringApi.onUnSaveLock = function () {t.callback_OnUnSaveLock();};
this._CoAuthoringApi.init(user, docid, token, callback, editorType, documentFormatSave, isViewer);
this._onlineWork = true;
......@@ -119,12 +119,6 @@
}, 100);
}
};
CDocsCoApi.prototype.unSaveChanges = function () {
if (this._CoAuthoringApi && this._onlineWork) {
this._CoAuthoringApi.unSaveChanges();
}
};
CDocsCoApi.prototype.saveChanges = function (arrayChanges, deleteIndex) {
if (this._CoAuthoringApi && this._onlineWork) {
......@@ -236,9 +230,9 @@
this.onEndCoAuthoring(e);
};
CDocsCoApi.prototype.callback_OnUnSaveLock = function (e) {
CDocsCoApi.prototype.callback_OnUnSaveLock = function () {
if (this.onUnSaveLock)
this.onUnSaveLock(e);
this.onUnSaveLock();
};
/** States
......@@ -275,6 +269,7 @@
this._msgBuffer = [];
this._lockCallbacks = {};
this._saveCallback = [];
this.saveLockCallbackErrorTimeOutId = null;
this.saveCallbackErrorTimeOutId = null;
this._id = "";
this._indexuser = -1;
......@@ -401,12 +396,12 @@
}
// Очищаем предыдущий таймер
if (null !== this.saveCallbackErrorTimeOutId)
clearTimeout(this.saveCallbackErrorTimeOutId);
if (null !== this.saveLockCallbackErrorTimeOutId)
clearTimeout(this.saveLockCallbackErrorTimeOutId);
// Проверим состояние, если мы не подсоединились, то сразу отправим ошибку
if (-1 === this.get_state()) {
this.saveCallbackErrorTimeOutId = window.setTimeout(function () {
this.saveLockCallbackErrorTimeOutId = window.setTimeout(function () {
if (callback && _.isFunction(callback)) {
// Фиктивные вызовы
callback({error: "No connection"});
......@@ -420,8 +415,8 @@
this._saveCallback[indexCallback] = callback;
//Set reconnectTimeout
window.setTimeout(function () {
t.saveCallbackErrorTimeOutId = null;
this.saveLockCallbackErrorTimeOutId = window.setTimeout(function () {
t.saveLockCallbackErrorTimeOutId = null;
var oTmpCallback = t._saveCallback[indexCallback];
if (oTmpCallback) {
t._saveCallback[indexCallback] = null;
......@@ -432,10 +427,6 @@
}
this._send({"type": "isSaveLock"});
};
DocsCoApi.prototype.unSaveChanges = function () {
this._send({"type": "unSaveLock"});
};
DocsCoApi.prototype.releaseLocks = function (blockId) {
if (this._locks[blockId] && 2 === this._locks[blockId].state /*lock is ours*/) {
......@@ -443,7 +434,11 @@
this._locks[blockId] = {"state": 0};//0-released
}
};
DocsCoApi.prototype._reSaveChanges = function () {
this.saveChanges(this.arrayChanges, this.currentIndex);
};
DocsCoApi.prototype.saveChanges = function (arrayChanges, currentIndex, deleteIndex) {
if (null === currentIndex) {
this.deleteIndex = deleteIndex;
......@@ -461,6 +456,13 @@
}
}
//Set errorTimeout
var t = this;
this.saveCallbackErrorTimeOutId = window.setTimeout(function () {
t.saveCallbackErrorTimeOutId = null;
t._reSaveChanges();
}, 5000);
this._send({"type": "saveChanges", "changes": JSON.stringify(arrayChanges.slice(startIndex, endIndex)),
"startSaveChanges": (startIndex === 0), "endSaveChanges": (endIndex === arrayChanges.length),
"isCoAuthoring": this.isCoAuthoring, "isExcel": this._isExcel, "deleteIndex": this.deleteIndex,
......@@ -637,8 +639,8 @@
var oTmpCallback = this._saveCallback[indexCallback];
if (oTmpCallback) {
// Очищаем предыдущий таймер
if (null !== this.saveCallbackErrorTimeOutId)
clearTimeout(this.saveCallbackErrorTimeOutId);
if (null !== this.saveLockCallbackErrorTimeOutId)
clearTimeout(this.saveLockCallbackErrorTimeOutId);
this._saveCallback[indexCallback] = null;
oTmpCallback(data);
......@@ -647,6 +649,10 @@
};
DocsCoApi.prototype._onUnSaveLock = function () {
// Очищаем предыдущий таймер
if (null !== this.saveCallbackErrorTimeOutId)
clearTimeout(this.saveCallbackErrorTimeOutId);
if (this.onUnSaveLock)
this.onUnSaveLock();
};
......@@ -686,7 +692,11 @@
};
DocsCoApi.prototype._onSavePartChanges = function () {
this.saveChanges (this.arrayChanges, this.currentIndex + 1);
// Очищаем предыдущий таймер
if (null !== this.saveCallbackErrorTimeOutId)
clearTimeout(this.saveCallbackErrorTimeOutId);
this.saveChanges(this.arrayChanges, this.currentIndex + 1);
};
DocsCoApi.prototype._onPreviousLocks = function (locks, previousLocks) {
......@@ -907,7 +917,7 @@
case 'connectState' : t._onConnectionStateChanged(dataObject); break;
case 'saveChanges' : t._onSaveChanges(dataObject); break;
case 'saveLock' : t._onSaveLock(dataObject); break;
case 'unSaveLock' : t._onUnSaveLock(dataObject); break;
case 'unSaveLock' : t._onUnSaveLock(); break;
case 'savePartChanges' : t._onSavePartChanges(); break;
case 'drop' : t._onDrop(dataObject); break;
case 'waitAuth' : /*Ждем, когда придет auth, документ залочен*/break;
......
......@@ -576,24 +576,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
this.CoAuthoringApi.askSaveChanges (function (e) { t.onSaveCallback (e); });
};
spreadsheet_api.prototype.asc_OnSaveEnd = function (isDocumentSaved) {
var t = this;
this.CoAuthoringApi.onUnSaveLock = function () {
t.CoAuthoringApi.onUnSaveLock = null;
t.canSave = true;
t.isAutoSave = false;
t.lastSaveTime = null;
t.asc_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
// Обновляем состояние возможности сохранения документа
t.onUpdateDocumentModified(false);
};
this.CoAuthoringApi.unSaveChanges();
if (!isDocumentSaved)
this.CoAuthoringApi.disconnect();
};
spreadsheet_api.prototype.asc_Print = function(adjustPrint){
if (adjustPrint)
this.adjustPrint = adjustPrint;
......@@ -1052,11 +1034,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
oAdditionalData["savetype"] = "completeall";
data = oBinaryFileWriter.Write();
if (undefined != window['appBridge']) {
window['appBridge']['dummyCommandSave_CSV'] (data);
this.asc_OnSaveEnd(true);
return;
}
oAdditionalData["data"] = data;
var t = this;
this._asc_sendCommand (function (incomeObject) {
......@@ -1156,7 +1133,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
if (undefined != window['appBridge']) {
window['appBridge']['dummyCommandSave_CSV'] (data);
this.asc_OnSaveEnd(true);
return;
}
}
......@@ -1940,15 +1916,26 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
// Cбросим флаги модификации
History.Save();
this.CoAuthoringApi.onUnSaveLock = function () {
t.CoAuthoringApi.onUnSaveLock = null;
if (t.collaborativeEditing.getCollaborativeEditing()) {
// Шлем update для toolbar-а, т.к. когда select в lock ячейке нужно заблокировать toolbar
t.wb._onWSSelectionChanged(/*info*/null);
}
t.canSave = true;
t.isAutoSave = false;
t.lastSaveTime = null;
t.asc_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
// Обновляем состояние возможности сохранения документа
t.onUpdateDocumentModified(false);
};
// Пересылаем всегда, но чистим только если началось совместное редактирование
// Пересылаем свои изменения
this.collaborativeEditing.sendChanges();
if (this.collaborativeEditing.getCollaborativeEditing()) {
// Шлем update для toolbar-а, т.к. когда select в lock ячейке нужно заблокировать toolbar
this.wb._onWSSelectionChanged(/*info*/null);
}
this.asc_OnSaveEnd(true);
} else {
nState = t.CoAuthoringApi.get_state();
if (3 === nState) {
......@@ -3301,17 +3288,10 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
oAdditionalData["savetype"] = "completeall";
var data = oBinaryFileWriter.Write();
t.asc_OnSaveEnd(true);
return data;
}
}
if (!window['scriptBridge']['saveEnd']) {
window['scriptBridge']['saveEnd'] = function() {
t.asc_OnSaveEnd(true);
}
}
if (!window['scriptBridge']['showAdvancedOptionsDialog']) {
window['scriptBridge']['showAdvancedOptionsDialog'] = function(codepages) {
var cp = JSON.parse(codepages);
......@@ -3619,7 +3599,6 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
prot["asc_LoadEmptyDocument"] = prot.asc_LoadEmptyDocument;
prot["asc_DownloadAs"] = prot.asc_DownloadAs;
prot["asc_Save"] = prot.asc_Save;
prot["asc_OnSaveEnd"] = prot.asc_OnSaveEnd;
prot["asc_Print"] = prot.asc_Print;
prot["asc_Resize"] = prot.asc_Resize;
prot["asc_Copy"] = prot.asc_Copy;
......
......@@ -1420,21 +1420,15 @@ asc_docs_api.prototype.Share = function(){
};
function OnSave_Callback2(e)
{
if ( false == e["saveLock"] )
{
editor.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
if ( c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType )
CollaborativeEditing.Clear_CollaborativeMarks();
function OnSave_Callback(e) {
if (false == e["saveLock"]) {
editor.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
// Принимаем чужие изменения
//safe_Apply_Changes();
CollaborativeEditing.Apply_Changes();
if (c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType)
CollaborativeEditing.Clear_CollaborativeMarks();
// Пересылаем свои изменения
CollaborativeEditing.Send_Changes();
// Принимаем чужие изменения
CollaborativeEditing.Apply_Changes();
editor.CoAuthoringApi.onUnSaveLock = function () {
editor.CoAuthoringApi.onUnSaveLock = null;
......@@ -1448,36 +1442,28 @@ function OnSave_Callback2(e)
editor._onUpdateDocumentCanSave();
};
// Снимаем лок с функции сохранения на сервере
editor.CoAuthoringApi.unSaveChanges();
}
else
{
setTimeout( function(){ editor.CoAuthoringApi.askSaveChanges( OnSave_Callback2 ); }, 1000 );
}
// Пересылаем свои изменения
CollaborativeEditing.Send_Changes();
} else {
var nState = editor.CoAuthoringApi.get_state();
if (3 === nState) {
// Отключаемся от сохранения, соединение потеряно
editor.canSave = true;
} else {
setTimeout(function () {
editor.CoAuthoringApi.askSaveChanges(OnSave_Callback);
}, 1000);
}
}
}
asc_docs_api.prototype.asc_Save = function () {
if (true === this.canSave)
{
this.canSave = false;
this.CoAuthoringApi.askSaveChanges(OnSave_Callback2);
this.CoAuthoringApi.askSaveChanges(OnSave_Callback);
}
};
asc_docs_api.prototype.asc_OnSaveEnd = function (isDocumentSaved) {
var t = this;
this.CoAuthoringApi.onUnSaveLock = function () {
t.CoAuthoringApi.onUnSaveLock = null;
t.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
t.canSave = true;
// Обновляем состояние возможности сохранения документа
t._onUpdateDocumentCanSave();
};
this.CoAuthoringApi.unSaveChanges();
if (!isDocumentSaved)
this.CoAuthoringApi.disconnect();
};
asc_docs_api.prototype.processSavedFile = function(url, bInner){
if(bInner)
editor.asc_fireCallback("asc_onSaveUrl", url, function(hasError){});
......@@ -1803,61 +1789,6 @@ asc_docs_api.prototype.sync_InitEditorTableStyles = function(styles){
this.asc_fireCallback("asc_onInitTableTemplates",styles);
};
function safe_Apply_Changes()
{
try
{
CollaborativeEditing.Apply_Changes();
}
catch(err)
{
}
}
asc_docs_api.prototype.onSaveCallback = function (e) {
var t = this;
var nState;
if (false == e["saveLock"]) {
// Принимаем чужие изменения
safe_Apply_Changes();
// Сохраняем файл на сервер
/*var data = this.WordControl.SaveDocument();
var oAdditionalData = {};
oAdditionalData["c"] = "save";
oAdditionalData["id"] = documentId;
oAdditionalData["userid"] = documentUserId;
oAdditionalData["vkey"] = documentVKey;
oAdditionalData["outputformat"] = documentFormatSave;
oAdditionalData["innersave"] = true;
oAdditionalData["savetype"] = "completeall";
oAdditionalData["data"] = data;
sendCommand(editor, function(incomeObject){
if(null != incomeObject && "save" == incomeObject["type"])
editor.processSavedFile(incomeObject["data"], true);
}, oAdditionalData);*/
// Пересылаем свои изменения (ToDo)
CollaborativeEditing.Send_Changes();
//Обратно выставляем, что документ не модифицирован
t.SetUnchangedDocument();
t.asc_OnSaveEnd(true);
} else {
nState = t.CoAuthoringApi.get_state();
if (3 === nState) {
// Отключаемся от сохранения, соединение потеряно
t.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
t.canSave = true;
} else {
// Если автосохранение, то не будем ждать ответа, а просто перезапустим таймер на немного
setTimeout(function () {
t.CoAuthoringApi.askSaveChanges(function (event) { t.onSaveCallback(event); });
}, 1000);
}
}
};
/*----------------------------------------------------------------*/
/*functions for working with paragraph*/
/*setters*/
......
......@@ -3660,7 +3660,7 @@ function CEditorPage(api)
{
if (History.Have_Changes() == true)
{
oWordControl.m_oApi.asc_Save2();
oWordControl.m_oApi.asc_Save();
}
oWordControl.m_nLastAutosaveTime = _curTime;
}
......
......@@ -9738,7 +9738,7 @@ CDocument.prototype =
}
else if ( e.KeyCode == 83 && false === editor.isViewMode && true === e.CtrlKey ) // Ctrl + S - save
{
this.DrawingDocument.m_oWordControl.m_oApi.asc_Save2();
this.DrawingDocument.m_oWordControl.m_oApi.asc_Save();
bRetValue = true;
}
else if ( e.KeyCode == 85 && false === editor.isViewMode && true === e.CtrlKey ) // Ctrl + U - делаем текст подчеркнутым
......
......@@ -2731,31 +2731,15 @@ asc_docs_api.prototype.Share = function(){
}
asc_docs_api.prototype.asc_Save2 = function()
{
if (true === this.canSave)
{
this.canSave = false;
this.CoAuthoringApi.askSaveChanges(OnSave_Callback2);
}
}
function OnSave_Callback2(e)
{
if ( false == e["saveLock"] )
{
editor.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
function OnSave_Callback(e) {
if (false == e["saveLock"]) {
editor.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
if ( c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType )
CollaborativeEditing.Clear_CollaborativeMarks();
// Принимаем чужие изменения
//safe_Apply_Changes();
CollaborativeEditing.Apply_Changes();
// Пересылаем свои изменения
CollaborativeEditing.Send_Changes();
if (c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType)
CollaborativeEditing.Clear_CollaborativeMarks();
// Принимаем чужие изменения
CollaborativeEditing.Apply_Changes();
editor.CoAuthoringApi.onUnSaveLock = function () {
editor.CoAuthoringApi.onUnSaveLock = null;
......@@ -2768,112 +2752,31 @@ function OnSave_Callback2(e)
// Обновляем состояние возможности сохранения документа
editor._onUpdateDocumentCanSave();
};
// Снимаем лок с функции сохранения на сервере
editor.CoAuthoringApi.unSaveChanges();
}
else
{
setTimeout( function(){ editor.CoAuthoringApi.askSaveChanges( OnSave_Callback2 ); }, 1000 );
}
// Пересылаем свои изменения
CollaborativeEditing.Send_Changes();
} else {
var nState = editor.CoAuthoringApi.get_state();
if (3 === nState) {
// Отключаемся от сохранения, соединение потеряно
editor.canSave = true;
} else {
setTimeout(function () {
editor.CoAuthoringApi.askSaveChanges(OnSave_Callback);
}, 1000);
}
}
}
asc_docs_api.prototype.asc_Save = function ()
{
this.asc_Save2();
// if(true === this.canSave) {
// this.canSave = false;
// this.sync_StartAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
//
// this.CoAuthoringApi.askSaveChanges(OnSave_Callback);
// }
};
asc_docs_api.prototype.asc_OnSaveEnd = function (isDocumentSaved) {
var t = this;
this.CoAuthoringApi.onUnSaveLock = function () {
t.CoAuthoringApi.onUnSaveLock = null;
t.canSave = true;
t.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
// Обновляем состояние возможности сохранения документа
t._onUpdateDocumentCanSave();
};
this.CoAuthoringApi.unSaveChanges();
if (!isDocumentSaved)
this.CoAuthoringApi.disconnect();
if (true === this.canSave)
{
this.canSave = false;
this.CoAuthoringApi.askSaveChanges(OnSave_Callback);
}
};
function safe_Apply_Changes()
{
try
{
CollaborativeEditing.Apply_Changes();
}
catch(err)
{
}
}
//_*function*_ OnSave_Callback(e)
//{
// var nState;
// if ( false == e["saveLock"] ) {
//
// if ( c_oAscCollaborativeMarksShowType.LastChanges === editor.CollaborativeMarksShowType )
// CollaborativeEditing.Clear_CollaborativeMarks();
//
// // Принимаем чужие изменения
// safe_Apply_Changes();
//
// // Сохраняем файл на сервер
// var oBinaryFileWriter = new BinaryFileWriter(editor.WordControl.m_oLogicDocument);
//
// if (undefined != window['qtDocBridge']) {
// var data = oBinaryFileWriter.Write();
// // push data to native QT code
// window['qtDocBridge']['savedDocument'] (data);
//
// } else {
// /*var oAdditionalData = {};
// oAdditionalData["c"] = "save";
// oAdditionalData["id"] = documentId;
// oAdditionalData["userid"] = documentUserId;
// oAdditionalData["vkey"] = documentVKey;
// oAdditionalData["outputformat"] = documentFormatSave;
// if(c_oAscFileType.TXT == documentFormatSaveTxtCodepage)
// oAdditionalData["codepage"] = documentFormatSaveTxtCodepage;
// oAdditionalData["innersave"] = true;
// var data = oBinaryFileWriter.Write();
// oAdditionalData["savetype"] = "completeall";
// ////uncoment to save changes only instead send file complete
// //var data = JSON.stringify( CollaborativeEditing.Get_SelfChanges() );
// //oAdditionalData["savetype"] = "changes";
// oAdditionalData["data"] = data;
// sendCommand(editor, function(incomeObject){
// if(null != incomeObject && "save" == incomeObject["type"])
// editor.processSavedFile(incomeObject["data"], true);
// }, oAdditionalData);*/
// }
//
// // Пересылаем свои изменения
// CollaborativeEditing.Send_Changes();
// //Обратно выставляем, что документ не модифицирован
// editor.SetUnchangedDocument();
//
// editor.asc_OnSaveEnd(true);
// } else {
// nState = editor.CoAuthoringApi.get_state();
// if (3 === nState) {
// // Отключаемся от сохранения, соединение потеряно
// editor.sync_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
// editor.canSave = true;
// } else {
// setTimeout( function(){ editor.CoAuthoringApi.askSaveChanges( OnSave_Callback ); }, 1000 );
// }
// }
//}
asc_docs_api.prototype.asc_DownloadAs = function(typeFile){//передаем число соответствующее своему формату.
this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction, c_oAscAsyncAction.DownloadAs);
var editor = this;
......@@ -7340,15 +7243,6 @@ function sendCommand(editor, fCallback, rdata){
setTimeout( function(){sendCommand(editor, fCallback, rData)}, 3000);
break;
case "changes":
//rData = {"id":documentId, "c":"sfc", "outputformat": c_oAscFileType.DOCX};
//sendCommand(editor, fCallback, rData);
if(fCallback)
fCallback(incomeObject);
// Важно: потом сверху этот эвент придти не должен (т.е. мы не отправляем ссылку на документ наверх)
editor.asc_OnSaveEnd(/*isDocumentSaved*/true);
break;
case "save":
if(fCallback)
fCallback(incomeObject);
......@@ -7487,14 +7381,6 @@ function _isDocumentModified2 ()
{
return editor.isDocumentModified();
}
function _asc_Save2 ()
{
editor.asc_Save();
}
function _asc_SavingEnd ()
{
editor.asc_OnSaveEnd(true);
}
function _asc_scrollTo (x,y)
{
editor.WordControl.m_oScrollHorApi.scrollToX(x);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment