| /** |
| * 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"); |
| } |