blob: e64b96c9f01e042ccc0705c101cb85777127f4ff [file] [log] [blame]
/**
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Control Server
*/
function CtrlServer() {
// The result returned by the request handlers
var result = new Object();
this.ctrlGetRadioState = function(req) {
print('ctrlGetRadioState');
var rsp = new Object();
rsp.state = gRadioState;
result.responseProtobuf = ctrlSchema['ril_proto.CtrlRspRadioState'].serialize(rsp);
return result;
}
this.ctrlSetRadioState = function(req) {
print('ctrlSetRadioState');
var radioReq = new Object();
// Parse the request protobuf to an object, the returned value is a
// string that represents the variable name
radioReq = ctrlSchema['ril_proto.CtrlReqRadioState'].parse(req.protobuf);
setRadioState(radioReq.state);
// Prepare the response, return the current radio state
var rsp = new Object();
rsp.state = gRadioState;
result.responseProtobuf = ctrlSchema['ril_proto.CtrlRspRadioState'].serialize(rsp);
print('gRadioState after setting: ' + gRadioState);
return result;
}
/**
* Process the request
*/
this.process = function(req) {
try {
print('CtrlServer E: req.cmd=' + req.cmd + ' req.token=' + req.token);
// Assume the result will be true, successful and nothing to return
result.sendResponse = true;
result.ctrlStatus = CTRL_STATUS_OK;
result.responseProtobuf = emptyProtobuf;
// Default result will be success with no response protobuf
try {
result = (this.ctrlDispatchTable[req.cmd]).call(this, req);
} catch (err) {
print('ctrlServer: Unknown cmd=' + req.cmd);
result.ctrlStatus = 1; //ril_proto.CTRL_STATUS_ERR;
}
if (result.sendResponse) {
sendCtrlRequestComplete(result.ctrlStatus, req.cmd,
req.token, result.responseProtobuf);
}
print('CtrlServer X: req.cmd=' + req.cmd + ' req.token=' + req.token);
} catch (err) {
print('CtrlServer X: Exception req.cmd=' +
req.cmd + ' req.token=' + req.token + ' err=' + err);
}
}
print('CtrlServer() ctor E');
this.ctrlDispatchTable = new Array();
this.ctrlDispatchTable[CTRL_CMD_GET_RADIO_STATE] = this.ctrlGetRadioState;
this.ctrlDispatchTable[CTRL_CMD_SET_RADIO_STATE] = this.ctrlSetRadioState;
print('CtrlServer() ctor X');
}
// The control server instance and its associated Worker
var ctrlServer = new CtrlServer();
var ctrlWorker = new Worker(function (req) {
ctrlServer.process(req);
});
ctrlWorker.run();
/**
* Add the request to the ctrlServer Worker.
*/
function onCtrlServerCmd(cmd, token, protobuf) {
try {
print('onCtrlServerCmd E cmd=' + cmd + ' token=' + token);
print('onCtrlServerCmd add the request:');
if (!isCtrlServerDispatchCommand(cmd)) {
var ctrlServerReq = new Object();
ctrlServerReq.cmd = cmd;
ctrlServerReq.token = token;
ctrlServerReq.protobuf = protobuf;
print('onCtrlServerCmd: command to control server, add to the worker queue');
// If it is a command to the control server, add to the control server worker queue
ctrlWorker.add(ctrlServerReq);
} else {
// For other commands, we need to dispatch to the corresponding components
try {
print('onCtrlServerCmd: get entry from dispatchTable cmd:' + cmd );
entry = ctrlServerDispatchTable[cmd];
if (typeof entry == 'undefined') {
throw ('entry = dispatchTable[' + cmd + '] was undefined');
} else {
var req = new Request(cmd, token, protobuf, ctrlSchema, entry.schemaName);
for(i = 0; i < entry.components.length; i++) {
entry.components[i].add(req);
}
}
} catch (err) {
print('onCtrlServerCmd: Unknown cmd=' + cmd + ' err=' + err);
sendCtrlRequestComplete(RIL_E_REQUEST_NOT_SUPPORTED, cmd, token);
}
}
print('onCtrlServerCmd X cmd=' + cmd + ' token=' + token);
} catch (err) {
print('onCtrlServerCmd X Exception err=' + err);
}
}
function isCtrlServerDispatchCommand(cmd) {
return (cmd > CTRL_CMD_DISPATH_BASE)
}
/**
* Dispatch table for request, the control server will send those requests to
* the corresponding components.
*
* Each table entry is index by the CTRL_CMD_xxxx
* and contains an array of components this request
* is to be sent to and the name of the schema
* that converts the incoming protobuf to the
* appropriate request data.
*
* ctrlServerDispatchTable[CTRL_CMD_xxx].components = Array of components
* ctrlServerDisptachTable[CTRL_CMD_xxx].Entry.schemaName = 'Name-of-schema';
*/
var ctrlServerDispatchTable = new Array();
ctrlServerDispatchTable[CTRL_CMD_SET_MT_CALL] = { // 1001
'components' : [simulatedRadioWorker],
'schemaName' : 'CtrlReqSetMTCall',
};
ctrlServerDispatchTable[CTRL_CMD_HANGUP_CONN_REMOTE] = { // 1002
'components' : [simulatedRadioWorker],
'schemaName' : 'CtrlHangupConnRemote',
};
ctrlServerDispatchTable[CTRL_CMD_SET_CALL_TRANSITION_FLAG] = { // 1003
'components' : [simulatedRadioWorker],
'schemaName' : 'CtrlSetCallTransitionFlag',
};
ctrlServerDispatchTable[CTRL_CMD_SET_CALL_ALERT] = { // 1004
'components' : [simulatedRadioWorker],
};
ctrlServerDispatchTable[CTRL_CMD_SET_CALL_ACTIVE] = { // 1005
'components' : [simulatedRadioWorker],
};
ctrlServerDispatchTable[CTRL_CMD_ADD_DIALING_CALL] = { // 1006
'components' : [simulatedRadioWorker],
'schemaName' : 'CtrlReqAddDialingCall',
};
/**
* Optional tests
*/
if (false) {
include("ctrl_server_tests.js");
}