0
0
mirror of https://github.com/Doodle3D/doodle3d-connect.git synced 2024-11-05 07:03:24 +01:00
doodle3d-connect/js/api/ConnectAPI.js
2014-04-24 12:46:26 +02:00

164 lines
4.5 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 ConnectAPI() {
// callbacks
this.refreshing; // I'm refreshing my list
this.listUpdated; // the list of boxes is updated / changed
this.boxAppeared; // a new box appeared
this.boxDisapeared; // a box disappeared
//this.boxUpdated; // a box is updated / changed
var _apiURL = "http://connect.doodle3d.com/api";
var _networkAPI = new NetworkAPI();
var _timeoutTime = 3000;
var _refreshDelay;
var _refreshInterval = 3000;
var _running;
var _listChanged = false;
var _wiredBox = {localip:"192.168.5.1",wifiboxid:"Wired WiFi-Box"};
var _apBox = {localip:"192.168.10.1",wifiboxid:"WiFi-Box",link:"http://draw.doodle3d.com"};
var _boxTimeoutTime = 500;
var _numBoxesChecking = 0; // count how many boxes we are checking
var _numBoxesFound = 0; // count how many boxes responded
var _boxes = {}; // current list of boxes
var _numBoxes = 0; // current number of boxes
var _self = this;
this.list = function(completeHandler,failedHandler) {
//console.log("ConnectAPI:list");
$.ajax({
url: _apiURL + "/list.php",
type: "GET",
dataType: 'json',
timeout: _timeoutTime,
success: function(response){
//console.log("ConnectAPI:list response: ",response);
if(response.status == "error" || response.status == "fail") {
//console.log("ConnectAPI:list failed: ",response);
if(failedHandler) failedHandler(response);
} else {
completeHandler(response.data);
}
}
}).fail(function() {
//console.log("ConnectAPI:list failed");
if(failedHandler) failedHandler();
});
};
this.start = function(interval,listUpdated) {
if(interval) {
_refreshInterval = interval;
}
if(listUpdated) {
_self.listUpdated = listUpdated;
}
_running = true;
_self.refresh();
}
this.stop = function() {
_running = false;
clearTimeout(_refreshDelay);
}
this.refresh = function(listUpdated) {
if(listUpdated) {
_self.listUpdated = listUpdated;
}
if(_self.refreshing) {
_self.refreshing();
}
_self.list(function(foundBoxes) {
//console.log(" foundBoxes: ",foundBoxes);
foundBoxes.push(_wiredBox); // always check for a wired box
updateList(foundBoxes);
if(_running) {
clearTimeout(_refreshDelay);
_refreshDelay = setTimeout(_self.refresh, _refreshInterval);
}
//removeBox(_apBox.localip,true); // TODO: why again?
}, function() {
// if web is not accessible try to find a box as an accesspoint
// if not found, we look for a wired box
_networkAPI.alive(_apBox.localip,_boxTimeoutTime,function() {
updateList([_apBox]);
}, function() {
updateList([_wiredBox]);
});
if(_running) {
clearTimeout(_refreshDelay);
_refreshDelay = setTimeout(_self.refresh, _refreshInterval);
}
});
}
function updateList(foundBoxes) {
//console.log("updateList");
_numBoxesChecking = 0;
_numBoxesFound = 0;
_listChanged = false;
// remove stored, but not found boxes
jQuery.each(_boxes, function (index,box) {
var found = false;
jQuery.each(foundBoxes, function (index,foundBox) {
if(foundBox.localip == box.localip &&
foundBox.wifiboxid == box.wifiboxid) found = true;
});
if(!found) removeBox(box.localip);
})
// check if all found boxes are alive
jQuery.each(foundBoxes, function (index,foundBox) {
checkBox(foundBox);
});
if(foundBoxes.length == 0 && _self.listUpdated) {
_self.listUpdated(_boxes);
}
}
function checkBox(boxData) {
//console.log(" checkBox: ",boxData.localip);
_numBoxesChecking++;
_networkAPI.alive(boxData.localip,_boxTimeoutTime,function() {
addBox(boxData);
_numBoxesFound++;
}, function() {
removeBox(boxData.localip);
},function(){
_numBoxesChecking--;
if(_numBoxesChecking <= 0 && _listChanged && _self.listUpdated) {
_self.listUpdated(_boxes);
}
});
}
function getBox(localip) {
return _boxes[localip];
}
function addBox(box) {
if(getBox(box.localip) !== undefined) return;
_boxes[box.localip] = box;
_numBoxes++;
if(_self.boxAppeared) _self.boxAppeared(box);
_listChanged = true;
}
function removeBox(localip) {
var box = getBox(localip);
if(box === undefined) return;
delete _boxes[localip];
_numBoxes--;
if(_self.boxDisapeared) _self.boxDisapeared(box);
_listChanged = true;
}
}