|
|
|
@ -278,6 +278,7 @@ define([
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var onUploaded = function (ev, data, err) {
|
|
|
|
|
content.saveLock = undefined;
|
|
|
|
|
if (err) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
return void UI.alert(Messages.oo_saveError);
|
|
|
|
@ -289,7 +290,6 @@ define([
|
|
|
|
|
index: ev.index
|
|
|
|
|
};
|
|
|
|
|
oldHashes = JSON.parse(JSON.stringify(content.hashes));
|
|
|
|
|
content.saveLock = undefined;
|
|
|
|
|
// If this is a migration, set the new version
|
|
|
|
|
if (APP.migrate) {
|
|
|
|
|
delete content.migration;
|
|
|
|
@ -328,6 +328,9 @@ define([
|
|
|
|
|
sframeChan.query('Q_OO_SAVE', data, function (err) {
|
|
|
|
|
onUploaded(ev, data, err);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
onError: function (err) {
|
|
|
|
|
onUploaded(null, null, err);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
APP.FM = common.createFileManager(fmConfig);
|
|
|
|
@ -347,24 +350,19 @@ define([
|
|
|
|
|
var makeCheckpoint = function (force) {
|
|
|
|
|
if (!common.isLoggedIn()) { return; }
|
|
|
|
|
var locked = content.saveLock;
|
|
|
|
|
var lastCp = getLastCp();
|
|
|
|
|
|
|
|
|
|
var needCp = force || ooChannel.cpIndex % CHECKPOINT_INTERVAL === 0 ||
|
|
|
|
|
(ooChannel.cpIndex - lastCp.index) > CHECKPOINT_INTERVAL;
|
|
|
|
|
if (!needCp) { return; }
|
|
|
|
|
|
|
|
|
|
if (!locked || !isUserOnline(locked) || force) {
|
|
|
|
|
content.saveLock = myOOId;
|
|
|
|
|
APP.onLocal();
|
|
|
|
|
APP.realtime.onSettle(function () {
|
|
|
|
|
saveToServer();
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// The save is locked by someone else. If no new checkpoint is created
|
|
|
|
|
// in the next 20 to 40 secondes and the lock is kept by the same user,
|
|
|
|
|
// force the lock and make a checkpoint.
|
|
|
|
|
var saved = stringify(content.hashes);
|
|
|
|
|
var to = 20000 + (Math.random() * 20000);
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
if (stringify(content.hashes) === saved && locked === content.saveLock) {
|
|
|
|
|
makeCheckpoint(force);
|
|
|
|
|
}
|
|
|
|
|
}, to);
|
|
|
|
|
};
|
|
|
|
|
var restoreLastCp = function () {
|
|
|
|
|
content.saveLock = myOOId;
|
|
|
|
@ -378,6 +376,23 @@ define([
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
// Add a timeout to check if a checkpoint was correctly saved by the locking user
|
|
|
|
|
// and "unlock the sheet" or "make a checkpoint" if needed
|
|
|
|
|
var cpTo;
|
|
|
|
|
var checkCheckpoint = function () {
|
|
|
|
|
clearTimeout(cpTo);
|
|
|
|
|
var saved = stringify(content.hashes);
|
|
|
|
|
var locked = content.saveLock;
|
|
|
|
|
var to = 20000 + (Math.random() * 20000);
|
|
|
|
|
cpTo = setTimeout(function () {
|
|
|
|
|
// If no checkpoint was added and the same user still has the lock
|
|
|
|
|
// then make a checkpoint if needed (cp interval)
|
|
|
|
|
if (stringify(content.hashes) === saved && locked === content.saveLock) {
|
|
|
|
|
content.saveLock = undefined;
|
|
|
|
|
makeCheckpoint();
|
|
|
|
|
}
|
|
|
|
|
}, to);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var openRtChannel = function (cb) {
|
|
|
|
@ -684,11 +699,7 @@ define([
|
|
|
|
|
ooChannel.cpIndex++;
|
|
|
|
|
ooChannel.lastHash = hash;
|
|
|
|
|
// Check if a checkpoint is needed
|
|
|
|
|
var lastCp = getLastCp();
|
|
|
|
|
if (common.isLoggedIn() && (ooChannel.cpIndex % CHECKPOINT_INTERVAL === 0 ||
|
|
|
|
|
(ooChannel.cpIndex - lastCp.index) > CHECKPOINT_INTERVAL)) {
|
|
|
|
|
makeCheckpoint();
|
|
|
|
|
}
|
|
|
|
|
makeCheckpoint();
|
|
|
|
|
// Remove my lock
|
|
|
|
|
delete content.locks[getId()];
|
|
|
|
|
oldLocks = JSON.parse(JSON.stringify(content.locks));
|
|
|
|
@ -1546,6 +1557,16 @@ define([
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the sheet is locked by an offline user, remove it
|
|
|
|
|
if (content && content.saveLock && !isUserOnline(content.saveLock)) {
|
|
|
|
|
content.saveLock = undefined;
|
|
|
|
|
APP.onLocal();
|
|
|
|
|
} else if (content && content.saveLock) {
|
|
|
|
|
// If someone is currently creating a checkpoint (and locking the sheet),
|
|
|
|
|
// make sure it will end (maybe you'll have to make the checkpoint yourself)
|
|
|
|
|
checkCheckpoint();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var s = h('script', {
|
|
|
|
|
type:'text/javascript',
|
|
|
|
|
src: '/common/onlyoffice/'+version+'web-apps/apps/api/documents/api.js'
|
|
|
|
@ -1575,6 +1596,7 @@ define([
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var reloadPopup = false;
|
|
|
|
|
|
|
|
|
|
config.onRemote = function () {
|
|
|
|
|
if (initializing) { return; }
|
|
|
|
|
var userDoc = APP.realtime.getUserDoc();
|
|
|
|
@ -1589,9 +1611,11 @@ define([
|
|
|
|
|
|
|
|
|
|
content = json.content;
|
|
|
|
|
|
|
|
|
|
if (!wasLocked && content.saveLock) {
|
|
|
|
|
// Someone is creating a new checkpoint: fix the sheets ids
|
|
|
|
|
if (content.saveLock && wasLocked !== content.saveLock) {
|
|
|
|
|
// Someone new is creating a checkpoint: fix the sheets ids
|
|
|
|
|
fixSheets();
|
|
|
|
|
// If the checkpoint is not saved in 20s to 40s, do it ourselves
|
|
|
|
|
checkCheckpoint();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (content.hashes) {
|
|
|
|
|