mirror of
https://github.com/Doodle3D/doodle3d-connect.git
synced 2024-12-26 18:43:48 +01:00
192 lines
5.7 KiB
JavaScript
192 lines
5.7 KiB
JavaScript
/*
|
|
* This file is part of the Doodle3D project (http://doodle3d.com).
|
|
*
|
|
* Copyright (c) 2013, Doodle3D
|
|
* This software is licensed under the terms of the GNU GPL v2 or later.
|
|
* See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details.
|
|
*/
|
|
function UpdateAPI() {
|
|
|
|
// states from api, see Doodle3D firmware src/script/d3d-updater.lua
|
|
UpdateAPI.STATUS = {
|
|
NONE: 1, // default state
|
|
DOWNLOADING: 2,
|
|
DOWNLOAD_FAILED:3,
|
|
IMAGE_READY: 4, // download successful and checked
|
|
INSTALLING: 5,
|
|
INSTALLED: 6,
|
|
INSTALL_FAILED: 7
|
|
};
|
|
var _apiPath = "/d3dapi";
|
|
var _apiCGIPath = "/cgi-bin"+_apiPath;
|
|
var _wifiboxURL;
|
|
var _wifiboxCGIBinURL;
|
|
var _timeoutTime = 3000;
|
|
this.state; // update state from api
|
|
this.stateText = ""; // update state text from api
|
|
var _autoRefreshing = false;
|
|
var _refreshDelay;
|
|
this.refreshDelayTime = 2000;
|
|
var _installing = false;
|
|
var _ignoreNextStatusResponse = false;
|
|
|
|
// When the updater doesn't preserve settings the box can't reconnect
|
|
// to the same network, so we can't retrieve whether the update was
|
|
// successfull, so we override the state to INSTALLED after a fixed delay
|
|
var INSTALL_TIME = 90*1000;
|
|
var _installedDelayer; // setTimout instance
|
|
|
|
//callbacks
|
|
this.refreshing; // I'm refreshing
|
|
this.updated; // New network status info
|
|
|
|
var _self = this;
|
|
|
|
this.init = function(wifiboxURL) {
|
|
_wifiboxURL = wifiboxURL+_apiPath;
|
|
_wifiboxCGIBinURL = wifiboxURL+_apiCGIPath;
|
|
}
|
|
|
|
this.status = function(completeHandler,failedHandler) {
|
|
//console.log("UpdateAPI:status");
|
|
$.ajax({
|
|
url: _wifiboxURL + "/update/status",
|
|
type: "GET",
|
|
dataType: 'json',
|
|
timeout: _timeoutTime,
|
|
success: function(response){
|
|
//console.log("UpdateAPI:status response: ",response);
|
|
if(_ignoreNextStatusResponse) {
|
|
_ignoreNextStatusResponse = false;
|
|
return;
|
|
}
|
|
if(response.status == "error" || response.status == "fail") {
|
|
if(failedHandler) failedHandler(response);
|
|
} else {
|
|
var data = response.data;
|
|
data.current_version_is_beta = versionIsBeta(data.current_version);
|
|
data.newest_version_is_beta = versionIsBeta(data.newest_version);
|
|
if(data.newest_release_date && data.current_release_date) {
|
|
data.newest_version_is_newer = (data.newest_release_date - data.current_release_date > 0);
|
|
} else {
|
|
data.newest_version_is_newer = true;
|
|
}
|
|
if(_installing && data.state_code === UpdateAPI.STATUS.NONE) {
|
|
data.state_code = UpdateAPI.STATUS.INSTALLED;
|
|
_installing = false;
|
|
}
|
|
completeHandler(data);
|
|
}
|
|
}
|
|
}).fail(function() {
|
|
if(_ignoreNextStatusResponse) {
|
|
_ignoreNextStatusResponse = false;
|
|
return;
|
|
}
|
|
if(failedHandler) failedHandler();
|
|
});
|
|
}
|
|
this.download = function(completeHandler,failedHandler) {
|
|
//console.log("UpdateAPI:download");
|
|
$.ajax({
|
|
url: _wifiboxURL + "/update/download",
|
|
type: "POST",
|
|
dataType: 'json',
|
|
success: function(response){
|
|
//console.log("UpdatePanel:downloadUpdate response: ",response);
|
|
if(response.status == "error" || response.status == "fail") {
|
|
if(failedHandler) failedHandler(response);
|
|
} else {
|
|
var data = response.data;
|
|
if(completeHandler) completeHandler(response.data);
|
|
}
|
|
}
|
|
}).fail(function() {
|
|
//console.log("UpdatePanel:downloadUpdate: failed");
|
|
if(failedHandler) failedHandler();
|
|
});
|
|
overrideStatus(UpdateAPI.STATUS.DOWNLOADING);
|
|
}
|
|
this.install = function(noRetain, completeHandler,failedHandler) {
|
|
//console.log("UpdateAPI:install");
|
|
var postData = {no_retain:noRetain};
|
|
$.ajax({
|
|
url: _wifiboxURL + "/update/install",
|
|
type: "POST",
|
|
data: postData,
|
|
dataType: 'json',
|
|
success: function(response){
|
|
//console.log("UpdatePanel:installUpdate response: ",response);
|
|
if(response.status == "error" || response.status == "fail") {
|
|
if(failedHandler) failedHandler(response);
|
|
} else {
|
|
var data = response.data;
|
|
if(completeHandler) completeHandler(response.data);
|
|
}
|
|
}
|
|
}).fail(function() {
|
|
//console.log("UpdatePanel:installUpdate: no respons (there shouldn't be)");
|
|
});
|
|
overrideStatus(UpdateAPI.STATUS.INSTALLING);
|
|
clearTimeout(_installedDelayer);
|
|
if(noRetain) {
|
|
_installedDelayer = setTimeout(function() {
|
|
overrideStatus(UpdateAPI.STATUS.INSTALLED);
|
|
},INSTALL_TIME);
|
|
}
|
|
_installing = true;
|
|
}
|
|
|
|
|
|
this.startAutoRefresh = function(delay,refreshingHandler,updatedHandler) {
|
|
if(delay !== undefined) { _self.refreshDelayTime = delay; }
|
|
if(refreshingHandler !== undefined) { _self.refreshing = refreshingHandler; }
|
|
if(updatedHandler !== undefined) { _self.updated = updatedHandler; }
|
|
_autoRefreshing = true;
|
|
_self.refresh();
|
|
}
|
|
this.stopAutoRefresh = function() {
|
|
_autoRefreshing = false;
|
|
clearTimeout(_refreshDelay);
|
|
}
|
|
this.refresh = function() {
|
|
//console.log("UpdateAPI:refresh");
|
|
if(_self.refreshing) { _self.refreshing(); }
|
|
_self.status(function(data) { // completed
|
|
//console.log("UpdateAPI:refresh:completed");
|
|
|
|
if(_self.updated !== undefined &&
|
|
_self.state !== data.state_code) {
|
|
_self.state = data.state_code;
|
|
_self.updated(data);
|
|
}
|
|
if(_autoRefreshing) {
|
|
clearTimeout(_refreshDelay);
|
|
_refreshDelay = setTimeout(_self.refresh, _self.refreshDelayTime);
|
|
}
|
|
},function() { // failed
|
|
if(_autoRefreshing) {
|
|
// retry
|
|
clearTimeout(_refreshDelay);
|
|
_refreshDelay = setTimeout(_self.refresh, _self.refreshDelayTime);
|
|
}
|
|
});
|
|
}
|
|
|
|
function overrideStatus(status) {
|
|
_self.state = status;
|
|
var data = {state_code:status,override:true};
|
|
if(_self.updated) {
|
|
_self.updated(data);
|
|
}
|
|
if(_autoRefreshing) {
|
|
_ignoreNextStatusResponse = true;
|
|
_self.refresh();
|
|
}
|
|
}
|
|
|
|
function versionIsBeta(version) {
|
|
return version ? /.*-.*/g.test(version) : null;
|
|
}
|
|
|
|
} |