Commit 50f2e443 authored by Alexander.Trofimov's avatar Alexander.Trofimov Committed by Alexander.Trofimov

Вынес определение состояния соединения в отдельный файл как константы (ConnectionState).

Если мы начали сохранение и потеряли соединение, то попробуем сохранить после переподключения.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@61816 954022d7-b5bf-4e40-9824-e11837661b57
parent e0f1d77e
...@@ -247,13 +247,6 @@ ...@@ -247,13 +247,6 @@
this.onRecalcLocks(e); this.onRecalcLocks(e);
}; };
/** States
* -1 - reconnect state
* 0 - not initialized
* 1 - waiting session id
* 2 - authorized
* 3 - closed
*/
function DocsCoApi (options) { function DocsCoApi (options) {
if (options) { if (options) {
this.onAuthParticipantsChanged = options.onAuthParticipantsChanged; this.onAuthParticipantsChanged = options.onAuthParticipantsChanged;
...@@ -271,7 +264,7 @@ ...@@ -271,7 +264,7 @@
this.onUnSaveLock = options.onUnSaveLock; this.onUnSaveLock = options.onUnSaveLock;
this.onRecalcLocks = options.onRecalcLocks; this.onRecalcLocks = options.onRecalcLocks;
} }
this._state = 0; this._state = ConnectionState.None;
// Online-пользователи в документе // Online-пользователи в документе
this._participants = {}; this._participants = {};
this._countEditUsers = 0; this._countEditUsers = 0;
...@@ -330,6 +323,7 @@ ...@@ -330,6 +323,7 @@
this._isAuth = false; this._isAuth = false;
this._documentFormatSave = 0; this._documentFormatSave = 0;
this._isViewer = false; this._isViewer = false;
this._isReSaveAfterAuth = false; // Флаг для сохранения после повторной авторизации (для разрыва соединения во время сохранения)
} }
DocsCoApi.prototype.isRightURL = function () { DocsCoApi.prototype.isRightURL = function () {
...@@ -416,7 +410,7 @@ ...@@ -416,7 +410,7 @@
clearTimeout(this.saveLockCallbackErrorTimeOutId); clearTimeout(this.saveLockCallbackErrorTimeOutId);
// Проверим состояние, если мы не подсоединились, то сразу отправим ошибку // Проверим состояние, если мы не подсоединились, то сразу отправим ошибку
if (-1 === this.get_state()) { if (ConnectionState.Reconnect === this.get_state()) {
this.saveLockCallbackErrorTimeOutId = window.setTimeout(function () { this.saveLockCallbackErrorTimeOutId = window.setTimeout(function () {
if (callback && _.isFunction(callback)) { if (callback && _.isFunction(callback)) {
// Фиктивные вызовы // Фиктивные вызовы
...@@ -492,6 +486,9 @@ ...@@ -492,6 +486,9 @@
t._reSaveChanges(); t._reSaveChanges();
}, this.errorTimeOutSave); }, this.errorTimeOutSave);
// Выставляем состояние сохранения
this._state = ConnectionState.SaveChanges;
this._send({'type': 'saveChanges', 'changes': JSON.stringify(arrayChanges.slice(startIndex, endIndex)), this._send({'type': 'saveChanges', 'changes': JSON.stringify(arrayChanges.slice(startIndex, endIndex)),
'startSaveChanges': (startIndex === 0), 'endSaveChanges': (endIndex === arrayChanges.length), 'startSaveChanges': (startIndex === 0), 'endSaveChanges': (endIndex === arrayChanges.length),
'isCoAuthoring': this.isCoAuthoring, 'isExcel': this._isExcel, 'deleteIndex': this.deleteIndex, 'isCoAuthoring': this.isCoAuthoring, 'isExcel': this._isExcel, 'deleteIndex': this.deleteIndex,
...@@ -681,6 +678,9 @@ ...@@ -681,6 +678,9 @@
if (null !== this.unSaveLockCallbackErrorTimeOutId) if (null !== this.unSaveLockCallbackErrorTimeOutId)
clearTimeout(this.unSaveLockCallbackErrorTimeOutId); clearTimeout(this.unSaveLockCallbackErrorTimeOutId);
// Возвращаем состояние
this._state = ConnectionState.Authorized;
if (-1 !== data['index']) if (-1 !== data['index'])
this.changesIndex = data['index']; this.changesIndex = data['index'];
...@@ -814,7 +814,7 @@ ...@@ -814,7 +814,7 @@
DocsCoApi.prototype._onAuth = function (data) { DocsCoApi.prototype._onAuth = function (data) {
if (true === this._isAuth) { if (true === this._isAuth) {
this._state = 2; // Authorized this._state = ConnectionState.Authorized;
// Мы уже авторизовывались, нужно обновить пользователей (т.к. пользователи могли входить и выходить пока у нас не было соединения) // Мы уже авторизовывались, нужно обновить пользователей (т.к. пользователи могли входить и выходить пока у нас не было соединения)
this._onAuthParticipantsChanged(data['participants']); this._onAuthParticipantsChanged(data['participants']);
...@@ -823,6 +823,21 @@ ...@@ -823,6 +823,21 @@
//} //}
this._onMessages(data, true); this._onMessages(data, true);
this._onGetLock(data); this._onGetLock(data);
if (this._isReSaveAfterAuth) {
var t = this;
var callbackAskSaveChanges = function (e) {
if (false == e["saveLock"]) {
t._reSaveChanges();
} else {
setTimeout(function () {
t.askSaveChanges(callbackAskSaveChanges);
}, 1000);
}
};
this.askSaveChanges(callbackAskSaveChanges);
}
return; return;
} }
if (data['result'] === 1) { if (data['result'] === 1) {
...@@ -830,7 +845,7 @@ ...@@ -830,7 +845,7 @@
this._isAuth = true; this._isAuth = true;
//TODO: add checks //TODO: add checks
this._state = 2; // Authorized this._state = ConnectionState.Authorized;
this._id = data['sessionId']; this._id = data['sessionId'];
this._onAuthParticipantsChanged(data['participants']); this._onAuthParticipantsChanged(data['participants']);
...@@ -892,7 +907,7 @@ ...@@ -892,7 +907,7 @@
t.attemptCount = 0; t.attemptCount = 0;
} }
t._state = 1; // Opened state t._state = ConnectionState.WaitAuth;
if (t.onConnect) { if (t.onConnect) {
t.onConnect(); t.onConnect();
} }
...@@ -951,10 +966,17 @@ ...@@ -951,10 +966,17 @@
} }
}; };
sockjs.onclose = function (evt) { sockjs.onclose = function (evt) {
t._state = -1; // Reconnect state if (ConnectionState.SaveChanges === t._state) {
// Мы сохраняли изменения и разорвалось соединение
t._isReSaveAfterAuth = true;
// Очищаем предыдущий таймер
if (null !== t.saveCallbackErrorTimeOutId)
clearTimeout(t.saveCallbackErrorTimeOutId);
}
t._state = ConnectionState.Reconnect;
var bIsDisconnectAtAll = t.attemptCount >= t.maxAttemptCount || t.isCloseCoAuthoring; var bIsDisconnectAtAll = t.attemptCount >= t.maxAttemptCount || t.isCloseCoAuthoring;
if (bIsDisconnectAtAll) if (bIsDisconnectAtAll)
t._state = 3; // Closed state t._state = ConnectionState.Closed;
if (t.isCloseCoAuthoring) if (t.isCloseCoAuthoring)
return; return;
if (t.onDisconnect) if (t.onDisconnect)
......
"use strict"; /* docscoapicommon.js * * Author: Alexander.Trofimov * Date: 09.11.12 */( /** * @param {Window} window * @param {undefined} undefined */ function (window, undefined) { /* * Import * ----------------------------------------------------------------------------- */ var asc = window["Asc"] ? window["Asc"] : (window["Asc"] = {}); var prot; /** * Класс user для совместного редактирования/просмотра документа * ----------------------------------------------------------------------------- * * @constructor * @memberOf Asc */ function asc_CUser (val) { this.id = null; // уникальный id - пользователя this.userName = null; // имя пользователя this.state = undefined; // состояние (true - подключен, false - отключился) this.indexUser = -1; // Индекс пользователя (фактически равно числу заходов в документ на сервере) this.color = null; // цвет пользователя this.view = false; // просмотр(true), редактор(false) this._setUser(val); return this; } asc_CUser.prototype._setUser = function (val) { if (val) { this.id = val['id']; this.userName = val['username']; this.indexUser = val['indexUser']; this.color = c_oAscArrUserColors[this.indexUser % c_oAscArrUserColors.length]; this.state = val['state']; this.view = val['view']; } }; asc_CUser.prototype.asc_getId = function () { return this.id; }; asc_CUser.prototype.asc_getUserName = function () { return this.userName; }; asc_CUser.prototype.asc_getState = function () { return this.state; }; asc_CUser.prototype.asc_getColor = function () { return '#' + ('000000' + this.color.toString(16)).substr(-6); }; asc_CUser.prototype.asc_getColorValue = function () { return this.color; }; asc_CUser.prototype.asc_getView = function () { return this.view; }; asc_CUser.prototype.asc_setId = function (val) { this.id = val; }; asc_CUser.prototype.asc_setUserName = function (val) { this.userName = val; }; asc_CUser.prototype.asc_setState = function (val) { this.state = val; }; asc_CUser.prototype.asc_setColor = function (val) { this.color = val; }; /* * Export * ----------------------------------------------------------------------------- */ window["Asc"]["asc_CUser"] = window["Asc"].asc_CUser = asc_CUser; prot = asc_CUser.prototype; prot["asc_getId"] = prot.asc_getId; prot["asc_getUserName"] = prot.asc_getUserName; prot["asc_getState"] = prot.asc_getState; prot["asc_setId"] = prot.asc_setId; prot["asc_getColor"] = prot.asc_getColor; prot["asc_getColorValue"] = prot.asc_getColorValue; prot["asc_getView"] = prot.asc_getView; prot["asc_setUserName"] = prot.asc_setUserName; prot["asc_setState"] = prot.asc_setState; prot["asc_setColor"] = prot.asc_setColor; } )(window); "use strict"; /* docscoapicommon.js * * Author: Alexander.Trofimov * Date: 09.11.12 */( /** * @param {Window} window * @param {undefined} undefined */ function (window, undefined) { /* * Import * ----------------------------------------------------------------------------- */ var asc = window["Asc"] ? window["Asc"] : (window["Asc"] = {}); var prot; /** * Класс user для совместного редактирования/просмотра документа * ----------------------------------------------------------------------------- * * @constructor * @memberOf Asc */ function asc_CUser (val) { this.id = null; // уникальный id - пользователя this.userName = null; // имя пользователя this.state = undefined; // состояние (true - подключен, false - отключился) this.indexUser = -1; // Индекс пользователя (фактически равно числу заходов в документ на сервере) this.color = null; // цвет пользователя this.view = false; // просмотр(true), редактор(false) this._setUser(val); return this; } asc_CUser.prototype._setUser = function (val) { if (val) { this.id = val['id']; this.userName = val['username']; this.indexUser = val['indexUser']; this.color = c_oAscArrUserColors[this.indexUser % c_oAscArrUserColors.length]; this.state = val['state']; this.view = val['view']; } }; asc_CUser.prototype.asc_getId = function () { return this.id; }; asc_CUser.prototype.asc_getUserName = function () { return this.userName; }; asc_CUser.prototype.asc_getState = function () { return this.state; }; asc_CUser.prototype.asc_getColor = function () { return '#' + ('000000' + this.color.toString(16)).substr(-6); }; asc_CUser.prototype.asc_getColorValue = function () { return this.color; }; asc_CUser.prototype.asc_getView = function () { return this.view; }; asc_CUser.prototype.asc_setId = function (val) { this.id = val; }; asc_CUser.prototype.asc_setUserName = function (val) { this.userName = val; }; asc_CUser.prototype.asc_setState = function (val) { this.state = val; }; asc_CUser.prototype.asc_setColor = function (val) { this.color = val; }; /* * Export * ----------------------------------------------------------------------------- */ window["Asc"]["asc_CUser"] = window["Asc"].asc_CUser = asc_CUser; prot = asc_CUser.prototype; prot["asc_getId"] = prot.asc_getId; prot["asc_getUserName"] = prot.asc_getUserName; prot["asc_getState"] = prot.asc_getState; prot["asc_setId"] = prot.asc_setId; prot["asc_getColor"] = prot.asc_getColor; prot["asc_getColorValue"] = prot.asc_getColorValue; prot["asc_getView"] = prot.asc_getView; prot["asc_setUserName"] = prot.asc_setUserName; prot["asc_setState"] = prot.asc_setState; prot["asc_setColor"] = prot.asc_setColor; } )(window); var ConnectionState = { Reconnect : -1, // reconnect state None : 0, // not initialized WaitAuth : 1, // waiting session id Authorized : 2, // authorized Closed : 3, // closed SaveChanges : 4 // save };
\ No newline at end of file \ No newline at end of file
......
...@@ -1705,7 +1705,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS"; ...@@ -1705,7 +1705,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
* @param {Bool} isCloseCoAuthoring * @param {Bool} isCloseCoAuthoring
*/ */
this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) { this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) {
if (0 === t.CoAuthoringApi.get_state()) if (ConnectionState.None === t.CoAuthoringApi.get_state())
t.asyncServerIdEndLoaded(); t.asyncServerIdEndLoaded();
if (isDisconnectAtAll) { if (isDisconnectAtAll) {
// Посылаем наверх эвент об отключении от сервера // Посылаем наверх эвент об отключении от сервера
...@@ -1961,7 +1961,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS"; ...@@ -1961,7 +1961,7 @@ var ASC_DOCS_API_USE_EMBEDDED_FONTS = "@@ASC_DOCS_API_USE_EMBEDDED_FONTS";
this.collaborativeEditing.sendChanges(); this.collaborativeEditing.sendChanges();
} else { } else {
nState = t.CoAuthoringApi.get_state(); nState = t.CoAuthoringApi.get_state();
if (3 === nState) { if (ConnectionState.Close === nState) {
// Отключаемся от сохранения, соединение потеряно // Отключаемся от сохранения, соединение потеряно
if (!this.isAutoSave) if (!this.isAutoSave)
this.asc_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save); this.asc_EndAction(c_oAscAsyncActionType.Information, c_oAscAsyncAction.Save);
......
...@@ -520,7 +520,7 @@ asc_docs_api.prototype._coAuthoringInit = function () { ...@@ -520,7 +520,7 @@ asc_docs_api.prototype._coAuthoringInit = function () {
* @param {Bool} isCloseCoAuthoring * @param {Bool} isCloseCoAuthoring
*/ */
this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) { this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) {
if (0 === t.CoAuthoringApi.get_state()) if (ConnectionState.None === t.CoAuthoringApi.get_state())
t.asyncServerIdEndLoaded(); t.asyncServerIdEndLoaded();
if (isDisconnectAtAll) { if (isDisconnectAtAll) {
// Посылаем наверх эвент об отключении от сервера // Посылаем наверх эвент об отключении от сервера
...@@ -1468,7 +1468,7 @@ function OnSave_Callback(e) { ...@@ -1468,7 +1468,7 @@ function OnSave_Callback(e) {
CollaborativeEditing.Send_Changes(); CollaborativeEditing.Send_Changes();
} else { } else {
var nState = editor.CoAuthoringApi.get_state(); var nState = editor.CoAuthoringApi.get_state();
if (3 === nState) { if (ConnectionState.Close === nState) {
// Отключаемся от сохранения, соединение потеряно // Отключаемся от сохранения, соединение потеряно
editor.canSave = true; editor.canSave = true;
} else { } else {
......
...@@ -1414,7 +1414,7 @@ asc_docs_api.prototype._coAuthoringInit = function() ...@@ -1414,7 +1414,7 @@ asc_docs_api.prototype._coAuthoringInit = function()
* @param {Bool} isCloseCoAuthoring * @param {Bool} isCloseCoAuthoring
*/ */
this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) { this.CoAuthoringApi.onDisconnect = function (e, isDisconnectAtAll, isCloseCoAuthoring) {
if (0 === t.CoAuthoringApi.get_state()) if (ConnectionState.None === t.CoAuthoringApi.get_state())
t.asyncServerIdEndLoaded(); t.asyncServerIdEndLoaded();
if (isDisconnectAtAll) { if (isDisconnectAtAll) {
// Посылаем наверх эвент об отключении от сервера // Посылаем наверх эвент об отключении от сервера
...@@ -2268,7 +2268,7 @@ function OnSave_Callback(e) { ...@@ -2268,7 +2268,7 @@ function OnSave_Callback(e) {
CollaborativeEditing.Send_Changes(); CollaborativeEditing.Send_Changes();
} else { } else {
var nState = editor.CoAuthoringApi.get_state(); var nState = editor.CoAuthoringApi.get_state();
if (3 === nState) { if (ConnectionState.Close === nState) {
// Отключаемся от сохранения, соединение потеряно // Отключаемся от сохранения, соединение потеряно
editor.canSave = true; editor.canSave = true;
} else { } else {
......
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