190 lines
5.6 KiB
JavaScript
190 lines
5.6 KiB
JavaScript
|
/**
|
||
|
* This program is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License
|
||
|
* as published by the Free Software Foundation; under version 2
|
||
|
* of the License (non-upgradable).
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
*
|
||
|
* Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
||
|
*/
|
||
|
define(['jquery', 'util/urlParser'], function($, UrlParser){
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* @constructor
|
||
|
*/
|
||
|
function ServiceApi(baseUrl, parameters, serviceCallId, stateStorage, userService, paused){
|
||
|
this.baseUrl = baseUrl;
|
||
|
this.parameters = parameters;
|
||
|
this.connected = false;
|
||
|
|
||
|
this.serviceCallId = serviceCallId;
|
||
|
this.state = stateStorage;
|
||
|
this.userService = userService;
|
||
|
this.hasBeenPaused = paused;
|
||
|
}
|
||
|
|
||
|
ServiceApi.SIG_SUCCESS = 0;
|
||
|
ServiceApi.SIG_ERROR = 1;
|
||
|
|
||
|
ServiceApi.prototype.loadInto = function(frame, connected){
|
||
|
var self = this;
|
||
|
var $frame = $(frame);
|
||
|
var callUrl = this.getCallUrl();
|
||
|
var isCORSAllowed = new UrlParser(callUrl).checkCORS();
|
||
|
|
||
|
$frame.on('load', function(e){
|
||
|
//if we are in the same domain, we add a variable
|
||
|
//to the frame window, so the frame knows it can communicate
|
||
|
//with the parent
|
||
|
$(document).on('serviceready', function(){
|
||
|
self.connect(frame, function(){
|
||
|
$(document).off('serviceready');
|
||
|
if(typeof connected === 'function'){
|
||
|
connected();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
if(isCORSAllowed === true){
|
||
|
frame.contentWindow.__knownParent__ = true;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
$frame.attr('src', callUrl);
|
||
|
};
|
||
|
|
||
|
ServiceApi.prototype.connect = function(frame, connected){
|
||
|
if(this.connected === false && frame.contentWindow){
|
||
|
//frame.contentWindow.serviceApi = this;
|
||
|
if (typeof(frame.contentWindow.onServiceApiReady) === "function") {
|
||
|
frame.contentWindow.onServiceApiReady(this);
|
||
|
this.connected = true;
|
||
|
if(typeof connected === 'function'){
|
||
|
connected();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get the service call URL
|
||
|
* @returns {String} the URI
|
||
|
*/
|
||
|
ServiceApi.prototype.getCallUrl = function(){
|
||
|
var params = this.parameters || {};
|
||
|
params.serviceCallId = this.serviceCallId;
|
||
|
return this.baseUrl + '?' + $.param(params);
|
||
|
};
|
||
|
|
||
|
ServiceApi.prototype.getUserPropertyValues = function(property, callback){
|
||
|
this.userService.get(property, callback);
|
||
|
};
|
||
|
|
||
|
//Context
|
||
|
ServiceApi.prototype.getServiceCallId = function(){
|
||
|
return this.serviceCallId;
|
||
|
};
|
||
|
|
||
|
//Context
|
||
|
ServiceApi.prototype.getState = function(){
|
||
|
return this.state.get();
|
||
|
};
|
||
|
|
||
|
ServiceApi.prototype.setState = function(state, callback){
|
||
|
return this.state.set(state, callback);
|
||
|
};
|
||
|
|
||
|
//Context
|
||
|
ServiceApi.prototype.getHasBeenPaused = function(){
|
||
|
return this.hasBeenPaused;
|
||
|
};
|
||
|
|
||
|
ServiceApi.prototype.setHasBeenPaused = function(paused){
|
||
|
this.hasBeenPaused = paused;
|
||
|
};
|
||
|
|
||
|
// Variables
|
||
|
ServiceApi.prototype.getParameter = function(identifier){
|
||
|
if (typeof(this.parameters[identifier]) !== "undefined") {
|
||
|
return this.parameters[identifier];
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sets a callback on the finish action
|
||
|
* @param {Function} callback
|
||
|
* @returns {ServiceApi}
|
||
|
*/
|
||
|
ServiceApi.prototype.onFinish = function(callback) {
|
||
|
this.onFinishCallback = callback;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sets a callback on the kill action
|
||
|
* @param {Function} callback
|
||
|
* @returns {ServiceApi}
|
||
|
*/
|
||
|
ServiceApi.prototype.onKill = function(callback) {
|
||
|
this.onKillCallback = callback;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sets a callback on the exit action
|
||
|
* @param {Function} callback
|
||
|
* @returns {ServiceApi}
|
||
|
*/
|
||
|
ServiceApi.prototype.onExit = function(callback) {
|
||
|
this.onExitCallback = callback;
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @param {Function} callback - Function called if no dedicated callback is found
|
||
|
*/
|
||
|
ServiceApi.prototype.kill = function(callback) {
|
||
|
if (typeof this.onKillCallback === 'function') {
|
||
|
this.onKillCallback(callback);
|
||
|
} else {
|
||
|
callback(0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Exits the flow
|
||
|
* @param {Function} callback - Function called if no dedicated callback is found
|
||
|
*/
|
||
|
ServiceApi.prototype.exit = function(callback) {
|
||
|
if (typeof this.onExitCallback === 'function') {
|
||
|
this.onExitCallback(callback);
|
||
|
} else {
|
||
|
callback(0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Finishes the flow
|
||
|
* @param valueArray - return parameters of the service.
|
||
|
*/
|
||
|
ServiceApi.prototype.finish = function(valueArray) {
|
||
|
//return execution to service caller
|
||
|
if (typeof this.onFinishCallback === 'function') {
|
||
|
this.onFinishCallback(valueArray);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return ServiceApi;
|
||
|
|
||
|
});
|