From: Wink Saville Date: Sat, 17 Nov 2012 01:52:22 +0000 (-0800) Subject: Remove mockril. X-Git-Tag: android-x86-4.4-r1~28 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ba888f46a9d93b8569e4d394cb5362549856e5bd;p=android-x86%2Fhardware-ril.git Remove mockril. Mock ril isn't being used and the V8 library is being removed, so mockril is being removed. Change-Id: I90cc83ac5ee9d06c473c42c847b83798730649de --- diff --git a/mock-ril/.gitignore b/mock-ril/.gitignore deleted file mode 100644 index d18402d..0000000 --- a/mock-ril/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.pyc -.*.swp diff --git a/mock-ril/Android.mk b/mock-ril/Android.mk deleted file mode 100644 index 0560de1..0000000 --- a/mock-ril/Android.mk +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2010 The Android Open Source Project -# -# not currently building V8 for x86 targets - -LOCAL_PATH:= $(call my-dir) - -# Directories of source files -src_cpp := src/cpp -src_java := src/java -src_py := src/py -src_js := src/js -src_proto := src/proto - -ifneq ($(TARGET_BUILD_PDK), true) -ifeq ($(TARGET_ARCH),arm) -# Mock-ril only buid for debug variants -ifneq ($(filter userdebug eng tests, $(TARGET_BUILD_VARIANT)),) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES:= \ - $(src_cpp)/ctrl_server.cpp \ - $(src_cpp)/experiments.cpp \ - $(src_cpp)/js_support.cpp \ - $(src_cpp)/mock_ril.cpp \ - $(src_cpp)/node_buffer.cpp \ - $(src_cpp)/node_util.cpp \ - $(src_cpp)/protobuf_v8.cpp \ - $(src_cpp)/responses.cpp \ - $(src_cpp)/requests.cpp \ - $(src_cpp)/util.cpp \ - $(src_cpp)/worker.cpp \ - $(src_cpp)/worker_v8.cpp \ - $(call all-proto-files-under, $(src_proto)) - -LOCAL_SHARED_LIBRARIES := \ - libz libcutils libutils libril - -LOCAL_STATIC_LIBRARIES := \ - libv8 - -LOCAL_CFLAGS := -D_GNU_SOURCE -UNDEBUG -DRIL_SHLIB - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/$(src_cpp) \ - external/v8/include \ - bionic \ - $(KERNEL_HEADERS) - -LOCAL_SHARED_LIBRARIES += libstlport -LOCAL_C_INCLUDES += external/stlport/stlport - -# __BSD_VISIBLE for htolexx macros. -LOCAL_STRIP_MODULE := true - -LOCAL_LDLIBS += -lpthread -LOCAL_CFLAGS += -DMOCK_RIL -D__BSD_VISIBLE -LOCAL_PROTOC_OPTIMIZE_TYPE := full -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE:= libmock_ril - -include $(BUILD_SHARED_LIBRARY) - -endif -endif - -# Java librilproto -# ======================================================= -include $(CLEAR_VARS) - -LOCAL_MODULE := librilproto-java - -LOCAL_PROTOC_OPTIMIZE_TYPE := micro - -LOCAL_SRC_FILES := $(call all-java-files-under, $(src_java)) \ - $(call all-proto-files-under, $(src_proto)) - -include $(BUILD_STATIC_JAVA_LIBRARY) -# ======================================================= - -endif - -src_cpp := -src_java := -src_py := -src_js := -src_proto := diff --git a/mock-ril/MODULE_LICENSE_APACHE2 b/mock-ril/MODULE_LICENSE_APACHE2 deleted file mode 100644 index e69de29..0000000 diff --git a/mock-ril/Makefile b/mock-ril/Makefile deleted file mode 100644 index d85c2cf..0000000 --- a/mock-ril/Makefile +++ /dev/null @@ -1,154 +0,0 @@ -# This has various targets to assist in developing -# and testing the mock ril. The default "all" target -# invokes protoc to generate the appropriate protobuf -# code. The other targest are used for testing. - -# Assume this Makefile is run in place then top -# point to the top of the android source tree -top=../../../ - -PROTOC=$(wildcard $(top)out/host/*/bin/aprotoc) -#if ((($(words $(PROTO)) != 1))) -ifneq ($(words $(PROTOC)),1) -$(error expecting 1 protoc we have $(words $(PROTOC)), PROTOC='$(PROTOC)') -endif - -ifeq ("$(ANDROID_DEVICE)","") -$(warning Default to ANDROID_DEVICE=passion") -ANDROID_DEVICE=passion -endif - -# Directories of source files -device=$(ANDROID_DEVICE) -src_js=src/js -src_proto=src/proto -src_generated=$(top)out/target/product/$(device)/obj/SHARED_LIBRARIES/libmock_ril_intermediates/proto/hardware/ril/mock-ril/src/proto - -# Directories of generated source files -gen_src_py=$(src_generated)/python -gen_src_desc=$(src_generated)/desc - -# Generated files -generated=$(gen_src_desc)/msgheader.desc $(gen_src_py)/msgheader_pb2.py \ - $(gen_src_desc)/ril.desc $(gen_src_py)/ril_pb2.py \ - $(gen_src_desc)/ctrl.desc $(gen_src_py)/ctrl_pb2.py - -# A Makefile to run protoc and simplify testing. -.PHONY : all -all : $(generated) - -# TODO: Document/cleanup these testing targets as we learn whats needed. - -# Make the unit tests -.PHONY : ut -ut : - source $(top)build/envsetup.sh ; mmm $(top)frameworks/base/telephony/tests/telephonytests - adb install -r $(top)out/target/product/$(device)/data/app/FrameworksTelephonyTests.apk - -t : $(gen_src_desc)/msgheader.desc $(gen_src_py)/msgheader_pb2.py - -# Run protoc to create the descriptor files for msgheader -$(gen_src_desc)/msgheader.desc : $(src_proto)/msgheader.proto - mkdir -p $(gen_src_desc) - $(PROTOC) --descriptor_set_out=$@ --proto_path=$(src_proto) --include_imports $< - -# Run protoc to create the python files for msgheader -$(gen_src_py)/msgheader_pb2.py : $(src_proto)/msgheader.proto - mkdir -p $(gen_src_py) - $(PROTOC) --python_out=$(gen_src_py) --proto_path=$(src_proto) $< - -# Run protoc to create the ril descriptor file for ril -$(gen_src_desc)/ril.desc : $(src_proto)/ril.proto - mkdir -p $(gen_src_desc) - $(PROTOC) --descriptor_set_out=$@ --proto_path=$(src_proto) --include_imports $< - -# Run protoc to create the python files for ril -$(gen_src_py)/ril_pb2.py : $(src_proto)/ril.proto - mkdir -p $(gen_src_py) - $(PROTOC) --python_out=$(gen_src_py) --proto_path=$(src_proto) $< - -# Run protoc to create the python files for control -$(gen_src_py)/ctrl_pb2.py : $(src_proto)/ctrl.proto - mkdir -p $(gen_src_py) - $(PROTOC) --python_out=$(gen_src_py) --proto_path=$(top) --proto_path=$(src_proto) $< - -# Run protoc to create the ctrl descriptor file for control -$(gen_src_desc)/ctrl.desc : $(src_proto)/ctrl.proto - mkdir -p $(gen_src_desc) - $(PROTOC) --descriptor_set_out=$@ --proto_path=$(top) --proto_path=$(src_proto) --include_imports $< - -# After starting phone do this first to get lastest ril.desc/proto and setup rild -.PHONY : first -first : root_remount copy_all forward - -# copy js and descriptors, restart rild and run mockril_tests -.PHONY : tmr -tmr : copy_js_desc restart_rild mockril_tests - -# Copy all files, restart rild and run mockril_tests -.PHONY : test -test : copy_all restart_rild install_mockril_tests mockril_tests - -# Restart rild -.PHONY : restart_rild -restart_rild : - adb shell setprop ctl.restart ril-daemon - -# Update only the js/copy and restart rild -.PHONY : tjs -tjs : copy_js_desc restart_rild - -# Run test control server python script -.PHONY : tcs -tcs : - ./tcs.py 127.0.0.1 11111 - -# Run the mock ril tests (use adb shell pm list instrumentation to see the Runner) -.PHONY : mockril_tests -mockril_tests : - adb shell am instrument -e class 'com.android.internal.telephony.mockril.MockRilTest' -w com.android.frameworks.telephonytests/.TelephonyMockRilTestRunner - -# forward the control server tcp port (54312) to a port on the PC side (11111) -.PHONY : forward -forward : - adb forward tcp:11111 tcp:54312 - -# change to root and remount device -.PHONY : root_remount -root_remount : - adb root ; sleep 3 ; adb remount ; adb shell setprop rild.libpath /data/lib/libmock_ril.so - -# Copy all files -.PHONY : copy_all -copy_all : copy_js_desc copy_mockril - -# Copy js and the protobuf descriptor files -.PHONY : copy_js_desc -copy_js_desc : - adb push $(src_js)/mock_ril.js /sdcard/data/ - adb push $(src_js)/mock_ril_tests.js /sdcard/data/ - adb push $(src_js)/simulated_radio.js /sdcard/data/ - adb push $(src_js)/simulated_radio_tests.js /sdcard/data/ - adb push $(src_js)/simulated_icc.js /sdcard/data/ - adb push $(src_js)/simulated_icc_tests.js /sdcard/data/ - adb push $(src_js)/ctrl_server.js /sdcard/data/ - adb push $(src_js)/ctrl_server_tests.js /sdcard/data/ - adb push $(src_js)/ril_vars.js /sdcard/data/ - adb push $(gen_src_desc)/ril.desc /sdcard/data/ - adb push $(gen_src_desc)/ctrl.desc /sdcard/data/ - adb forward tcp:11111 tcp:54312 - - -# Copy the mock ril library -.PHONY : copy_mockril -copy_mockril : - adb push $(top)out/target/product/$(device)/system/lib/libmock_ril.so /data/lib/ - -.PHONY : install_mockril_tests -install_mockril_tests : - adb install -r $(top)out/target/product/$(device)/data/app/FrameworksTelephonyTests.apk - -# Remove generated files -.PHONY : clean -clean : - rm -f $(generated) diff --git a/mock-ril/NOTICE b/mock-ril/NOTICE deleted file mode 100644 index 15930fa..0000000 --- a/mock-ril/NOTICE +++ /dev/null @@ -1,221 +0,0 @@ - - Copyright (c) 2005-2008, 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. - - 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. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS -------------------------------------------------------------------------- -The following files are copied from http://www.nodejs.obj and modified: - node_buffer.h - node_buffer.cc (renamed to node_buffer.cpp) - node_object_wrap.h - -The following files are snippets from http://www.nodejs.obj node.cc/node.h - node_util.h - node_util.cpp - - -Node's license follows: - -Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. -------------------------------------------------------------------------- diff --git a/mock-ril/README.txt b/mock-ril/README.txt deleted file mode 100644 index 0b7bef6..0000000 --- a/mock-ril/README.txt +++ /dev/null @@ -1,140 +0,0 @@ -Mock-ril: - -Install: - -The protoc is now part of the Android build but its -called "aprotoc" so it doesn't conflict with versions -already installed. If you wish to install it permanetly -see external/protobuf/INSTALL.txt and -external/protobuf/python/README.txt. If you get -"from google.protobuf import xxxx" statements that -google.protobuf is not found, you didn't install the -python support for protobuf. Also on Mac OSX I got an -error running the protoc tests but installing was fine. - -Running/testing: - -See "Testing a new ril:" below for general instructions but -for the mock-ril I've added some targets to the Makefile to -ease testing. Also Makefile needs to know the device being -used as this determines the directory where files are found -and stored. ANDROID_DEVICE is an environment variable and -maybe either exported: - $ export ANDROID_DEVICE=stingray - -or it can be passed on the command line: - $ make clean ANDROID_DEVICE=stingray - -If it's not set "passion" is the default. - -Execute the "first" target first to setup appropriate -environment: - $ cd hardware/ril/mock-ril - $ make first - -If changes made to ".proto" files run make with the default -"all" target: - $ make - -If changes are made to "c++" file create a new library and -run the "test" target: - $ mm - $ make test - -If changes to only the execute "js" target: - $ make js - -To run the test control server: - $ make tcs - -Implementation: - -The mock-ril is a library where the ril is implemented primarily -in javascript, mock-ril.js. In addition it can be controlled by -sending messages from another computer to port 54312 (TODO make -programmable) to the ctrlServer, a Worker in In mock-ril.js. - -See mock_ril.js for additional documentation. - -files: - ctrl.proto Protobuf messages for the control server - ctrl.* Protobuf generated files. - ctrl_pb2.py Python files generated from ctrl.proto - ctrl_server.* Cpp interface routines between ctrlServer - in javascript and the controller. - experiments.* Early experiments - js_support.* Java script support methods. Exposes various - routines to javascript, such as print, readFile - and include. - logging.h LOG_TAG and include utils/log.h - mock_ril.[cpp|h] Main module inteface code. - mock_ril.js The mock ril - node_buffer.* A Buffer for communicating between c++ and js. - This was ported from nodejs.org. - node_object.* An object wrapper to make it easier to expose - c++ code to js. Ported from nodejs.org. - node_util.* Some utilities ported from nodejs.org. - protobuf_v8.* Protobuf code for javascript ported from - http://code.google.com/p/protobuf-for-node/. - requests.* Interface code for handling framework requests. - responses* Interface code for handling framework responses. - ril.proto The protobuf version of ril.h - ril_vars.js Some additional variables defined for enums in - ril.h. - ril_pb2.py Python files generated from ril.proto. - status.h STATUS constants. - tcs.py Test the ctrlServer. - util.* Utility routines - worker.* Define WorkerThread and WorkerQueue. - worker_v8.* Expose WorkerQueue to js. - - -TODO: more documentation. - - -Testing a new ril: - -The Makefile is used to generate files and make testing easier. -and there are has several targets: - -all runs protoc and generates files, ril.desc ril.pb.* - -clean target removes generated files. - -first changes to root, remounts r/w and copies some files. - -test copies the latest libmock_ril.so and kills rild - to run the new mockril - -General instructions for testing ril's: - -1) On the device login in as root and remount file system so it's read/write: - $ adb root - restarting adbd as root - - $ adb remount - remount succeeded - -2) Set rild.libpath to the name of the ril: - adb shell setprop rild.libpath /system/lib/libmock_ril.so - - Using setprop makes the change temporary and the old ril will be - used after rebooting. (Another option is to set rild.libpath in - /data/local.prop, but don't forget to reboot for it to take effect). - -3) Compile and copy the ril to /system/lib/: - adb push out/target/product/passion/system/lib/libmock_ril.so /system/lib/ - -4) To restart the ril, kill the currently running ril and the new one - will automatically be restarted. You can use the ps command to find - /system/bin/rild PID, 3212 below and kill it: - $ adb shell ps | grep rild - radio 3212 1 3224 628 ffffffff afd0e4fc S /system/bin/rild - - $ adb shell kill 3212 - - or - - $ adb shell setprop ctl.restart ril-daemon - -5) Make modifications, go to step 3. diff --git a/mock-ril/src/cpp/ctrl_server.cpp b/mock-ril/src/cpp/ctrl_server.cpp deleted file mode 100644 index 3ac3a9f..0000000 --- a/mock-ril/src/cpp/ctrl_server.cpp +++ /dev/null @@ -1,473 +0,0 @@ -/** - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "logging.h" -#include "node_buffer.h" -#include "status.h" -#include "util.h" -#include "worker.h" - -#include "hardware/ril/mock-ril/src/proto/msgheader.pb.h" - -#include "hardware/ril/mock-ril/src/proto/ctrl.pb.h" -#include "ctrl_server.h" - -//#define CONTROL_SERVER_DEBUG -#ifdef CONTROL_SERVER_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -#define MOCK_RIL_CONTROL_SERVER_STOPPING_SOCKET 54311 -#define MOCK_RIL_CONTROL_SERVER_SOCKET 54312 - -using communication::MsgHeader; - -class CtrlServerThread; -static CtrlServerThread *g_ctrl_server; - -class CtrlServerThread : public WorkerThread { - private: - #define SOCKET_NAME_MOCK_RIL_CST_STOPPER "mock-ril-cst-stopper" - v8::Handle context_; - int server_accept_socket_; - int server_to_client_socket_; - int stop_server_fd_; - int stop_client_fd_; - int stopper_fd_; - fd_set rd_fds_; - fd_set wr_fds_; - bool done_; - - Buffer *ObtainBuffer(int length) { - Buffer *b = Buffer::New(length); - return b; - } - - int WriteAll(int s, void *data, int length) { - int ret_value; - uint8_t *bytes = (uint8_t *)data; - int count = length; - - while (length > 0) { - ret_value = send(s, bytes, length, 0); - if (ret_value < 0) { - return STATUS_ERR; - } - if (ret_value == 0) { - return STATUS_CLIENT_CLOSED_CONNECTION; - } - bytes += ret_value; - length -= ret_value; - } - - return STATUS_OK; - } - - int ReadAll(int s, void *data, int length) { - int ret_value; - uint8_t *bytes = (uint8_t *)data; - int count = length; - - while (length != 0) { - ret_value = recv(s, bytes, length, 0); - if (ret_value < 0) { - return STATUS_ERR; - } - if (ret_value == 0) { - return STATUS_CLIENT_CLOSED_CONNECTION; - } - bytes += ret_value; - length -= ret_value; - } - - return STATUS_OK; - } - - int ReadMessage(MsgHeader *mh, Buffer **pBuffer) { - int status; - int32_t len_msg_header; - - // Reader header length - status = ReadAll(server_to_client_socket_, &len_msg_header, sizeof(len_msg_header)); - len_msg_header = letoh32(len_msg_header); - DBG("rm: read len_msg_header=%d status=%d", len_msg_header, status); - if (status != STATUS_OK) return status; - - // Read header into an array allocated on the stack and unmarshall - uint8_t *msg_header_raw = (uint8_t *)alloca(len_msg_header); - status = ReadAll(server_to_client_socket_, msg_header_raw, len_msg_header); - DBG("rm: read msg_header_raw=%p status=%d", msg_header_raw, status); - if (status != STATUS_OK) return status; - mh->ParseFromArray(msg_header_raw, len_msg_header); - - // Read auxillary data - Buffer *buffer; - if (mh->length_data() > 0) { - buffer = ObtainBuffer(mh->length_data()); - status = ReadAll(server_to_client_socket_, buffer->data(), buffer->length()); - DBG("rm: read protobuf status=%d", status); - if (status != STATUS_OK) return status; - } else { - DBG("rm: NO protobuf"); - buffer = NULL; - } - - *pBuffer = buffer; - return STATUS_OK; - } - - public: - int WriteMessage(MsgHeader *mh, Buffer *buffer) { - int status; - uint32_t i; - uint64_t l; - - // Set length of data - if (buffer == NULL) { - mh->set_length_data(0); - } else { - mh->set_length_data(buffer->length()); - } - - // Serialize header - uint32_t len_msg_header = mh->ByteSize(); - uint8_t *msg_header_raw = (uint8_t *)alloca(len_msg_header); - mh->SerializeToArray(msg_header_raw, len_msg_header); - - // Write length in little endian followed by the header - i = htole32(len_msg_header); - status = WriteAll(server_to_client_socket_, &i, 4); - DBG("wm: write len_msg_header=%d status=%d", len_msg_header, status); - if (status != 0) return status; - status = WriteAll(server_to_client_socket_, msg_header_raw, len_msg_header); - DBG("wm: write msg_header_raw=%p status=%d", msg_header_raw, status); - if (status != 0) return status; - - // Write data - if (mh->length_data() > 0) { - status = WriteAll(server_to_client_socket_, buffer->data(), buffer->length()); - DBG("wm: protobuf data=%p len=%d status=%d", - buffer->data(), buffer->length(), status); - if (status != 0) return status; - } - - return STATUS_OK; - } - - CtrlServerThread(v8::Handle context) : - context_(context), - server_accept_socket_(-1), - server_to_client_socket_(-1), - done_(false) { - } - - virtual int Run() { - DBG("CtrlServerThread::Run E"); - - // Create a server socket. - server_accept_socket_ = socket_inaddr_any_server( - MOCK_RIL_CONTROL_SERVER_SOCKET, SOCK_STREAM); - if (server_accept_socket_ < 0) { - ALOGE("CtrlServerThread::Run error creating server_accept_socket_ '%s'", - strerror(errno)); - return STATUS_ERR; - } - - // Create a server socket that will be used for stopping - stop_server_fd_ = socket_loopback_server( - MOCK_RIL_CONTROL_SERVER_STOPPING_SOCKET, SOCK_STREAM); - if (stop_server_fd_ < 0) { - ALOGE("CtrlServerThread::Run error creating stop_server_fd_ '%s'", - strerror(errno)); - return STATUS_ERR; - } - - // Create a client socket that will be used for sending a stop - stop_client_fd_ = socket_loopback_client( - MOCK_RIL_CONTROL_SERVER_STOPPING_SOCKET, SOCK_STREAM); - if (stop_client_fd_ < 0) { - ALOGE("CtrlServerThread::Run error creating stop_client_fd_ '%s'", - strerror(errno)); - return STATUS_ERR; - } - - // Accept the connection of the stop_client_fd_ - stopper_fd_ = accept(stop_server_fd_, NULL, NULL); - if (stopper_fd_ < 0) { - ALOGE("CtrlServerThread::Run error accepting stop_client_fd '%s'", - strerror(errno)); - return STATUS_ERR; - } - - // Run the new thread - int ret_value = WorkerThread::Run(NULL); - DBG("CtrlServerThread::Run X"); - return ret_value; - } - - virtual void Stop() { - DBG("CtrlServerThread::Stop E"); - if (BeginStopping()) { - done_ = true; - int rv = send(stop_client_fd_, &done_, sizeof(done_), 0); - if (rv <= 0) { - ALOGE("CtrlServerThread::Stop could not send stop" - "WE WILL PROBABLY HANG"); - } - WaitUntilStopped(); - } - DBG("CtrlServerThread::Stop X"); - } - - virtual bool isRunning() { - bool rv = done_ || WorkerThread::isRunning(); - return rv; - } - - int WaitOnSocketOrStopping(fd_set *rfds, int s) { - DBG("WaitOnSocketOrStopping E s=%d stopper_fd_=%d", s, stopper_fd_); - FD_ZERO(rfds); - FD_SET(s, rfds); - FD_SET(stopper_fd_, rfds); - int fd_number = s > stopper_fd_ ? s + 1 : stopper_fd_ + 1; - v8::Unlocker unlocker; - int rv = select(fd_number, rfds, NULL, NULL, NULL); - v8::Locker locker; - DBG("WaitOnSocketOrStopping X rv=%d s=%d stopper_fd_=%d", rv, s, stopper_fd_); - return rv; - } - - int sendToCtrlServer(MsgHeader *mh, Buffer *buffer) { - DBG("sendToCtrlServer E: cmd=%d token=%lld", mh->cmd(), mh->token()); - - int status = STATUS_OK; - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - // Get the onRilRequest Function - v8::Handle name = v8::String::New("onCtrlServerCmd"); - v8::Handle onCtrlServerCmdFunctionValue = - context_->Global()->Get(name); - v8::Handle onCtrlServerCmdFunction = - v8::Handle::Cast(onCtrlServerCmdFunctionValue); - - // Create the CmdValue and TokenValue - v8::Handle v8CmdValue = v8::Number::New(mh->cmd()); - v8::Handle v8TokenValue = v8::Number::New(mh->token()); - - // Invoke onRilRequest - const int argc = 3; - v8::Handle buf; - if (mh->length_data() == 0) { - buf = v8::Undefined(); - } else { - buf = buffer->handle_; - } - v8::Handle argv[argc] = { - v8CmdValue, v8TokenValue, buf }; - v8::Handle result = - onCtrlServerCmdFunction->Call(context_->Global(), argc, argv); - if (try_catch.HasCaught()) { - ReportException(&try_catch); - status = STATUS_ERR; - } else { - v8::String::Utf8Value result_string(result); - DBG("sendToCtrlServer result=%s", ToCString(result_string)); - status = STATUS_OK; - } - - if (status != STATUS_OK) { - ALOGE("sendToCtrlServer Error: status=%d", status); - // An error report complete now - mh->set_length_data(0); - mh->set_status(ril_proto::CTRL_STATUS_ERR); - g_ctrl_server->WriteMessage(mh, NULL); - } - - DBG("sendToCtrlServer X: status=%d", status); - return status; - } - - virtual void * Worker(void *param) { - DBG("CtrlServerThread::Worker E param=%p stopper_fd_=%d", - param, stopper_fd_); - - v8::Locker locker; - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(context_); - - while (isRunning()) { - int ret_value; - - // Wait on either server_accept_socket_ or stopping - DBG("CtrlServerThread::Worker wait on server for a client"); - WaitOnSocketOrStopping(&rd_fds_, server_accept_socket_); - if (isRunning() != true) { - break; - } - - if (FD_ISSET(server_accept_socket_, &rd_fds_)) { - server_to_client_socket_ = accept(server_accept_socket_, NULL, NULL); - DBG("CtrlServerThread::Worker accepted server_to_client_socket_=%d isRunning()=%d", - server_to_client_socket_, isRunning()); - - int status; - Buffer *buffer; - MsgHeader mh; - while ((server_to_client_socket_ > 0) && isRunning()) { - DBG("CtrlServerThread::Worker wait on client for message"); - WaitOnSocketOrStopping(&rd_fds_, server_to_client_socket_); - if (isRunning() != true) { - break; - } - - status = ReadMessage(&mh, &buffer); - if (status != STATUS_OK) break; - - if (mh.cmd() == ril_proto::CTRL_CMD_ECHO) { - ALOGD("CtrlServerThread::Worker echo"); - status = WriteMessage(&mh, buffer); - if (status != STATUS_OK) break; - } else { - DBG("CtrlServerThread::Worker sendToCtrlServer"); - status = sendToCtrlServer(&mh, buffer); - if (status != STATUS_OK) break; - } - } - close(server_to_client_socket_); - server_to_client_socket_ = -1; - } - } - close(stop_server_fd_); - stop_server_fd_ = -1; - - close(stop_client_fd_); - stop_client_fd_ = -1; - - close(stopper_fd_); - stopper_fd_ = -1; - - close(server_accept_socket_); - server_accept_socket_ = -1; - - DBG("CtrlServerThread::Worker X param=%p", param); - return NULL; - } -}; - -/** - * Send a control request complete response. - */ -v8::Handle SendCtrlRequestComplete(const v8::Arguments& args) { - DBG("SendCtrlRequestComplete E:"); - v8::HandleScope handle_scope; - v8::Handle retValue; - - void *data; - size_t datalen; - - Buffer* buffer; - MsgHeader mh; - - /** - * Get the arguments. There should be at least 3, reqNum, - * ril error code and token. Optionally a Buffer containing - * the protobuf representation of the data to return. - */ - if (args.Length() < 3) { - // Expecting a reqNum, ERROR and token - ALOGE("SendCtrlRequestComplete X %d parameters" - " expecting at least 3: status, reqNum, and token", - args.Length()); - return v8::Undefined(); - } - v8::Handle v8CtrlStatus(args[0]->ToObject()); - mh.set_status(ril_proto::CtrlStatus(v8CtrlStatus->NumberValue())); - DBG("SendCtrlRequestComplete: status=%d", mh.status()); - - v8::Handle v8ReqNum(args[1]->ToObject()); - mh.set_cmd(int(v8ReqNum->NumberValue())); - DBG("SendCtrlRequestComplete: cmd=%d", mh.cmd()); - - v8::Handle v8Token(args[2]->ToObject()); - mh.set_token(int64_t(v8Token->NumberValue())); - DBG("SendCtrlRequestComplete: token=%lld", mh.token()); - - if (args.Length() >= 4) { - buffer = ObjectWrap::Unwrap(args[3]->ToObject()); - mh.set_length_data(buffer->length()); - DBG("SendCtrlRequestComplete: mh.length_data=%d", - mh.length_data()); - } else { - mh.set_length_data(0); - buffer = NULL; - DBG("SendCtrlRequestComplete: NO PROTOBUF"); - } - - DBG("SendCtrlRequestComplete: WriteMessage"); - int status = g_ctrl_server->WriteMessage(&mh, buffer); - - DBG("SendCtrlRequestComplete E:"); - return v8::Undefined(); -} - -void ctrlServerInit(v8::Handle context) { - int status; - - g_ctrl_server = new CtrlServerThread(context); - status = g_ctrl_server->Run(); - if (status != STATUS_OK) { - ALOGE("mock_ril control server could not start"); - } else { - ALOGD("CtrlServer started"); - } - -#if 0 - ALOGD("Test CtrlServerThread stop sleeping 10 seconds..."); - v8::Unlocker unlocker; - sleep(10); - ALOGD("Test CtrlServerThread call Stop"); - g_ctrl_server->Stop(); - v8::Locker locker; - - // Restart - g_ctrl_server = new CtrlServerThread(context); - status = g_ctrl_server->Run(); - if (status != STATUS_OK) { - ALOGE("mock_ril control server could not start"); - } else { - DBG("mock_ril control server started"); - } -#endif -} diff --git a/mock-ril/src/cpp/ctrl_server.h b/mock-ril/src/cpp/ctrl_server.h deleted file mode 100644 index 2850f04..0000000 --- a/mock-ril/src/cpp/ctrl_server.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_CONTROL_SERVER_H_ -#define MOCK_RIL_CONTROL_SERVER_H_ - -#include - -extern v8::Handle SendCtrlRequestComplete(const v8::Arguments& args); - -extern void ctrlServerInit(v8::Handle context); - -#endif // MOCK_RIL_CONTROL_SERVER_H_ diff --git a/mock-ril/src/cpp/experiments.cpp b/mock-ril/src/cpp/experiments.cpp deleted file mode 100644 index 0bb6b98..0000000 --- a/mock-ril/src/cpp/experiments.cpp +++ /dev/null @@ -1,281 +0,0 @@ -/** - * 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. - */ - -#include -#include "ril.h" - -#include "logging.h" -#include "status.h" -#include "worker.h" -#include "util.h" - -#include "hardware/ril/mock-ril/src/proto/ril.pb.h" - -#include "logging.h" -#include "js_support.h" -#include "node_buffer.h" -#include "node_util.h" -#include "protobuf_v8.h" -#include "requests.h" - -#include "experiments.h" - -void testStlPort() { - // Test using STLport - std::queue q; - int data[] = {1, 2, 3}; - - int *param = data; - ALOGD("before push q.size=%d", q.size()); - q.push(param); - ALOGD("after push q.size=%d", q.size()); - void *p = q.front(); - if (p == param) { - ALOGD("q.push succeeded"); - } else { - ALOGD("q.push failed"); - } - q.pop(); - ALOGD("after pop q.size=%d", q.size()); -} - -v8::Handle GetReqScreenState(v8::Local property, - const v8::AccessorInfo &info) { - v8::Local self = info.Holder(); - v8::Local wrap = - v8::Local::Cast(self->GetInternalField(0)); - void *p = wrap->Value(); - int state = static_cast(p)[0]; - ALOGD("GetReqScreenState state=%d", state); - return v8::Integer::New(state); -} - -bool callOnRilRequest(v8::Handle context, int request, - void *data, size_t datalen, RIL_Token t) { - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - // Get the onRilRequestFunction, making sure its a function - v8::Handle name = v8::String::New("onRilRequest"); - v8::Handle onRilRequestFunctionValue = context->Global()->Get(name); - if(!onRilRequestFunctionValue->IsFunction()) { - // Wasn't a function - ALOGD("callOnRilRequest X wasn't a function"); - return false; - } - v8::Handle onRilRequestFunction = - v8::Handle::Cast(onRilRequestFunctionValue); - - // Create the request - v8::Handle v8RequestValue = v8::Number::New(request); - - // Create the parameter for the request - v8::Handle params_obj = - v8::ObjectTemplate::New()->NewInstance(); - switch(request) { - case(RIL_REQUEST_SCREEN_STATE): { - ALOGD("callOnRilRequest RIL_REQUEST_SCREEN_STATE"); - if (datalen < sizeof(int)) { - ALOGD("callOnRilRequest err size < sizeof int"); - } else { - v8::Handle params_obj_template = - v8::ObjectTemplate::New(); - params_obj_template->SetInternalFieldCount(1); - params_obj_template->SetAccessor(v8::String::New( - "ReqScreenState"), GetReqScreenState, NULL); - // How to not leak this pointer!!! - int *p = new int; - *p = ((int *)data)[0]; - params_obj = params_obj_template->NewInstance(); - params_obj->SetInternalField(0, v8::External::New(p)); - } - break; - } - default: { - ALOGD("callOnRilRequest X unknown request"); - break; - } - } - - // Invoke onRilRequest - bool retValue; - const int argc = 2; - v8::Handle argv[argc] = { v8RequestValue, params_obj }; - v8::Handle result = - onRilRequestFunction->Call(context->Global(), argc, argv); - if (try_catch.HasCaught()) { - ALOGD("callOnRilRequest error"); - ReportException(&try_catch); - retValue = false; - } else { - v8::String::Utf8Value result_string(result); - ALOGD("callOnRilRequest result=%s", ToCString(result_string)); - retValue = true; - } - return retValue; -} - -void testOnRilRequestUsingCppRequestObjs(v8::Handle context) { - ALOGD("testOnRilRequestUsingCppRequestObjs E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - runJs(context, &try_catch, "local-string", - "function onRilRequest(reqNum, params) {\n" - " print(\"reqNum=\" + reqNum);\n" - " if (reqNum == 61) {\n" - " print(\"params.ReqScreenState=\" + params.ReqScreenState);\n" - " }\n" - " return \"Hello World\";\n" - "}\n"); - if (!try_catch.HasCaught()) { - // Call the onRilRequest function - int data[1] = { 0 }; - callOnRilRequest(context, RIL_REQUEST_SCREEN_STATE, data, - sizeof(data), NULL); - } - ALOGD("testOnRilRequestUsingCppRequestObjs X:"); -} - -void testReqScreenStateProtobuf() { - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - ALOGD("testReqScreenStateProtobuf E"); - - ALOGD("create ReqScreenState"); - ril_proto::ReqScreenState* ss = new ril_proto::ReqScreenState(); - ss->set_state(true); - bool state = ss->state(); - ALOGD("state=%d", state); - ss->set_state(false); - state = ss->state(); - ALOGD("state=%d", state); - int len = ss->ByteSize(); - ALOGD("create buffer len=%d", len); - char *buffer = new char[len]; - ALOGD("serialize"); - bool ok = ss->SerializeToArray(buffer, len); - if (!ok) { - ALOGD("testReqScreenStateProtobuf X: Could not serialize ss"); - return; - } - ALOGD("ReqScreenState serialized ok"); - ril_proto::ReqScreenState *newSs = new ril_proto::ReqScreenState(); - ok = newSs->ParseFromArray(buffer, len); - if (!ok) { - ALOGD("testReqScreenStateProtobuf X: Could not deserialize ss"); - return; - } - ALOGD("newSs->state=%d", newSs->state()); - - delete [] buffer; - delete ss; - delete newSs; - ALOGD("testReqScreenStateProtobuf X"); -} - -void testReqHangUpProtobuf() { - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - ALOGD("testReqHangUpProtobuf E"); - - ALOGD("create ReqHangUp"); - ril_proto::ReqHangUp* hu = new ril_proto::ReqHangUp(); - hu->set_connection_index(3); - bool connection_index = hu->connection_index(); - ALOGD("connection_index=%d", connection_index); - hu->set_connection_index(2); - connection_index = hu->connection_index(); - ALOGD("connection_index=%d", connection_index); - ALOGD("create buffer"); - int len = hu->ByteSize(); - char *buffer = new char[len]; - ALOGD("serialize"); - bool ok = hu->SerializeToArray(buffer, len); - if (!ok) { - ALOGD("testReqHangUpProtobuf X: Could not serialize hu"); - return; - } - ALOGD("ReqHangUp serialized ok"); - ril_proto::ReqHangUp *newHu = new ril_proto::ReqHangUp(); - ok = newHu->ParseFromArray(buffer, len); - if (!ok) { - ALOGD("testReqHangUpProtobuf X: Could not deserialize hu"); - return; - } - ALOGD("newHu->connection_index=%d", newHu->connection_index()); - - delete [] buffer; - delete hu; - delete newHu; - ALOGD("testReqHangUpProtobuf X"); -} - -void testProtobufV8(v8::Handle context) { - ALOGD("testProtobufV8 E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - if (try_catch.HasCaught()) { - ALOGD("TryCatch.hasCaught is true after protobuf_v8::init"); - ReportException(&try_catch); - } - runJs(context, &try_catch, "local-string", - "fileContents = readFileToString('mock_ril.js');\n" - "print('fileContents:\\n' + fileContents);\n" - "\n" - "buffer = readFileToBuffer('ril.desc');\n" - "var schema = new Schema(buffer);\n" - "\n" - "var originalReqEnterSimPin = { pin : 'hello-the-pin' };\n" - "print('originalReqEnterSimPin: pin=' + originalReqEnterSimPin.pin);\n" - "var ReqEnterSimPinSchema = schema['ril_proto.ReqEnterSimPin'];\n" - "serializedOriginalReqEnterSimPin = ReqEnterSimPinSchema.serialize(originalReqEnterSimPin);\n" - "print('serializedOriginalReqEnterSimPin.length=' + serializedOriginalReqEnterSimPin.length);\n" - "newReqEnterSimPin = ReqEnterSimPinSchema.parse(serializedOriginalReqEnterSimPin);\n" - "print('newReqEnterSimPin: pin=' + newReqEnterSimPin.pin);\n" - "\n" - "var originalReqScreenState = { state : true };\n" - "print('originalReqScreenState: state=' + originalReqScreenState.state);\n" - "var ReqScreenStateSchema = schema['ril_proto.ReqScreenState'];\n" - "var serializedOriginalReqScreenState = ReqScreenStateSchema.serialize(originalReqScreenState);\n" - "print('serializedOriginalReqScreenState.length=' + serializedOriginalReqScreenState.length);\n" - "var newReqScreenState = ReqScreenStateSchema.parse(serializedOriginalReqScreenState);\n" - "print('newReqScreenState: state=' + newReqScreenState.state);\n" - "\n" - "originalReqScreenState.state = false;\n" - "print('originalReqScreenState: state=' + originalReqScreenState.state);\n" - "serializedOriginalReqScreenState = ReqScreenStateSchema.serialize(originalReqScreenState);\n" - "print('serializedOriginalReqScreenState.length=' + serializedOriginalReqScreenState.length);\n" - "newReqScreenState = ReqScreenStateSchema.parse(serializedOriginalReqScreenState);\n" - "print('newReqScreenState: state=' + newReqScreenState.state);\n"); - ALOGD("testProtobufV8 X"); -} - -void experiments(v8::Handle context) { - ALOGD("experiments E: ********"); - testStlPort(); - testReqScreenStateProtobuf(); - testOnRilRequestUsingCppRequestObjs(context); - testProtobufV8(context); - ALOGD("experiments X: ********\n"); -} diff --git a/mock-ril/src/cpp/experiments.h b/mock-ril/src/cpp/experiments.h deleted file mode 100644 index 54044ab..0000000 --- a/mock-ril/src/cpp/experiments.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_INITIAL_TESTS_H_ -#define MOCK_RIL_INITIAL_TESTS_H_ - -#include - -void experiments(v8::Handle context); - -#endif // MOCK_RIL_INITIAL_TESTS_H_ diff --git a/mock-ril/src/cpp/js_support.cpp b/mock-ril/src/cpp/js_support.cpp deleted file mode 100644 index ec10e38..0000000 --- a/mock-ril/src/cpp/js_support.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/** - * 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. - */ - -#include -#include "ril.h" - -#include "ctrl_server.h" -#include "logging.h" -#include "node_buffer.h" -#include "node_object_wrap.h" -#include "node_util.h" -#include "protobuf_v8.h" -#include "responses.h" -#include "status.h" -#include "util.h" -#include "worker.h" -#include "worker_v8.h" - -#include "js_support.h" - -//#define JS_SUPPORT_DEBUG -#ifdef JS_SUPPORT_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -/** - * Current Radio state - */ -RIL_RadioState gRadioState = RADIO_STATE_UNAVAILABLE; - -v8::Handle RadioStateGetter(v8::Local property, - const v8::AccessorInfo& info) { - return v8::Integer::New((int)gRadioState); -} - -void RadioStateSetter(v8::Local property, - v8::Local value, const v8::AccessorInfo& info) { - gRadioState = RIL_RadioState(value->Int32Value()); -} - -// A javascript sleep for a number of milli-seconds -v8::Handle MsSleep(const v8::Arguments& args) { - if (args.Length() != 1) { - DBG("MsSleep: expecting milli-seconds to sleep"); - } else { - v8::Handle v8MsValue(args[0]->ToObject()); - int ms = int(v8MsValue->NumberValue()); - v8::Unlocker unlocker; - usleep(ms * 1000); - v8::Locker locker; - } - return v8::Undefined(); -} - -// A javascript print function -v8::Handle Print(const v8::Arguments& args) { - bool first = true; - const int str_size = 1000; - char* str = new char[str_size]; - int offset = 0; - for (int i = 0; i < args.Length(); i++) { - v8::HandleScope handle_scope; - if (first) { - first = false; - } else { - offset += snprintf(&str[offset], str_size, " "); - } - v8::String::Utf8Value strUtf8(args[i]); - const char* cstr = ToCString(strUtf8); - offset += snprintf(&str[offset], str_size, "%s", cstr); - } - ALOGD("%s", str); - delete [] str; - return v8::Undefined(); -} - -int ReadFile(const char *fileName, char** data, size_t *length) { - int status; - char* buffer = NULL; - size_t fileLength = 0; - FILE *f; - - DBG("ReadFile E fileName=%s", fileName); - - f = fopen(fileName, "rb"); - if (f == NULL) { - DBG("Could not fopen '%s'", fileName); - status = STATUS_COULD_NOT_OPEN_FILE; - } else { - // Determine the length of the file - fseek(f, 0, SEEK_END); - fileLength = ftell(f); - DBG("fileLength=%d", fileLength); - rewind(f); - - // Read file into a buffer - buffer = new char[fileLength+1]; - size_t readLength = fread(buffer, 1, fileLength, f); - if (readLength != fileLength) { - DBG("Couldn't read entire file"); - delete [] buffer; - buffer = NULL; - status = STATUS_COULD_NOT_READ_FILE; - } else { - DBG("File read"); - buffer[fileLength] = 0; - status = STATUS_OK; - } - fclose(f); - } - - if (length != NULL) { - *length = fileLength; - } - *data = buffer; - DBG("ReadFile X status=%d", status); - return status; -} - -char *CreateFileName(const v8::Arguments& args) { - v8::String::Utf8Value fileNameUtf8Value(args[0]); - const char* fileName = ToCString(fileNameUtf8Value); - const char* directory = "/sdcard/data/"; - - int fullPathLength = strlen(directory) + strlen(fileName) + 1; - char * fullPath = new char[fullPathLength]; - strncpy(fullPath, directory, fullPathLength); - strncat(fullPath, fileName, fullPathLength); - return fullPath; -} - -// A javascript read file function arg[0] = filename -v8::Handle ReadFileToString(const v8::Arguments& args) { - DBG("ReadFileToString E"); - v8::HandleScope handle_scope; - v8::Handle retValue; - - if (args.Length() < 1) { - // No file name return Undefined - DBG("ReadFile X no argumens"); - return v8::Undefined(); - } else { - char *fileName = CreateFileName(args); - - char *buffer; - int status = ReadFile(fileName, &buffer); - if (status == 0) { - retValue = v8::String::New(buffer); - } else { - retValue = v8::Undefined(); - } - } - DBG("ReadFileToString X"); - return retValue; -} - -// A javascript read file function arg[0] = filename -v8::Handle ReadFileToBuffer(const v8::Arguments& args) { - DBG("ReadFileToBuffer E"); - v8::HandleScope handle_scope; - v8::Handle retValue; - - if (args.Length() < 1) { - // No file name return Undefined - DBG("ReadFileToBuffer X no argumens"); - return v8::Undefined(); - } else { - char *fileName = CreateFileName(args); - - char *buffer; - size_t length; - int status = ReadFile(fileName, &buffer, &length); - if (status == 0) { - Buffer *buf = Buffer::New(length); - memmove(buf->data(), buffer, length); - retValue = buf->handle_; - } else { - retValue = v8::Undefined(); - } - } - DBG("ReadFileToBuffer X"); - return retValue; -} - -void ErrorCallback(v8::Handle message, - v8::Handle data) { - LogErrorMessage(message, ""); -} - -// Read, compile and run a javascript file -v8::Handle Include(const v8::Arguments& args) { - DBG("Include E"); - v8::HandleScope handle_scope; - v8::Handle retValue; - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - if (args.Length() < 1) { - // No file name return Undefined - DBG("Include X no argumens"); - return v8::Undefined(); - } else { - char *fileName = CreateFileName(args); - - char *buffer; - int status = ReadFile(fileName, &buffer); - if (status == 0) { - runJs(v8::Context::GetCurrent(), &try_catch, fileName, buffer); - } else { - retValue = v8::Undefined(); - } - } - DBG("Include X"); - return retValue; -} - - -/** - * Create a JsContext, must be called within a HandleScope? - */ -v8::Persistent makeJsContext() { - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - // Add a Message listner to Catch errors as they occur - v8::V8::AddMessageListener(ErrorCallback); - - // Create a template for the global object and - // add the function template for print to it. - v8::Handle global = v8::ObjectTemplate::New(); - global->SetAccessor(v8::String::New("gRadioState"), - RadioStateGetter, RadioStateSetter); - global->Set(v8::String::New("msSleep"), v8::FunctionTemplate::New(MsSleep)); - global->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print)); - global->Set(v8::String::New("readFileToBuffer"), - v8::FunctionTemplate::New(ReadFileToBuffer)); - global->Set(v8::String::New("readFileToString"), - v8::FunctionTemplate::New(ReadFileToString)); - global->Set(v8::String::New("sendRilRequestComplete"), - v8::FunctionTemplate::New(SendRilRequestComplete)); - global->Set(v8::String::New("sendRilUnsolicitedResponse"), - v8::FunctionTemplate::New(SendRilUnsolicitedResponse)); - global->Set(v8::String::New("sendCtrlRequestComplete"), - v8::FunctionTemplate::New(SendCtrlRequestComplete)); - global->Set(v8::String::New("include"), v8::FunctionTemplate::New(Include)); - WorkerV8ObjectTemplateInit(global); - SchemaObjectTemplateInit(global); - Buffer::InitializeObjectTemplate(global); - - // Create context with our globals and make it the current scope - v8::Persistent context = v8::Context::New(NULL, global); - - - if (try_catch.HasCaught()) { - DBG("makeJsContext: Exception making the context"); - ReportException(&try_catch); - try_catch.ReThrow(); - } - - return context; -} - -/** - * Run some javascript code. - */ -void runJs(v8::Handle context, v8::TryCatch *try_catch, - const char *fileName, const char *code) { - v8::HandleScope handle_scope; - - // Compile the source - v8::Handle script = v8::Script::Compile( - v8::String::New(code), v8::String::New(fileName)); - if (try_catch->HasCaught()) { - ALOGE("-- Compiling the source failed"); - } else { - // Run the resulting script - v8::Handle result = script->Run(); - if (try_catch->HasCaught()) { - ALOGE("-- Running the script failed"); - } - } -} - -void testRadioState(v8::Handle context) { - ALOGD("testRadioState E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - runJs(context, &try_catch, "local-string", - "for(i = 0; i < 10; i++) {\n" - " gRadioState = i;\n" - " print('gRadioState=' + gRadioState);\n" - "}\n" - "gRadioState = 1;\n" - "print('last gRadioState=' + gRadioState);\n"); - ALOGD("testRadioState X:"); -} - -void testMsSleep(v8::Handle context) { - ALOGD("testMsSleep E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - runJs(context, &try_catch, "local-string", - "for(i = 0; i < 10; i++) {\n" - " sleeptime = i * 200\n" - " print('msSleep ' + sleeptime);\n" - " msSleep(sleeptime);\n" - "}\n"); - ALOGD("testMsSleep X:"); -} - -void testPrint(v8::Handle context) { - ALOGD("testPrint E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - runJs(context, &try_catch, "local-string", "print(\"Hello\")"); - ALOGD("testPrint X:"); -} - -void testCompileError(v8::Handle context) { - ALOGD("testCompileError E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - // +++ generate a compile time error - runJs(context, &try_catch, "local-string", "+++"); - ALOGD("testCompileError X:"); -} - -void testRuntimeError(v8::Handle context) { - ALOGD("testRuntimeError E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - // Runtime error - runJs(context, &try_catch, "local-string", - "function hello() {\n" - " print(\"Hi there\");\n" - "}\n" - "helloo()"); - ALOGD("testRuntimeError X:"); -} - -void testReadFile() { - char *buffer; - size_t length; - int status; - - ALOGD("testReadFile E:"); - - status = ReadFile("/sdcard/data/no-file", &buffer, &length); - ALOGD("testReadFile expect status != 0, status=%d, buffer=%p, length=%d", - status, buffer, length); - - ALOGD("testReadFile X:"); -} - - -void testReadFileToStringBuffer(v8::Handle context) { - ALOGD("testReadFileToStringBuffer E:"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - runJs(context, &try_catch, "local-string", - "fileContents = readFileToString(\"mock_ril.js\");\n" - "print(\"fileContents:\\n\" + fileContents);\n" - "buffer = readFileToBuffer(\"ril.desc\");\n" - "print(\"buffer.length=\" + buffer.length);\n"); - ALOGD("testReadFileToStringBuffer X:"); -} - -void testJsSupport(v8::Handle context) { - ALOGD("testJsSupport E: ********"); - testRadioState(context); - testMsSleep(context); - testPrint(context); - testCompileError(context); - testRuntimeError(context); - testReadFile(); - testReadFileToStringBuffer(context); - ALOGD("testJsSupport X: ********\n"); -} diff --git a/mock-ril/src/cpp/js_support.h b/mock-ril/src/cpp/js_support.h deleted file mode 100644 index 3116f1d..0000000 --- a/mock-ril/src/cpp/js_support.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_JS_SUPPORT_H_ -#define MOCK_RIL_JS_SUPPORT_H_ - -#include -#include "ril.h" - -// The global value of radio state shared between cpp and js code. -extern RIL_RadioState gRadioState; - -// A javascript print function -extern v8::Handle Print(const v8::Arguments& args); - -// Read a file into a array returning the buffer and the size -extern int ReadFile(const char *fileName, char** data, size_t *length = NULL); - -// A javascript read file function arg[0] = filename -extern v8::Handle ReadFileToString(const v8::Arguments& args); - -// A javascript read file function arg[0] = filename -extern v8::Handle ReadFileToBuffer(const v8::Arguments& args); - -// make the Java -extern v8::Persistent makeJsContext(); - -// Run a javascript -extern void runJs(v8::Handle context, v8::TryCatch *try_catch, - const char *fileName, const char *code); - -// Test this module -extern void testJsSupport(v8::Handle context); - -#endif // MOCK_RIL_JS_SUPPORT_H_ diff --git a/mock-ril/src/cpp/logging.h b/mock-ril/src/cpp/logging.h deleted file mode 100644 index 602fbf2..0000000 --- a/mock-ril/src/cpp/logging.h +++ /dev/null @@ -1,25 +0,0 @@ -/** - * 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. - */ - -#ifndef _LOGGING_H -#define _LOGGING_H - -// The LOG_TAG should start with "RIL" so it shows up in the radio log -#define LOG_TAG "RIL-MOCK" - -#include - -#endif diff --git a/mock-ril/src/cpp/mock_ril.cpp b/mock-ril/src/cpp/mock_ril.cpp deleted file mode 100644 index 7c199c9..0000000 --- a/mock-ril/src/cpp/mock_ril.cpp +++ /dev/null @@ -1,362 +0,0 @@ -/** - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "ril.h" - -#include "hardware/ril/mock-ril/src/proto/ril.pb.h" - -#include "ctrl_server.h" -#include "logging.h" -#include "experiments.h" -#include "js_support.h" -#include "node_buffer.h" -#include "node_object_wrap.h" -#include "node_util.h" -#include "protobuf_v8.h" -#include "requests.h" -#include "responses.h" -#include "status.h" -#include "util.h" -#include "worker.h" -#include "worker_v8.h" - -#include "mock_ril.h" - -extern "C" { -// Needed so we can call it prior to calling startMockRil -extern void RIL_register(const RIL_RadioFunctions *callbacks); -} - -//#define MOCK_RIL_DEBUG -#ifdef MOCK_RIL_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - - -#define MOCK_RIL_VER_STRING "Android Mock-ril 0.1" - -/** - * Forward declarations - */ -static void onRequest (int request, void *data, size_t datalen, RIL_Token t); -static RIL_RadioState currentState(); -static int onSupports (int requestCode); -static void onCancel (RIL_Token t); -static const char *getVersion(); - -static void testOnRequestComplete(RIL_Token t, RIL_Errno e, - void *response, size_t responselen); -static void testRequestTimedCallback(RIL_TimedCallback callback, - void *param, const struct timeval *relativeTime); -static void testOnUnsolicitedResponse(int unsolResponse, const void *data, - size_t datalen); - -/** - * The environment from rild with the completion routine - */ -const struct RIL_Env *s_rilenv; - -/** - * Expose our routines to rild - */ -static const RIL_RadioFunctions s_callbacks = { - RIL_VERSION, - onRequest, - currentState, - onSupports, - onCancel, - getVersion -}; - -/** - * A test environment - */ -static const RIL_Env testEnv = { - testOnRequestComplete, - testOnUnsolicitedResponse, - testRequestTimedCallback -}; - -/** - * The request worker queue to handle requests - */ -static RilRequestWorkerQueue *s_requestWorkerQueue; - -/** - * Call from RIL to us to make a RIL_REQUEST - * - * Must be completed with a call to RIL_onRequestComplete() - * - * RIL_onRequestComplete() may be called from any thread, before or after - * this function returns. - * - * Will always be called from the same thread, so returning here implies - * that the radio is ready to process another command (whether or not - * the previous command has c1mpleted). - */ -static void onRequest (int request, void *data, size_t datalen, RIL_Token t) -{ - DBG("onRequest: request=%d data=%p datalen=%d token=%p", - request, data, datalen, t); - s_requestWorkerQueue->AddRequest(request, data, datalen, t); -} - -/** - * Synchronous call from the RIL to us to return current radio state. - * RADIO_STATE_UNAVAILABLE should be the initial state. - */ -static RIL_RadioState currentState() -{ - DBG("currentState: gRadioState=%d", gRadioState); - return gRadioState; -} - -/** - * Call from RIL to us to find out whether a specific request code - * is supported by this implementation. - * - * Return 1 for "supported" and 0 for "unsupported" - */ - -static int -onSupports (int requestCode) -{ - DBG("onSupports: nothing supported at the moment, return 0"); - return 0; -} - -static void onCancel (RIL_Token t) -{ - DBG("onCancel: ignorning"); -} - -static const char * getVersion(void) -{ - DBG("getVersion: return '%s'", MOCK_RIL_VER_STRING); - return MOCK_RIL_VER_STRING; -} - -/** - * "t" is parameter passed in on previous call to RIL_Notification - * routine. - * - * If "e" != SUCCESS, then response can be null/is ignored - * - * "response" is owned by caller, and should not be modified or - * freed by callee - * - * RIL_onRequestComplete will return as soon as possible - */ -void testOnRequestComplete(RIL_Token t, RIL_Errno e, - void *response, size_t responselen) { - DBG("testOnRequestComplete E: token=%p rilErrCode=%d data=%p datalen=%d", - t, e, response, responselen); - DBG("testOnRequestComplete X:"); -} - -/** - * "unsolResponse" is one of RIL_UNSOL_RESPONSE_* - * "data" is pointer to data defined for that RIL_UNSOL_RESPONSE_* - * - * "data" is owned by caller, and should not be modified or freed by callee - */ -void testOnUnsolicitedResponse(int unsolResponse, const void *data, - size_t datalen) { - DBG("testOnUnsolicitedResponse ignoring"); -} - -/** - * Call user-specifed "callback" function on on the same thread that - * RIL_RequestFunc is called. If "relativeTime" is specified, then it specifies - * a relative time value at which the callback is invoked. If relativeTime is - * NULL or points to a 0-filled structure, the callback will be invoked as - * soon as possible - */ -void testRequestTimedCallback(RIL_TimedCallback callback, - void *param, const struct timeval *relativeTime) { - DBG("testRequestTimedCallback ignoring"); -} - -#if 0 -class UnsolicitedThread : public WorkerThread { - private: - v8::Handle context_; - - public: - UnsolicitedThread(v8::Handle context) : - context_(context) { - } - - int OnUnsolicitedTick(int tick) { - v8::HandleScope handle_scope; - - // Get handle to onUnslicitedTick. - v8::Handle name = v8::String::New("onUnsolicitedTick"); - v8::Handle functionValue = context_->Global()->Get(name); - v8::Handle onUnsolicitedTick = - v8::Handle::Cast(functionValue); - - // Create the argument array - v8::Handle v8TickValue = v8::Number::New(tick); - v8::Handle argv[1] = { v8TickValue }; - - v8::Handle resultValue = - onUnsolicitedTick->Call(context_->Global(), 1, argv); - int result = int(resultValue->NumberValue()); - return result; - } - - void * Worker(void *param) - { - ALOGD("UnsolicitedThread::Worker E param=%p", param); - - v8::Locker locker; - - for (int i = 0; isRunning(); i++) { - // Get access and setup scope - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(context_); - - // Do it - int sleepTime = OnUnsolicitedTick(i); - - // Wait - v8::Unlocker unlocker; - sleep(sleepTime); - v8::Locker locker; - } - - ALOGD("UnsolicitedThread::Worker X param=%p", param); - - return NULL; - } -}; -#endif - -void startMockRil(v8::Handle context) { - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - // Get handle to startMockRil and call it. - v8::Handle name = v8::String::New("startMockRil"); - v8::Handle functionValue = context->Global()->Get(name); - v8::Handle start = - v8::Handle::Cast(functionValue); - - v8::Handle result = start->Call(context->Global(), 0, NULL); - if (try_catch.HasCaught()) { - ALOGE("startMockRil error"); - ReportException(&try_catch); - ALOGE("FATAL ERROR: Unsable to startMockRil."); - } else { - v8::String::Utf8Value result_string(result); - ALOGE("startMockRil result=%s", ToCString(result_string)); - } - -} - - -const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, - char **argv) { - int ret; - pthread_attr_t attr; - - ALOGD("RIL_Init E: ----------------"); - - // Initialize V8 - v8::V8::Initialize(); - - // We're going to use multiple threads need to start locked - v8::Locker locker; - - // Initialize modules - protobuf_v8::Init(); - WorkerV8Init(); - - // Make a context and setup a scope - v8::Persistent context = makeJsContext(); - v8::Context::Scope context_scope(context); - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - // Initialize modules needing context - ctrlServerInit(context); - - s_rilenv = &testEnv; - - // load/run mock_ril.js - char *buffer; - int status = ReadFile("/sdcard/data/mock_ril.js", &buffer); - if (status == 0) { - runJs(context, &try_catch, "mock_ril.js", buffer); - if (try_catch.HasCaught()) { - // TODO: Change to event this is fatal - ALOGE("FATAL ERROR: Unable to run mock_ril.js"); - } - } - - s_rilenv = env; - requestsInit(context, &s_requestWorkerQueue); - responsesInit(context); - -#if 0 - ALOGD("RIL_Init run tests #####################"); - testJsSupport(context); - testRequests(context); - experiments(context); - testWorker(); - testWorkerV8(context); - ALOGD("RIL_Init tests completed ###############"); -#endif - - // Register our call backs so when we startMockRil - // and it wants to send unsolicited messages the - // mock ril is registered - RIL_register(&s_callbacks); - - // Start the mock ril - startMockRil(context); - -#if 0 - UnsolicitedThread *ut = new UnsolicitedThread(context); - ut->Run(NULL); -#endif - - ALOGD("RIL_Init X: ----------------"); - return &s_callbacks; -} diff --git a/mock-ril/src/cpp/mock_ril.h b/mock-ril/src/cpp/mock_ril.h deleted file mode 100644 index 38745d6..0000000 --- a/mock-ril/src/cpp/mock_ril.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_MOCK_RIL_H_ -#define MOCK_RIL_MOCK_RIL_H_ - -#include "ril.h" - -extern const struct RIL_Env *s_rilenv; - -#endif // MOCK_RIL_MOCK_RIL_H_ diff --git a/mock-ril/src/cpp/msgheader.pb.cpp b/mock-ril/src/cpp/msgheader.pb.cpp deleted file mode 100644 index dd10c94..0000000 --- a/mock-ril/src/cpp/msgheader.pb.cpp +++ /dev/null @@ -1,429 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! - -#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION -#include "hardware/ril/mock-ril/src/proto/msgheader.pb.h" -#include -#include -#include -#include -#include -#include -// @@protoc_insertion_point(includes) - -namespace communication { - -namespace { - -const ::google::protobuf::Descriptor* MsgHeader_descriptor_ = NULL; -const ::google::protobuf::internal::GeneratedMessageReflection* - MsgHeader_reflection_ = NULL; - -} // namespace - - -void protobuf_AssignDesc_msgheader_2eproto() { - protobuf_AddDesc_msgheader_2eproto(); - const ::google::protobuf::FileDescriptor* file = - ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( - "msgheader.proto"); - GOOGLE_CHECK(file != NULL); - MsgHeader_descriptor_ = file->message_type(0); - static const int MsgHeader_offsets_[4] = { - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, cmd_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, length_data_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, status_), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, token_), - }; - MsgHeader_reflection_ = - new ::google::protobuf::internal::GeneratedMessageReflection( - MsgHeader_descriptor_, - MsgHeader::default_instance_, - MsgHeader_offsets_, - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, _has_bits_[0]), - GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MsgHeader, _unknown_fields_), - -1, - ::google::protobuf::DescriptorPool::generated_pool(), - ::google::protobuf::MessageFactory::generated_factory(), - sizeof(MsgHeader)); -} - -namespace { - -GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); -inline void protobuf_AssignDescriptorsOnce() { - ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, - &protobuf_AssignDesc_msgheader_2eproto); -} - -void protobuf_RegisterTypes(const ::std::string&) { - protobuf_AssignDescriptorsOnce(); - ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( - MsgHeader_descriptor_, &MsgHeader::default_instance()); -} - -} // namespace - -void protobuf_ShutdownFile_msgheader_2eproto() { - delete MsgHeader::default_instance_; - delete MsgHeader_reflection_; -} - -void protobuf_AddDesc_msgheader_2eproto() { - static bool already_here = false; - if (already_here) return; - already_here = true; - GOOGLE_PROTOBUF_VERIFY_VERSION; - - ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( - "\n\017msgheader.proto\022\rcommunication\"L\n\tMsgH" - "eader\022\013\n\003cmd\030\001 \002(\r\022\023\n\013length_data\030\002 \002(\r\022" - "\016\n\006status\030\003 \001(\r\022\r\n\005token\030\004 \001(\004B$\n\"com.an" - "droid.internal.communication", 148); - ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( - "msgheader.proto", &protobuf_RegisterTypes); - MsgHeader::default_instance_ = new MsgHeader(); - MsgHeader::default_instance_->InitAsDefaultInstance(); - ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_msgheader_2eproto); -} - -// Force AddDescriptors() to be called at static initialization time. -struct StaticDescriptorInitializer_msgheader_2eproto { - StaticDescriptorInitializer_msgheader_2eproto() { - protobuf_AddDesc_msgheader_2eproto(); - } -} static_descriptor_initializer_msgheader_2eproto_; - - -// =================================================================== - -#ifndef _MSC_VER -const int MsgHeader::kCmdFieldNumber; -const int MsgHeader::kLengthDataFieldNumber; -const int MsgHeader::kStatusFieldNumber; -const int MsgHeader::kTokenFieldNumber; -#endif // !_MSC_VER - -MsgHeader::MsgHeader() - : ::google::protobuf::Message() { - SharedCtor(); -} - -void MsgHeader::InitAsDefaultInstance() { -} - -MsgHeader::MsgHeader(const MsgHeader& from) - : ::google::protobuf::Message() { - SharedCtor(); - MergeFrom(from); -} - -void MsgHeader::SharedCtor() { - _cached_size_ = 0; - cmd_ = 0u; - length_data_ = 0u; - status_ = 0u; - token_ = GOOGLE_ULONGLONG(0); - ::memset(_has_bits_, 0, sizeof(_has_bits_)); -} - -MsgHeader::~MsgHeader() { - SharedDtor(); -} - -void MsgHeader::SharedDtor() { - if (this != default_instance_) { - } -} - -void MsgHeader::SetCachedSize(int size) const { - GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); - _cached_size_ = size; - GOOGLE_SAFE_CONCURRENT_WRITES_END(); -} -const ::google::protobuf::Descriptor* MsgHeader::descriptor() { - protobuf_AssignDescriptorsOnce(); - return MsgHeader_descriptor_; -} - -const MsgHeader& MsgHeader::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_msgheader_2eproto(); return *default_instance_; -} - -MsgHeader* MsgHeader::default_instance_ = NULL; - -MsgHeader* MsgHeader::New() const { - return new MsgHeader; -} - -void MsgHeader::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - cmd_ = 0u; - length_data_ = 0u; - status_ = 0u; - token_ = GOOGLE_ULONGLONG(0); - } - ::memset(_has_bits_, 0, sizeof(_has_bits_)); - mutable_unknown_fields()->Clear(); -} - -bool MsgHeader::MergePartialFromCodedStream( - ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false - ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { - switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // required uint32 cmd = 1; - case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( - input, &cmd_))); - _set_bit(0); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(16)) goto parse_length_data; - break; - } - - // required uint32 length_data = 2; - case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_length_data: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( - input, &length_data_))); - _set_bit(1); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(24)) goto parse_status; - break; - } - - // optional uint32 status = 3; - case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_status: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( - input, &status_))); - _set_bit(2); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(32)) goto parse_token; - break; - } - - // optional uint64 token = 4; - case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_token: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( - input, &token_))); - _set_bit(3); - } else { - goto handle_uninterpreted; - } - if (input->ExpectAtEnd()) return true; - break; - } - - default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; - } - DO_(::google::protobuf::internal::WireFormat::SkipField( - input, tag, mutable_unknown_fields())); - break; - } - } - } - return true; -#undef DO_ -} - -void MsgHeader::SerializeWithCachedSizes( - ::google::protobuf::io::CodedOutputStream* output) const { - // required uint32 cmd = 1; - if (_has_bit(0)) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(1, this->cmd(), output); - } - - // required uint32 length_data = 2; - if (_has_bit(1)) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->length_data(), output); - } - - // optional uint32 status = 3; - if (_has_bit(2)) { - ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->status(), output); - } - - // optional uint64 token = 4; - if (_has_bit(3)) { - ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->token(), output); - } - - if (!unknown_fields().empty()) { - ::google::protobuf::internal::WireFormat::SerializeUnknownFields( - unknown_fields(), output); - } -} - -::google::protobuf::uint8* MsgHeader::SerializeWithCachedSizesToArray( - ::google::protobuf::uint8* target) const { - // required uint32 cmd = 1; - if (_has_bit(0)) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(1, this->cmd(), target); - } - - // required uint32 length_data = 2; - if (_has_bit(1)) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->length_data(), target); - } - - // optional uint32 status = 3; - if (_has_bit(2)) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(3, this->status(), target); - } - - // optional uint64 token = 4; - if (_has_bit(3)) { - target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->token(), target); - } - - if (!unknown_fields().empty()) { - target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( - unknown_fields(), target); - } - return target; -} - -int MsgHeader::ByteSize() const { - int total_size = 0; - - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // required uint32 cmd = 1; - if (has_cmd()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::UInt32Size( - this->cmd()); - } - - // required uint32 length_data = 2; - if (has_length_data()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::UInt32Size( - this->length_data()); - } - - // optional uint32 status = 3; - if (has_status()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::UInt32Size( - this->status()); - } - - // optional uint64 token = 4; - if (has_token()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::UInt64Size( - this->token()); - } - - } - if (!unknown_fields().empty()) { - total_size += - ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( - unknown_fields()); - } - GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); - _cached_size_ = total_size; - GOOGLE_SAFE_CONCURRENT_WRITES_END(); - return total_size; -} - -void MsgHeader::MergeFrom(const ::google::protobuf::Message& from) { - GOOGLE_CHECK_NE(&from, this); - const MsgHeader* source = - ::google::protobuf::internal::dynamic_cast_if_available( - &from); - if (source == NULL) { - ::google::protobuf::internal::ReflectionOps::Merge(from, this); - } else { - MergeFrom(*source); - } -} - -void MsgHeader::MergeFrom(const MsgHeader& from) { - GOOGLE_CHECK_NE(&from, this); - if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from._has_bit(0)) { - set_cmd(from.cmd()); - } - if (from._has_bit(1)) { - set_length_data(from.length_data()); - } - if (from._has_bit(2)) { - set_status(from.status()); - } - if (from._has_bit(3)) { - set_token(from.token()); - } - } - mutable_unknown_fields()->MergeFrom(from.unknown_fields()); -} - -void MsgHeader::CopyFrom(const ::google::protobuf::Message& from) { - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -void MsgHeader::CopyFrom(const MsgHeader& from) { - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool MsgHeader::IsInitialized() const { - if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; - - return true; -} - -void MsgHeader::Swap(MsgHeader* other) { - if (other != this) { - std::swap(cmd_, other->cmd_); - std::swap(length_data_, other->length_data_); - std::swap(status_, other->status_); - std::swap(token_, other->token_); - std::swap(_has_bits_[0], other->_has_bits_[0]); - _unknown_fields_.Swap(&other->_unknown_fields_); - std::swap(_cached_size_, other->_cached_size_); - } -} - -::google::protobuf::Metadata MsgHeader::GetMetadata() const { - protobuf_AssignDescriptorsOnce(); - ::google::protobuf::Metadata metadata; - metadata.descriptor = MsgHeader_descriptor_; - metadata.reflection = MsgHeader_reflection_; - return metadata; -} - - -// @@protoc_insertion_point(namespace_scope) - -} // namespace communication - -// @@protoc_insertion_point(global_scope) diff --git a/mock-ril/src/cpp/msgheader.pb.h b/mock-ril/src/cpp/msgheader.pb.h deleted file mode 100644 index a98bf3e..0000000 --- a/mock-ril/src/cpp/msgheader.pb.h +++ /dev/null @@ -1,237 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: msgheader.proto - -#ifndef PROTOBUF_msgheader_2eproto__INCLUDED -#define PROTOBUF_msgheader_2eproto__INCLUDED - -#include - -#include - -#if GOOGLE_PROTOBUF_VERSION < 2003000 -#error This file was generated by a newer version of protoc which is -#error incompatible with your Protocol Buffer headers. Please update -#error your headers. -#endif -#if 2003000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION -#error This file was generated by an older version of protoc which is -#error incompatible with your Protocol Buffer headers. Please -#error regenerate this file with a newer version of protoc. -#endif - -#include -#include -#include -#include -// @@protoc_insertion_point(includes) - -namespace communication { - -// Internal implementation detail -- do not call these. -void protobuf_AddDesc_msgheader_2eproto(); -void protobuf_AssignDesc_msgheader_2eproto(); -void protobuf_ShutdownFile_msgheader_2eproto(); - -class MsgHeader; - -// =================================================================== - -class MsgHeader : public ::google::protobuf::Message { - public: - MsgHeader(); - virtual ~MsgHeader(); - - MsgHeader(const MsgHeader& from); - - inline MsgHeader& operator=(const MsgHeader& from) { - CopyFrom(from); - return *this; - } - - inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { - return _unknown_fields_; - } - - inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { - return &_unknown_fields_; - } - - static const ::google::protobuf::Descriptor* descriptor(); - static const MsgHeader& default_instance(); - - void Swap(MsgHeader* other); - - // implements Message ---------------------------------------------- - - MsgHeader* New() const; - void CopyFrom(const ::google::protobuf::Message& from); - void MergeFrom(const ::google::protobuf::Message& from); - void CopyFrom(const MsgHeader& from); - void MergeFrom(const MsgHeader& from); - void Clear(); - bool IsInitialized() const; - - int ByteSize() const; - bool MergePartialFromCodedStream( - ::google::protobuf::io::CodedInputStream* input); - void SerializeWithCachedSizes( - ::google::protobuf::io::CodedOutputStream* output) const; - ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; - int GetCachedSize() const { return _cached_size_; } - private: - void SharedCtor(); - void SharedDtor(); - void SetCachedSize(int size) const; - public: - - ::google::protobuf::Metadata GetMetadata() const; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - // required uint32 cmd = 1; - inline bool has_cmd() const; - inline void clear_cmd(); - static const int kCmdFieldNumber = 1; - inline ::google::protobuf::uint32 cmd() const; - inline void set_cmd(::google::protobuf::uint32 value); - - // required uint32 length_data = 2; - inline bool has_length_data() const; - inline void clear_length_data(); - static const int kLengthDataFieldNumber = 2; - inline ::google::protobuf::uint32 length_data() const; - inline void set_length_data(::google::protobuf::uint32 value); - - // optional uint32 status = 3; - inline bool has_status() const; - inline void clear_status(); - static const int kStatusFieldNumber = 3; - inline ::google::protobuf::uint32 status() const; - inline void set_status(::google::protobuf::uint32 value); - - // optional uint64 token = 4; - inline bool has_token() const; - inline void clear_token(); - static const int kTokenFieldNumber = 4; - inline ::google::protobuf::uint64 token() const; - inline void set_token(::google::protobuf::uint64 value); - - // @@protoc_insertion_point(class_scope:communication.MsgHeader) - private: - ::google::protobuf::UnknownFieldSet _unknown_fields_; - mutable int _cached_size_; - - ::google::protobuf::uint32 cmd_; - ::google::protobuf::uint32 length_data_; - ::google::protobuf::uint32 status_; - ::google::protobuf::uint64 token_; - friend void protobuf_AddDesc_msgheader_2eproto(); - friend void protobuf_AssignDesc_msgheader_2eproto(); - friend void protobuf_ShutdownFile_msgheader_2eproto(); - - ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; - - // WHY DOES & HAVE LOWER PRECEDENCE THAN != !? - inline bool _has_bit(int index) const { - return (_has_bits_[index / 32] & (1u << (index % 32))) != 0; - } - inline void _set_bit(int index) { - _has_bits_[index / 32] |= (1u << (index % 32)); - } - inline void _clear_bit(int index) { - _has_bits_[index / 32] &= ~(1u << (index % 32)); - } - - void InitAsDefaultInstance(); - static MsgHeader* default_instance_; -}; -// =================================================================== - - -// =================================================================== - -// MsgHeader - -// required uint32 cmd = 1; -inline bool MsgHeader::has_cmd() const { - return _has_bit(0); -} -inline void MsgHeader::clear_cmd() { - cmd_ = 0u; - _clear_bit(0); -} -inline ::google::protobuf::uint32 MsgHeader::cmd() const { - return cmd_; -} -inline void MsgHeader::set_cmd(::google::protobuf::uint32 value) { - _set_bit(0); - cmd_ = value; -} - -// required uint32 length_data = 2; -inline bool MsgHeader::has_length_data() const { - return _has_bit(1); -} -inline void MsgHeader::clear_length_data() { - length_data_ = 0u; - _clear_bit(1); -} -inline ::google::protobuf::uint32 MsgHeader::length_data() const { - return length_data_; -} -inline void MsgHeader::set_length_data(::google::protobuf::uint32 value) { - _set_bit(1); - length_data_ = value; -} - -// optional uint32 status = 3; -inline bool MsgHeader::has_status() const { - return _has_bit(2); -} -inline void MsgHeader::clear_status() { - status_ = 0u; - _clear_bit(2); -} -inline ::google::protobuf::uint32 MsgHeader::status() const { - return status_; -} -inline void MsgHeader::set_status(::google::protobuf::uint32 value) { - _set_bit(2); - status_ = value; -} - -// optional uint64 token = 4; -inline bool MsgHeader::has_token() const { - return _has_bit(3); -} -inline void MsgHeader::clear_token() { - token_ = GOOGLE_ULONGLONG(0); - _clear_bit(3); -} -inline ::google::protobuf::uint64 MsgHeader::token() const { - return token_; -} -inline void MsgHeader::set_token(::google::protobuf::uint64 value) { - _set_bit(3); - token_ = value; -} - - -// @@protoc_insertion_point(namespace_scope) - -} // namespace communication - -#ifndef SWIG -namespace google { -namespace protobuf { - - -} // namespace google -} // namespace protobuf -#endif // SWIG - -// @@protoc_insertion_point(global_scope) - -#endif // PROTOBUF_msgheader_2eproto__INCLUDED diff --git a/mock-ril/src/cpp/node_buffer.cpp b/mock-ril/src/cpp/node_buffer.cpp deleted file mode 100644 index 4c08a26..0000000 --- a/mock-ril/src/cpp/node_buffer.cpp +++ /dev/null @@ -1,642 +0,0 @@ -/** - * Copied from node_buffer.cc - * see http://www.nodejs.org/ - * - * Node's license follows: - * - * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include "node_buffer.h" - -#include -#include // malloc, free -#include - -#include // memcpy - -#include // htons, htonl - -#include "logging.h" -#include "node_util.h" -#include "util.h" - -//#define BUFFER_DEBUG -#ifdef BUFFER_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - -using namespace v8; - -#define SLICE_ARGS(start_arg, end_arg) \ - if (!start_arg->IsInt32() || !end_arg->IsInt32()) { \ - return ThrowException(Exception::TypeError( \ - v8::String::New("Bad argument."))); \ - } \ - int32_t start = start_arg->Int32Value(); \ - int32_t end = end_arg->Int32Value(); \ - if (start < 0 || end < 0) { \ - return ThrowException(Exception::TypeError( \ - v8::String::New("Bad argument."))); \ - } \ - if (!(start <= end)) { \ - return ThrowException(Exception::Error( \ - v8::String::New("Must have start <= end"))); \ - } \ - if ((size_t)end > parent->length_) { \ - return ThrowException(Exception::Error( \ - v8::String::New("end cannot be longer than parent.length"))); \ - } - -static Persistent length_symbol; -static Persistent chars_written_sym; -static Persistent write_sym; -Persistent Buffer::constructor_template; - - -// Each javascript Buffer object is backed by a Blob object. -// the Blob is just a C-level chunk of bytes. -// It has a reference count. -struct Blob_ { - unsigned int refs; - size_t length; - char *data; -}; -typedef struct Blob_ Blob; - - -static inline Blob * blob_new(size_t length) { - DBG("blob_new E"); - Blob * blob = (Blob*) malloc(sizeof(Blob)); - if (!blob) return NULL; - - blob->data = (char*) malloc(length); - if (!blob->data) { - DBG("blob_new X no memory for data"); - free(blob); - return NULL; - } - - V8::AdjustAmountOfExternalAllocatedMemory(sizeof(Blob) + length); - blob->length = length; - blob->refs = 0; - DBG("blob_new X"); - return blob; -} - - -static inline void blob_ref(Blob *blob) { - blob->refs++; -} - - -static inline void blob_unref(Blob *blob) { - assert(blob->refs > 0); - if (--blob->refs == 0) { - DBG("blob_unref == 0"); - //fprintf(stderr, "free %d bytes\n", blob->length); - V8::AdjustAmountOfExternalAllocatedMemory(-(sizeof(Blob) + blob->length)); - free(blob->data); - free(blob); - DBG("blob_unref blob and its data freed"); - } -} - -#if 0 -// When someone calls buffer.asciiSlice, data is not copied. Instead V8 -// references in the underlying Blob with this ExternalAsciiStringResource. -class AsciiSliceExt: public String::ExternalAsciiStringResource { - friend class Buffer; - public: - AsciiSliceExt(Buffer *parent, size_t start, size_t end) { - blob_ = parent->blob(); - blob_ref(blob_); - - assert(start <= end); - length_ = end - start; - assert(start + length_ <= parent->length()); - data_ = parent->data() + start; - } - - - ~AsciiSliceExt() { - //fprintf(stderr, "free ascii slice (%d refs left)\n", blob_->refs); - blob_unref(blob_); - } - - - const char* data() const { return data_; } - size_t length() const { return length_; } - - private: - const char *data_; - size_t length_; - Blob *blob_; -}; -#endif - -Buffer* Buffer::New(size_t size) { - DBG("Buffer::New(size) E"); - HandleScope scope; - - Local arg = Integer::NewFromUnsigned(size); - Local b = constructor_template->GetFunction()->NewInstance(1, &arg); - - DBG("Buffer::New(size) X"); - return ObjectWrap::Unwrap(b); -} - - -Handle Buffer::New(const Arguments &args) { - DBG("Buffer::New(args) E"); - HandleScope scope; - - Buffer *buffer; - if ((args.Length() == 0) || args[0]->IsInt32()) { - size_t length = 0; - if (args[0]->IsInt32()) { - length = args[0]->Uint32Value(); - } - buffer = new Buffer(length); - } else if (args[0]->IsArray()) { - Local a = Local::Cast(args[0]); - buffer = new Buffer(a->Length()); - char *p = buffer->data(); - for (unsigned int i = 0; i < a->Length(); i++) { - p[i] = a->Get(i)->Uint32Value(); - } - } else if (args[0]->IsString()) { - Local s = args[0]->ToString(); - enum encoding e = ParseEncoding(args[1], UTF8); - int length = e == UTF8 ? s->Utf8Length() : s->Length(); - buffer = new Buffer(length); - } else if (Buffer::HasInstance(args[0]) && args.Length() > 2) { - // var slice = new Buffer(buffer, 123, 130); - // args: parent, start, end - Buffer *parent = ObjectWrap::Unwrap(args[0]->ToObject()); - SLICE_ARGS(args[1], args[2]) - buffer = new Buffer(parent, start, end); - } else { - DBG("Buffer::New(args) X Bad argument"); - return ThrowException(Exception::TypeError(String::New("Bad argument"))); - } - - buffer->Wrap(args.This()); - args.This()->SetIndexedPropertiesToExternalArrayData(buffer->data(), - kExternalUnsignedByteArray, - buffer->length()); - args.This()->Set(length_symbol, Integer::New(buffer->length_)); - - if (args[0]->IsString()) { - if (write_sym.IsEmpty()) { - write_sym = Persistent::New(String::NewSymbol("write")); - } - - Local write_v = args.This()->Get(write_sym); - assert(write_v->IsFunction()); - Local write = Local::Cast(write_v); - - Local argv[2] = { args[0], args[1] }; - - TryCatch try_catch; - - write->Call(args.This(), 2, argv); - - if (try_catch.HasCaught()) { - ReportException(&try_catch); - } - } - - DBG("Buffer::New(args) X"); - return args.This(); -} - - -Buffer::Buffer(size_t length) : ObjectWrap() { - DBG("Buffer::Buffer(length) E"); - blob_ = blob_new(length); - off_ = 0; - length_ = length; - - blob_ref(blob_); - - V8::AdjustAmountOfExternalAllocatedMemory(sizeof(Buffer)); - DBG("Buffer::Buffer(length) X"); -} - - -Buffer::Buffer(Buffer *parent, size_t start, size_t end) : ObjectWrap() { - DBG("Buffer::Buffer(parent, start, end) E"); - blob_ = parent->blob_; - assert(blob_->refs > 0); - blob_ref(blob_); - - assert(start <= end); - off_ = parent->off_ + start; - length_ = end - start; - assert(length_ <= parent->length_); - - V8::AdjustAmountOfExternalAllocatedMemory(sizeof(Buffer)); - DBG("Buffer::Buffer(parent, start, end) X"); -} - - -Buffer::~Buffer() { - DBG("Buffer::~Buffer() E"); - assert(blob_->refs > 0); - //fprintf(stderr, "free buffer (%d refs left)\n", blob_->refs); - blob_unref(blob_); - V8::AdjustAmountOfExternalAllocatedMemory(-static_cast(sizeof(Buffer))); - DBG("Buffer::~Buffer() X"); -} - - -char* Buffer::data() { - char *p = blob_->data + off_; - DBG("Buffer::data() EX p=%p", p); - return p; -} - -void Buffer::NewBlob(size_t length) { - DBG("Buffer::NewBlob(length) E"); - blob_unref(blob_); - blob_ = blob_new(length); - off_ = 0; - length_ = length; - - blob_ref(blob_); - - V8::AdjustAmountOfExternalAllocatedMemory(sizeof(Buffer)); - DBG("Buffer::NewBlob(length) X"); -} - - -Handle Buffer::BinarySlice(const Arguments &args) { - DBG("Buffer::BinarySlice(args) E"); - HandleScope scope; - Buffer *parent = ObjectWrap::Unwrap(args.This()); - SLICE_ARGS(args[0], args[1]) - - const char *data = const_cast(parent->data() + start); - //Local string = String::New(data, end - start); - - Local b = Encode(data, end - start, BINARY); - - DBG("Buffer::BinarySlice(args) X"); - return scope.Close(b); -} - - -Handle Buffer::AsciiSlice(const Arguments &args) { - DBG("Buffer::AsciiSlice(args) E"); - HandleScope scope; - Buffer *parent = ObjectWrap::Unwrap(args.This()); - SLICE_ARGS(args[0], args[1]) - -#if 0 - AsciiSliceExt *ext = new AsciiSliceExt(parent, start, end); - Local string = String::NewExternal(ext); - // There should be at least two references to the blob now - the parent - // and the slice. - assert(parent->blob_->refs >= 2); -#endif - - const char *data = const_cast(parent->data() + start); - Local string = String::New(data, end - start); - - - DBG("Buffer::AsciiSlice(args) X"); - return scope.Close(string); -} - - -Handle Buffer::Utf8Slice(const Arguments &args) { - DBG("Buffer::Utf8Slice(args) E"); - HandleScope scope; - Buffer *parent = ObjectWrap::Unwrap(args.This()); - SLICE_ARGS(args[0], args[1]) - const char *data = const_cast(parent->data() + start); - Local string = String::New(data, end - start); - DBG("Buffer::Utf8Slice(args) X"); - return scope.Close(string); -} - - -Handle Buffer::Slice(const Arguments &args) { - DBG("Buffer::Slice(args) E"); - HandleScope scope; - Local argv[3] = { args.This(), args[0], args[1] }; - Local slice = - constructor_template->GetFunction()->NewInstance(3, argv); - DBG("Buffer::Slice(args) X"); - return scope.Close(slice); -} - - -// var bytesCopied = buffer.copy(target, targetStart, sourceStart, sourceEnd); -Handle Buffer::Copy(const Arguments &args) { - DBG("Buffer::Copy(args) E"); - HandleScope scope; - - Buffer *source = ObjectWrap::Unwrap(args.This()); - - if (!Buffer::HasInstance(args[0])) { - DBG("Buffer::Copy(args) X arg[0] not buffer"); - return ThrowException(Exception::TypeError(String::New( - "First arg should be a Buffer"))); - } - - Buffer *target = ObjectWrap::Unwrap(args[0]->ToObject()); - - ssize_t target_start = args[1]->Int32Value(); - ssize_t source_start = args[2]->Int32Value(); - ssize_t source_end = args[3]->IsInt32() ? args[3]->Int32Value() - : source->length(); - - if (source_end < source_start) { - DBG("Buffer::Copy(args) X end < start"); - return ThrowException(Exception::Error(String::New( - "sourceEnd < sourceStart"))); - } - - if (target_start < 0 || ((size_t)target_start) > target->length()) { - DBG("Buffer::Copy(args) X targetStart bad"); - return ThrowException(Exception::Error(String::New( - "targetStart out of bounds"))); - } - - if (source_start < 0 || ((size_t)source_start) > source->length()) { - DBG("Buffer::Copy(args) X base source start"); - return ThrowException(Exception::Error(String::New( - "sourceStart out of bounds"))); - } - - if (source_end < 0 || ((size_t)source_end) > source->length()) { - DBG("Buffer::Copy(args) X bad source"); - return ThrowException(Exception::Error(String::New( - "sourceEnd out of bounds"))); - } - - ssize_t to_copy = MIN(source_end - source_start, - target->length() - target_start); - - memcpy((void*)(target->data() + target_start), - (const void*)(source->data() + source_start), - to_copy); - - DBG("Buffer::Copy(args) X"); - return scope.Close(Integer::New(to_copy)); -} - - -// var charsWritten = buffer.utf8Write(string, offset); -Handle Buffer::Utf8Write(const Arguments &args) { - DBG("Buffer::Utf8Write(args) X"); - HandleScope scope; - Buffer *buffer = ObjectWrap::Unwrap(args.This()); - - if (!args[0]->IsString()) { - DBG("Buffer::Utf8Write(args) X arg[0] not string"); - return ThrowException(Exception::TypeError(String::New( - "Argument must be a string"))); - } - - Local s = args[0]->ToString(); - - size_t offset = args[1]->Int32Value(); - - if (offset >= buffer->length_) { - DBG("Buffer::Utf8Write(args) X offset bad"); - return ThrowException(Exception::TypeError(String::New( - "Offset is out of bounds"))); - } - - const char *p = buffer->data() + offset; - - int char_written; - - int written = s->WriteUtf8((char*)p, - buffer->length_ - offset, - &char_written, - String::HINT_MANY_WRITES_EXPECTED); - - constructor_template->GetFunction()->Set(chars_written_sym, - Integer::New(char_written)); - - if (written > 0 && p[written-1] == '\0') written--; - - DBG("Buffer::Utf8Write(args) X"); - return scope.Close(Integer::New(written)); -} - - -// var charsWritten = buffer.asciiWrite(string, offset); -Handle Buffer::AsciiWrite(const Arguments &args) { - DBG("Buffer::AsciiWrite(args) E"); - HandleScope scope; - - Buffer *buffer = ObjectWrap::Unwrap(args.This()); - - if (!args[0]->IsString()) { - DBG("Buffer::AsciiWrite(args) X arg[0] not string"); - return ThrowException(Exception::TypeError(String::New( - "Argument must be a string"))); - } - - Local s = args[0]->ToString(); - - size_t offset = args[1]->Int32Value(); - - if (offset >= buffer->length_) { - DBG("Buffer::AsciiWrite(args) X bad offset"); - return ThrowException(Exception::TypeError(String::New( - "Offset is out of bounds"))); - } - - const char *p = buffer->data() + offset; - - size_t towrite = MIN((unsigned long) s->Length(), buffer->length_ - offset); - - int written = s->WriteAscii((char*)p, 0, towrite, String::HINT_MANY_WRITES_EXPECTED); - DBG("Buffer::AsciiWrite(args) X"); - return scope.Close(Integer::New(written)); -} - - -Handle Buffer::BinaryWrite(const Arguments &args) { - DBG("Buffer::BinaryWrite(args) E"); - HandleScope scope; - - Buffer *buffer = ObjectWrap::Unwrap(args.This()); - - if (!args[0]->IsString()) { - DBG("Buffer::BinaryWrite(args) X arg[0] not string"); - return ThrowException(Exception::TypeError(String::New( - "Argument must be a string"))); - } - - Local s = args[0]->ToString(); - - size_t offset = args[1]->Int32Value(); - - if (offset >= buffer->length_) { - DBG("Buffer::BinaryWrite(args) X offset bad"); - return ThrowException(Exception::TypeError(String::New( - "Offset is out of bounds"))); - } - - char *p = (char*)buffer->data() + offset; - - size_t towrite = MIN((unsigned long) s->Length(), buffer->length_ - offset); - - int written = DecodeWrite(p, towrite, s, BINARY); - DBG("Buffer::BinaryWrite(args) X"); - return scope.Close(Integer::New(written)); -} - - -// buffer.unpack(format, index); -// Starting at 'index', unpacks binary from the buffer into an array. -// 'format' is a string -// -// FORMAT RETURNS -// N uint32_t a 32bit unsigned integer in network byte order -// n uint16_t a 16bit unsigned integer in network byte order -// o uint8_t a 8bit unsigned integer -Handle Buffer::Unpack(const Arguments &args) { - DBG("Buffer::Unpack(args) E"); - HandleScope scope; - Buffer *buffer = ObjectWrap::Unwrap(args.This()); - - if (!args[0]->IsString()) { - DBG("Buffer::Unpack(args) X arg[0] not string"); - return ThrowException(Exception::TypeError(String::New( - "Argument must be a string"))); - } - - String::AsciiValue format(args[0]->ToString()); - uint32_t index = args[1]->Uint32Value(); - -#define OUT_OF_BOUNDS ThrowException(Exception::Error(String::New("Out of bounds"))) - - Local array = Array::New(format.length()); - - uint8_t uint8; - uint16_t uint16; - uint32_t uint32; - - for (int i = 0; i < format.length(); i++) { - switch ((*format)[i]) { - // 32bit unsigned integer in network byte order - case 'N': - if (index + 3 >= buffer->length_) return OUT_OF_BOUNDS; - uint32 = htonl(*(uint32_t*)(buffer->data() + index)); - array->Set(Integer::New(i), Integer::NewFromUnsigned(uint32)); - index += 4; - break; - - // 16bit unsigned integer in network byte order - case 'n': - if (index + 1 >= buffer->length_) return OUT_OF_BOUNDS; - uint16 = htons(*(uint16_t*)(buffer->data() + index)); - array->Set(Integer::New(i), Integer::NewFromUnsigned(uint16)); - index += 2; - break; - - // a single octet, unsigned. - case 'o': - if (index >= buffer->length_) return OUT_OF_BOUNDS; - uint8 = (uint8_t)buffer->data()[index]; - array->Set(Integer::New(i), Integer::NewFromUnsigned(uint8)); - index += 1; - break; - - default: - DBG("Buffer::Unpack(args) X unknown format character"); - return ThrowException(Exception::Error( - String::New("Unknown format character"))); - } - } - - DBG("Buffer::Unpack(args) X"); - return scope.Close(array); -} - - -// var nbytes = Buffer.byteLength("string", "utf8") -Handle Buffer::ByteLength(const Arguments &args) { - DBG("Buffer::ByteLength(args) E"); - HandleScope scope; - - if (!args[0]->IsString()) { - DBG("Buffer::ByteLength(args) X arg[0] not a string"); - return ThrowException(Exception::TypeError(String::New( - "Argument must be a string"))); - } - - Local s = args[0]->ToString(); - enum encoding e = ParseEncoding(args[1], UTF8); - - Local length = - Integer::New(e == UTF8 ? s->Utf8Length() : s->Length()); - - DBG("Buffer::ByteLength(args) X"); - return scope.Close(length); -} - -void Buffer::InitializeObjectTemplate(Handle target) { - DBG("InitializeObjectTemplate(target) E:"); - HandleScope scope; - - length_symbol = Persistent::New(String::NewSymbol("length")); - chars_written_sym = Persistent::New(String::NewSymbol("_charsWritten")); - - Local t = FunctionTemplate::New(Buffer::New); - constructor_template = Persistent::New(t); - constructor_template->InstanceTemplate()->SetInternalFieldCount(1); - constructor_template->SetClassName(String::NewSymbol("Buffer")); - - // copy free - SET_PROTOTYPE_METHOD(constructor_template, "binarySlice", Buffer::BinarySlice); - SET_PROTOTYPE_METHOD(constructor_template, "asciiSlice", Buffer::AsciiSlice); - SET_PROTOTYPE_METHOD(constructor_template, "slice", Buffer::Slice); - // TODO SET_PROTOTYPE_METHOD(t, "utf16Slice", Utf16Slice); - // copy - SET_PROTOTYPE_METHOD(constructor_template, "utf8Slice", Buffer::Utf8Slice); - - SET_PROTOTYPE_METHOD(constructor_template, "utf8Write", Buffer::Utf8Write); - SET_PROTOTYPE_METHOD(constructor_template, "asciiWrite", Buffer::AsciiWrite); - SET_PROTOTYPE_METHOD(constructor_template, "binaryWrite", Buffer::BinaryWrite); - SET_PROTOTYPE_METHOD(constructor_template, "unpack", Buffer::Unpack); - SET_PROTOTYPE_METHOD(constructor_template, "copy", Buffer::Copy); - - SET_PROTOTYPE_METHOD(constructor_template, "byteLength", Buffer::ByteLength); - - target->Set(String::NewSymbol("Buffer"), constructor_template); - DBG("InitializeObjectTemplate(target) X:"); -} diff --git a/mock-ril/src/cpp/node_buffer.h b/mock-ril/src/cpp/node_buffer.h deleted file mode 100644 index 0d3d774..0000000 --- a/mock-ril/src/cpp/node_buffer.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copied from node_buffer.h - * see http://www.nodejs.org/ - * - * Node's license follows: - * - * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#ifndef MOCK_RIL_NODE_BUFFER_H_ -#define MOCK_RIL_NODE_BUFFER_H_ - -#include -#include "node_object_wrap.h" - -/* A buffer is a chunk of memory stored outside the V8 heap, mirrored by an - * object in javascript. The object is not totally opaque, one can access - * individual bytes with [] and slice it into substrings or sub-buffers - * without copying memory. - * - * // return an ascii encoded string - no memory iscopied - * buffer.asciiSlide(0, 3) - * - * // returns another buffer - no memory is copied - * buffer.slice(0, 3) - * - * Interally, each javascript buffer object is backed by a "struct buffer" - * object. These "struct buffer" objects are either a root buffer (in the - * case that buffer->root == NULL) or slice objects (in which case - * buffer->root != NULL). A root buffer is only GCed once all its slices - * are GCed. - */ - - -struct Blob_; - -class Buffer : public ObjectWrap { - public: - ~Buffer(); - - static void Initialize(v8::Handle target); - static void InitializeObjectTemplate(v8::Handle target); - static Buffer* New(size_t length); // public constructor - static inline bool HasInstance(v8::Handle val) { - if (!val->IsObject()) return false; - v8::Local obj = val->ToObject(); - return constructor_template->HasInstance(obj); - } - - char* data(); - size_t length() const { return length_; } - struct Blob_* blob() const { return blob_; } - void NewBlob(size_t length); - - int AsciiWrite(char *string, int offset, int length); - int Utf8Write(char *string, int offset, int length); - - private: - static v8::Persistent constructor_template; - - static v8::Handle New(const v8::Arguments &args); - static v8::Handle Slice(const v8::Arguments &args); - static v8::Handle BinarySlice(const v8::Arguments &args); - static v8::Handle AsciiSlice(const v8::Arguments &args); - static v8::Handle Utf8Slice(const v8::Arguments &args); - static v8::Handle BinaryWrite(const v8::Arguments &args); - static v8::Handle AsciiWrite(const v8::Arguments &args); - static v8::Handle Utf8Write(const v8::Arguments &args); - static v8::Handle ByteLength(const v8::Arguments &args); - static v8::Handle Unpack(const v8::Arguments &args); - static v8::Handle Copy(const v8::Arguments &args); - - Buffer(size_t length); - Buffer(Buffer *parent, size_t start, size_t end); - - size_t off_; // offset inside blob_ - size_t length_; // length inside blob_ - struct Blob_ *blob_; -}; - -#endif // MOCK_RIL_NODE_BUFFER_H_ diff --git a/mock-ril/src/cpp/node_object_wrap.h b/mock-ril/src/cpp/node_object_wrap.h deleted file mode 100644 index 1bcee62..0000000 --- a/mock-ril/src/cpp/node_object_wrap.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copied from node_object_wrap.h - * see http://www.nodejs.org/ - * - * Node's license follows: - * - * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#ifndef MOCK_RIL_NODE_OBJECT_WRAP_H_ -#define MOCK_RIL_NODE_OBJECT_WRAP_H_ - -#include -#include - -class ObjectWrap { - public: - ObjectWrap ( ) { - refs_ = 0; - } - - virtual ~ObjectWrap ( ) { - if (!handle_.IsEmpty()) { - assert(handle_.IsNearDeath()); - handle_->SetInternalField(0, v8::Undefined()); - handle_.Dispose(); - handle_.Clear(); - } - } - - template - static inline T* Unwrap (v8::Handle handle) - { - assert(!handle.IsEmpty()); - assert(handle->InternalFieldCount() > 0); - return static_cast(v8::Handle::Cast( - handle->GetInternalField(0))->Value()); - } - - v8::Persistent handle_; // ro - - protected: - inline void Wrap (v8::Handle handle) - { - assert(handle_.IsEmpty()); - assert(handle->InternalFieldCount() > 0); - handle_ = v8::Persistent::New(handle); - handle_->SetInternalField(0, v8::External::New(this)); - MakeWeak(); - } - - inline void MakeWeak (void) - { - handle_.MakeWeak(this, WeakCallback); - } - - /* Ref() marks the object as being attached to an event loop. - * Refed objects will not be garbage collected, even if - * all references are lost. - */ - virtual void Ref() { - assert(!handle_.IsEmpty()); - refs_++; - handle_.ClearWeak(); - } - - /* Unref() marks an object as detached from the event loop. This is its - * default state. When an object with a "weak" reference changes from - * attached to detached state it will be freed. Be careful not to access - * the object after making this call as it might be gone! - * (A "weak reference" means an object that only has a - * persistant handle.) - * - * DO NOT CALL THIS FROM DESTRUCTOR - */ - virtual void Unref() { - assert(!handle_.IsEmpty()); - assert(!handle_.IsWeak()); - assert(refs_ > 0); - if (--refs_ == 0) { MakeWeak(); } - } - - int refs_; // ro - - private: - static void WeakCallback (v8::Persistent value, void *data) - { - ObjectWrap *obj = static_cast(data); - assert(value == obj->handle_); - assert(!obj->refs_); - if (value.IsNearDeath()) delete obj; - } -}; - -#endif // MOCK_RIL_NODE_OBJECT_WRAP_H_ diff --git a/mock-ril/src/cpp/node_util.cpp b/mock-ril/src/cpp/node_util.cpp deleted file mode 100644 index 5048e53..0000000 --- a/mock-ril/src/cpp/node_util.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Contents of this file are snippets from node.cc - * see http://www.nodejs.org/ - * - * Node's license follows: - * - * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - */ -#include -#include - -#include "logging.h" -#include "node_object_wrap.h" - -#include "node_util.h" - -enum encoding ParseEncoding(v8::Handle encoding_v, enum encoding _default) { - v8::HandleScope scope; - - if (!encoding_v->IsString()) return _default; - - v8::String::Utf8Value encoding(encoding_v->ToString()); - - if (strcasecmp(*encoding, "utf8") == 0) { - return UTF8; - } else if (strcasecmp(*encoding, "utf-8") == 0) { - return UTF8; - } else if (strcasecmp(*encoding, "ascii") == 0) { - return ASCII; - } else if (strcasecmp(*encoding, "binary") == 0) { - return BINARY; - } else if (strcasecmp(*encoding, "raw") == 0) { - fprintf(stderr, "'raw' (array of integers) has been removed. " - "Use 'binary'.\n"); - return BINARY; - } else if (strcasecmp(*encoding, "raws") == 0) { - fprintf(stderr, "'raws' encoding has been renamed to 'binary'. " - "Please update your code.\n"); - return BINARY; - } else { - return _default; - } -} - -v8::Local Encode(const void *buf, size_t len, enum encoding encoding) { - v8::HandleScope scope; - - if (!len) return scope.Close(v8::String::Empty()); - - if (encoding == BINARY) { - const unsigned char *cbuf = static_cast(buf); - uint16_t * twobytebuf = new uint16_t[len]; - for (size_t i = 0; i < len; i++) { - // XXX is the following line platform independent? - twobytebuf[i] = cbuf[i]; - } - v8::Local chunk = v8::String::New(twobytebuf, len); - delete [] twobytebuf; // TODO use ExternalTwoBytev8::String? - return scope.Close(chunk); - } - - // utf8 or ascii encoding - v8::Local chunk = v8::String::New((const char*)buf, len); - return scope.Close(chunk); -} - -// Returns -1 if the handle was not valid for decoding -ssize_t DecodeBytes(v8::Handle val, enum encoding encoding) { - v8::HandleScope scope; - - if (val->IsArray()) { - fprintf(stderr, "'raw' encoding (array of integers) has been removed. " - "Use 'binary'.\n"); - assert(0); - return -1; - } - - v8::Local str = val->ToString(); - - if (encoding == UTF8) return str->Utf8Length(); - - return str->Length(); -} - -#ifndef MIN -# define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - -// Returns number of bytes written. -ssize_t DecodeWrite(char *buf, - size_t buflen, - v8::Handle val, - enum encoding encoding) { - v8::HandleScope scope; - - // XXX - // A lot of improvement can be made here. See: - // http://code.google.com/p/v8/issues/detail?id=270 - // http://groups.google.com/group/v8-dev/browse_thread/thread/dba28a81d9215291/ece2b50a3b4022c - // http://groups.google.com/group/v8-users/browse_thread/thread/1f83b0ba1f0a611 - - if (val->IsArray()) { - fprintf(stderr, "'raw' encoding (array of integers) has been removed. " - "Use 'binary'.\n"); - assert(0); - return -1; - } - - v8::Local str = val->ToString(); - - if (encoding == UTF8) { - str->WriteUtf8(buf, buflen, NULL, v8::String::HINT_MANY_WRITES_EXPECTED); - return buflen; - } - - if (encoding == ASCII) { - str->WriteAscii(buf, 0, buflen, v8::String::HINT_MANY_WRITES_EXPECTED); - return buflen; - } - - // THIS IS AWFUL!!! FIXME - - assert(encoding == BINARY); - - uint16_t * twobytebuf = new uint16_t[buflen]; - - str->Write(twobytebuf, 0, buflen, v8::String::HINT_MANY_WRITES_EXPECTED); - - for (size_t i = 0; i < buflen; i++) { - unsigned char *b = reinterpret_cast(&twobytebuf[i]); - assert(b[1] == 0); - buf[i] = b[0]; - } - - delete [] twobytebuf; - - return buflen; -} diff --git a/mock-ril/src/cpp/node_util.h b/mock-ril/src/cpp/node_util.h deleted file mode 100644 index e19a8e7..0000000 --- a/mock-ril/src/cpp/node_util.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Contents of this file are snippets from node.h and node.cc - * see http://www.nodejs.org/ - * - * Node's license follows: - * - * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - */ - - -#ifndef MOCK_RIL_NODE_UTIL_H_ -#define MOCK_RIL_NODE_UTIL_H_ - -#include - -enum encoding {ASCII, UTF8, BINARY}; - -enum encoding ParseEncoding(v8::Handle encoding_v, - enum encoding _default = BINARY); - -void FatalException(v8::TryCatch &try_catch); - -v8::Local Encode(const void *buf, size_t len, - enum encoding encoding = BINARY); - -// returns bytes written. -ssize_t DecodeWrite(char *buf, - size_t buflen, - v8::Handle, - enum encoding encoding = BINARY); - -#define SET_PROTOTYPE_METHOD(templ, name, callback) \ -do { \ - v8::Local __callback##_SIG = v8::Signature::New(templ); \ - v8::Local __callback##_TEM = \ - v8::FunctionTemplate::New(callback, v8::Handle(), \ - __callback##_SIG); \ - templ->PrototypeTemplate()->Set(v8::String::NewSymbol(name), \ - __callback##_TEM); \ -} while (0) - -#define SET_METHOD(obj, name, callback) \ - obj->Set(v8::String::NewSymbol(name), \ - v8::FunctionTemplate::New(callback)->GetFunction()) - - -#endif // MOCK_RIL_NODE_UTIL_H_ diff --git a/mock-ril/src/cpp/protobuf_v8.cpp b/mock-ril/src/cpp/protobuf_v8.cpp deleted file mode 100644 index 19f87c1..0000000 --- a/mock-ril/src/cpp/protobuf_v8.cpp +++ /dev/null @@ -1,553 +0,0 @@ -// Copyright 2010 Google Inc. -// -// 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. - -#include "protobuf_v8.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include "logging.h" -#include "util.h" - -#include "node_buffer.h" -#include "node_object_wrap.h" - -#include "node_util.h" - -//#define PROTOBUF_V8_DEBUG -#ifdef PROTOBUF_V8_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -using google::protobuf::Descriptor; -using google::protobuf::DescriptorPool; -using google::protobuf::DynamicMessageFactory; -using google::protobuf::FieldDescriptor; -using google::protobuf::FileDescriptorSet; -using google::protobuf::Message; -using google::protobuf::Reflection; - -//using ObjectWrap; -//using Buffer; - -using std::map; -using std::string; - -using v8::Array; -using v8::AccessorInfo; -using v8::Arguments; -using v8::Boolean; -using v8::Context; -using v8::External; -using v8::Function; -using v8::FunctionTemplate; -using v8::Integer; -using v8::Handle; -using v8::HandleScope; -using v8::InvocationCallback; -using v8::Local; -using v8::NamedPropertyGetter; -using v8::Number; -using v8::Object; -using v8::ObjectTemplate; -using v8::Persistent; -using v8::Script; -using v8::String; -using v8::Value; -using v8::V8; - -namespace protobuf_v8 { - - template - static T* UnwrapThis(const Arguments& args) { - return ObjectWrap::Unwrap(args.This()); - } - - template - static T* UnwrapThis(const AccessorInfo& args) { - return ObjectWrap::Unwrap(args.This()); - } - - Persistent SchemaTemplate; - Persistent TypeTemplate; - Persistent ParseTemplate; - Persistent SerializeTemplate; - - class Schema : public ObjectWrap { - public: - Schema(Handle self, const DescriptorPool* pool) - : pool_(pool) { - DBG("Schema::Schema E:"); - factory_.SetDelegateToGeneratedFactory(true); - self->SetInternalField(1, Array::New()); - Wrap(self); - DBG("Schema::Schema X:"); - } - - virtual ~Schema() { - DBG("~Schema::Schema E:"); - if (pool_ != DescriptorPool::generated_pool()) - delete pool_; - DBG("~Schema::Schema X:"); - } - - class Type : public ObjectWrap { - public: - Schema* schema_; - const Descriptor* descriptor_; - - Message* NewMessage() const { - DBG("Type::NewMessage() EX:"); - return schema_->NewMessage(descriptor_); - } - - Handle Constructor() const { - DBG("Type::Constrocutor() EX:"); - return handle_->GetInternalField(2).As(); - } - - Local NewObject(Handle properties) const { - DBG("Type::NewObjext(properties) EX:"); - return Constructor()->NewInstance(1, &properties); - } - - Type(Schema* schema, const Descriptor* descriptor, Handle self) - : schema_(schema), descriptor_(descriptor) { - DBG("Type::Type(schema, descriptor, self) E:"); - // Generate functions for bulk conversion between a JS object - // and an array in descriptor order: - // from = function(arr) { this.f0 = arr[0]; this.f1 = arr[1]; ... } - // to = function() { return [ this.f0, this.f1, ... ] } - // This is faster than repeatedly calling Get/Set on a v8::Object. - std::ostringstream from, to; - from << "(function(arr) { if(arr) {"; - to << "(function() { return [ "; - - for (int i = 0; i < descriptor->field_count(); i++) { - from << - "var x = arr[" << i << "]; " - "if(x !== undefined) this['" << - descriptor->field(i)->camelcase_name() << - "'] = x; "; - - if (i > 0) to << ", "; - to << "this['" << descriptor->field(i)->camelcase_name() << "']"; - DBG("field name=%s", descriptor->field(i)->name().c_str()); - } - - from << " }})"; - to << " ]; })"; - - // managed type->schema link - self->SetInternalField(1, schema_->handle_); - - Handle constructor = - Script::Compile(String::New(from.str().c_str()))->Run().As(); - constructor->SetHiddenValue(String::New("type"), self); - - Handle bind = - Script::Compile(String::New( - "(function(self) {" - " var f = this;" - " return function(arg) {" - " return f.call(self, arg);" - " };" - "})"))->Run().As(); - Handle arg = self; - constructor->Set(String::New("parse"), bind->Call(ParseTemplate->GetFunction(), 1, &arg)); - constructor->Set(String::New("serialize"), bind->Call(SerializeTemplate->GetFunction(), 1, &arg)); - self->SetInternalField(2, constructor); - self->SetInternalField(3, Script::Compile(String::New(to.str().c_str()))->Run()); - - Wrap(self); - DBG("Type::Type(schema, descriptor, self) X:"); - } - -#define GET(TYPE) \ - (index >= 0 ? \ - reflection->GetRepeated##TYPE(instance, field, index) : \ - reflection->Get##TYPE(instance, field)) - - static Handle ToJs(const Message& instance, - const Reflection* reflection, - const FieldDescriptor* field, - const Type* message_type, - int index) { - DBG("Type::ToJs(instance, refelction, field, message_type) E:"); - switch (field->cpp_type()) { - case FieldDescriptor::CPPTYPE_MESSAGE: - DBG("Type::ToJs CPPTYPE_MESSAGE"); - return message_type->ToJs(GET(Message)); - case FieldDescriptor::CPPTYPE_STRING: { - DBG("Type::ToJs CPPTYPE_STRING"); - const string& value = GET(String); - return String::New(value.data(), value.length()); - } - case FieldDescriptor::CPPTYPE_INT32: - DBG("Type::ToJs CPPTYPE_INT32"); - return Integer::New(GET(Int32)); - case FieldDescriptor::CPPTYPE_UINT32: - DBG("Type::ToJs CPPTYPE_UINT32"); - return Integer::NewFromUnsigned(GET(UInt32)); - case FieldDescriptor::CPPTYPE_INT64: - DBG("Type::ToJs CPPTYPE_INT64"); - return Number::New(GET(Int64)); - case FieldDescriptor::CPPTYPE_UINT64: - DBG("Type::ToJs CPPTYPE_UINT64"); - return Number::New(GET(UInt64)); - case FieldDescriptor::CPPTYPE_FLOAT: - DBG("Type::ToJs CPPTYPE_FLOAT"); - return Number::New(GET(Float)); - case FieldDescriptor::CPPTYPE_DOUBLE: - DBG("Type::ToJs CPPTYPE_DOUBLE"); - return Number::New(GET(Double)); - case FieldDescriptor::CPPTYPE_BOOL: - DBG("Type::ToJs CPPTYPE_BOOL"); - return Boolean::New(GET(Bool)); - case FieldDescriptor::CPPTYPE_ENUM: - DBG("Type::ToJs CPPTYPE_ENUM"); - return String::New(GET(Enum)->name().c_str()); - } - - return Handle(); // NOTREACHED - } -#undef GET - - Handle ToJs(const Message& instance) const { - DBG("Type::ToJs(Message) E:"); - const Reflection* reflection = instance.GetReflection(); - const Descriptor* descriptor = instance.GetDescriptor(); - - Handle properties = Array::New(descriptor->field_count()); - for (int i = 0; i < descriptor->field_count(); i++) { - HandleScope scope; - - const FieldDescriptor* field = descriptor->field(i); - bool repeated = field->is_repeated(); - if (repeated && !reflection->FieldSize(instance, field)) { - DBG("Ignore repeated field with no size in reflection data"); - continue; - } - if (!repeated && !reflection->HasField(instance, field)) { - DBG("Ignore field with no field in relfection data"); - continue; - } - - const Type* child_type = - (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ? - schema_->GetType(field->message_type()) : NULL; - - Handle value; - if (field->is_repeated()) { - int size = reflection->FieldSize(instance, field); - Handle array = Array::New(size); - for (int j = 0; j < size; j++) { - array->Set(j, ToJs(instance, reflection, field, child_type, j)); - } - value = array; - } else { - value = ToJs(instance, reflection, field, child_type, -1); - } - - DBG("Type::ToJs: set property[%d]=%s", i, ToCString(value)); - properties->Set(i, value); - } - - DBG("Type::ToJs(Message) X:"); - return NewObject(properties); - } - - static Handle Parse(const Arguments& args) { - DBG("Type::Parse(args) E:"); - Type* type = UnwrapThis(args); - Buffer* buf = ObjectWrap::Unwrap(args[0]->ToObject()); - - Message* message = type->NewMessage(); - message->ParseFromArray(buf->data(), buf->length()); - Handle result = type->ToJs(*message); - delete message; - - DBG("Type::Parse(args) X:"); - return result; - } - -#define SET(TYPE, EXPR) \ - if (repeated) reflection->Add##TYPE(instance, field, EXPR); \ - else reflection->Set##TYPE(instance, field, EXPR) - - static bool ToProto(Message* instance, - const FieldDescriptor* field, - Handle value, - const Type* type, - bool repeated) { - DBG("Type::ToProto(instance, field, value, type, repeated) E:"); - bool ok = true; - HandleScope scope; - - DBG("Type::ToProto field->name()=%s", field->name().c_str()); - const Reflection* reflection = instance->GetReflection(); - switch (field->cpp_type()) { - case FieldDescriptor::CPPTYPE_MESSAGE: - DBG("Type::ToProto CPPTYPE_MESSAGE"); - ok = type->ToProto(repeated ? - reflection->AddMessage(instance, field) : - reflection->MutableMessage(instance, field), - value.As()); - break; - case FieldDescriptor::CPPTYPE_STRING: { - DBG("Type::ToProto CPPTYPE_STRING"); - String::AsciiValue ascii(value); - SET(String, string(*ascii, ascii.length())); - break; - } - case FieldDescriptor::CPPTYPE_INT32: - DBG("Type::ToProto CPPTYPE_INT32"); - SET(Int32, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_UINT32: - DBG("Type::ToProto CPPTYPE_UINT32"); - SET(UInt32, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_INT64: - DBG("Type::ToProto CPPTYPE_INT64"); - SET(Int64, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_UINT64: - DBG("Type::ToProto CPPTYPE_UINT64"); - SET(UInt64, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_FLOAT: - DBG("Type::ToProto CPPTYPE_FLOAT"); - SET(Float, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_DOUBLE: - DBG("Type::ToProto CPPTYPE_DOUBLE"); - SET(Double, value->NumberValue()); - break; - case FieldDescriptor::CPPTYPE_BOOL: - DBG("Type::ToProto CPPTYPE_BOOL"); - SET(Bool, value->BooleanValue()); - break; - case FieldDescriptor::CPPTYPE_ENUM: - DBG("Type::ToProto CPPTYPE_ENUM"); - - // Don't use SET as vd can be NULL - char error_buff[256]; - const google::protobuf::EnumValueDescriptor* vd; - int i32_value = 0; - const char *str_value = NULL; - const google::protobuf::EnumDescriptor* ed = field->enum_type(); - - if (value->IsNumber()) { - i32_value = value->Int32Value(); - vd = ed->FindValueByNumber(i32_value); - if (vd == NULL) { - snprintf(error_buff, sizeof(error_buff), - "Type::ToProto Bad enum value, %d is not a member of enum %s", - i32_value, ed->full_name().c_str()); - } - } else { - str_value = ToCString(value); - // TODO: Why can str_value be corrupted sometimes? - ALOGD("str_value=%s", str_value); - vd = ed->FindValueByName(str_value); - if (vd == NULL) { - snprintf(error_buff, sizeof(error_buff), - "Type::ToProto Bad enum value, %s is not a member of enum %s", - str_value, ed->full_name().c_str()); - } - } - if (vd != NULL) { - if (repeated) { - reflection->AddEnum(instance, field, vd); - } else { - reflection->SetEnum(instance, field, vd); - } - } else { - v8::ThrowException(String::New(error_buff)); - ok = false; - } - break; - } - DBG("Type::ToProto(instance, field, value, type, repeated) X: ok=%d", ok); - return ok; - } -#undef SET - - bool ToProto(Message* instance, Handle src) const { - DBG("ToProto(Message *, Handle) E:"); - - Handle to_array = handle_->GetInternalField(3).As(); - Handle properties = to_array->Call(src, 0, NULL).As(); - bool ok = true; - for (int i = 0; ok && (i < descriptor_->field_count()); i++) { - Handle value = properties->Get(i); - if (value->IsUndefined()) continue; - - const FieldDescriptor* field = descriptor_->field(i); - const Type* child_type = - (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ? - schema_->GetType(field->message_type()) : NULL; - if (field->is_repeated()) { - if(!value->IsArray()) { - ok = ToProto(instance, field, value, child_type, true); - } else { - Handle array = value.As(); - int length = array->Length(); - for (int j = 0; ok && (j < length); j++) { - ok = ToProto(instance, field, array->Get(j), child_type, true); - } - } - } else { - ok = ToProto(instance, field, value, child_type, false); - } - } - DBG("ToProto(Message *, Handle) X: ok=%d", ok); - return ok; - } - - static Handle Serialize(const Arguments& args) { - Handle result; - DBG("Serialize(Arguments&) E:"); - if (!args[0]->IsObject()) { - DBG("Serialize(Arguments&) X: not an object"); - return v8::ThrowException(args[0]); - } - - Type* type = UnwrapThis(args); - Message* message = type->NewMessage(); - if (type->ToProto(message, args[0].As())) { - int length = message->ByteSize(); - Buffer* buffer = Buffer::New(length); - message->SerializeWithCachedSizesToArray((google::protobuf::uint8*)buffer->data()); - delete message; - - result = buffer->handle_; - } else { - result = v8::Undefined(); - } - DBG("Serialize(Arguments&) X"); - return result; - } - - static Handle ToString(const Arguments& args) { - return String::New(UnwrapThis(args)->descriptor_->full_name().c_str()); - } - }; - - Message* NewMessage(const Descriptor* descriptor) { - DBG("Schema::NewMessage(descriptor) EX:"); - return factory_.GetPrototype(descriptor)->New(); - } - - Type* GetType(const Descriptor* descriptor) { - DBG("Schema::GetType(descriptor) E:"); - Type* result = types_[descriptor]; - if (result) return result; - - result = types_[descriptor] = - new Type(this, descriptor, TypeTemplate->GetFunction()->NewInstance()); - - // managed schema->[type] link - Handle types = handle_->GetInternalField(1).As(); - types->Set(types->Length(), result->handle_); - DBG("Schema::GetType(descriptor) X:"); - return result; - } - - const DescriptorPool* pool_; - map types_; - DynamicMessageFactory factory_; - - static Handle GetType(const Local name, - const AccessorInfo& args) { - DBG("Schema::GetType(name, args) E:"); - Schema* schema = UnwrapThis(args); - const Descriptor* descriptor = - schema->pool_->FindMessageTypeByName(*String::AsciiValue(name)); - - DBG("Schema::GetType(name, args) X:"); - return descriptor ? - schema->GetType(descriptor)->Constructor() : - Handle(); - } - - static Handle NewSchema(const Arguments& args) { - DBG("Schema::NewSchema E: args.Length()=%d", args.Length()); - if (!args.Length()) { - return (new Schema(args.This(), - DescriptorPool::generated_pool()))->handle_; - } - - Buffer* buf = ObjectWrap::Unwrap(args[0]->ToObject()); - - FileDescriptorSet descriptors; - if (!descriptors.ParseFromArray(buf->data(), buf->length())) { - DBG("Schema::NewSchema X: bad descriptor"); - return v8::ThrowException(String::New("Malformed descriptor")); - } - - DescriptorPool* pool = new DescriptorPool; - for (int i = 0; i < descriptors.file_size(); i++) { - pool->BuildFile(descriptors.file(i)); - } - - DBG("Schema::NewSchema X"); - return (new Schema(args.This(), pool))->handle_; - } - }; - - void Init() { - DBG("Init E:"); - HandleScope handle_scope; - - TypeTemplate = Persistent::New(FunctionTemplate::New()); - TypeTemplate->SetClassName(String::New("Type")); - // native self - // owning schema (so GC can manage our lifecyle) - // constructor - // toArray - TypeTemplate->InstanceTemplate()->SetInternalFieldCount(4); - - SchemaTemplate = Persistent::New(FunctionTemplate::New(Schema::NewSchema)); - SchemaTemplate->SetClassName(String::New("Schema")); - // native self - // array of types (so GC can manage our lifecyle) - SchemaTemplate->InstanceTemplate()->SetInternalFieldCount(2); - SchemaTemplate->InstanceTemplate()->SetNamedPropertyHandler(Schema::GetType); - - ParseTemplate = Persistent::New(FunctionTemplate::New(Schema::Type::Parse)); - SerializeTemplate = Persistent::New(FunctionTemplate::New(Schema::Type::Serialize)); - - DBG("Init X:"); - } - -} // namespace protobuf_v8 - -extern "C" void SchemaObjectTemplateInit(Handle target) { - DBG("SchemaObjectTemplateInit(target) EX:"); - target->Set(String::New("Schema"), protobuf_v8::SchemaTemplate); -} diff --git a/mock-ril/src/cpp/protobuf_v8.h b/mock-ril/src/cpp/protobuf_v8.h deleted file mode 100644 index 4244e27..0000000 --- a/mock-ril/src/cpp/protobuf_v8.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2010 Google Inc. -// -// 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. - -#include - -namespace protobuf_v8 { - extern void Init(); -} // namespace protobuf_v8 - -// Add Schema to the object template -extern "C" void SchemaObjectTemplateInit(v8::Handle target); diff --git a/mock-ril/src/cpp/requests.cpp b/mock-ril/src/cpp/requests.cpp deleted file mode 100644 index 72cbd00..0000000 --- a/mock-ril/src/cpp/requests.cpp +++ /dev/null @@ -1,525 +0,0 @@ -/** - * 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. - */ - -#include - -#include -#include "ril.h" - - -#include "hardware/ril/mock-ril/src/proto/ril.pb.h" - -#include "logging.h" -#include "js_support.h" -#include "mock_ril.h" -#include "node_buffer.h" -#include "node_object_wrap.h" -#include "node_util.h" -#include "protobuf_v8.h" -#include "status.h" -#include "util.h" -#include "worker.h" - -#include "requests.h" - -//#define REQUESTS_DEBUG -#ifdef REQUESTS_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - - -/** - * Request has no data so create an empty Buffer - */ -int ReqWithNoData(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - static Buffer *emptyBuffer = Buffer::New(0L); - - DBG("ReqWithNoData E"); - *pBuffer = emptyBuffer; - status = STATUS_OK; - - DBG("ReqWithNoData X status=%d", status); - return status; -} - -/** - * request for RIL_REQUEST_ENTER_SIM_PIN // 2 - */ -int ReqEnterSimPin(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - - DBG("ReqEnterSimPin E"); - if (datalen < sizeof(int)) { - ALOGE("ReqEnterSimPin: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqEnterSimPin *req = new ril_proto::ReqEnterSimPin(); - DBG("ReqEnterSimPin: pin = %s", ((const char **)data)[0]); - req->set_pin((((char **)data)[0])); - buffer = Buffer::New(req->ByteSize()); - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - } - DBG("ReqEnterSimPin X status=%d", status); - return status; -} - -/** - * request for RIL_REQUEST_DIAL // 10 - */ -int ReqDial(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - - DBG("ReqDial E"); - DBG("data=%p datalen=%d t=%p", data, datalen, t); - - if (datalen < sizeof(int)) { - ALOGE("ReqDial: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqDial *req = new ril_proto::ReqDial(); - - // cast the data to RIL_Dial - RIL_Dial *rilDial = (RIL_Dial *)data; - DBG("ReqDial: rilDial->address =%s, rilDial->clir=%d", rilDial->address, rilDial->clir); - - req->set_address(rilDial->address); - req->set_clir(rilDial->clir); - ril_proto::RilUusInfo *uusInfo = (ril_proto::RilUusInfo *)(&(req->uus_info())); - - if (rilDial->uusInfo != NULL) { - DBG("ReqDial: print uusInfo:"); - DBG("rilDial->uusInfo->uusType = %d, " - "rilDial->uusInfo->uusDcs =%d, " - "rilDial->uusInfo->uusLength=%d, " - "rilDial->uusInfo->uusData = %s", - rilDial->uusInfo->uusType, - rilDial->uusInfo->uusDcs, - rilDial->uusInfo->uusLength, - rilDial->uusInfo->uusData); - - uusInfo->set_uus_type((ril_proto::RilUusType)rilDial->uusInfo->uusType); - uusInfo->set_uus_dcs((ril_proto::RilUusDcs)rilDial->uusInfo->uusDcs); - uusInfo->set_uus_length(rilDial->uusInfo->uusLength); - uusInfo->set_uus_data(rilDial->uusInfo->uusData); - } else { - DBG("uusInfo is NULL"); - } - - DBG("ReqDial: after set the request"); - DBG("req->ByetSize=%d", req->ByteSize()); - buffer = Buffer::New(req->ByteSize()); - DBG("buffer size=%d", buffer->length()); - - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - DBG("ReqDial X, buffer->length()=%d", buffer->length()); - } - DBG("ReqDial X status = %d", status); - return status; -} - -/** - * request for RIL_REQUEST_HANGUP // 12 - */ -int ReqHangUp(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - - DBG("ReqHangUp E"); - if (datalen < sizeof(int)) { - ALOGE("ReqHangUp: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqHangUp *req = new ril_proto::ReqHangUp(); - DBG("ReqHangUp: connection_index=%d", ((int *)data)[0]); - req->set_connection_index(((int *)data)[0]); - buffer = Buffer::New(req->ByteSize()); - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - } - DBG("ReqHangUp X status=%d", status); - return status; -} - -/** - * request for RIL_REQUEST_SEPARATE_CONNECTION // 52 - */ -int ReqSeparateConnection (Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - v8::HandleScope handle_scope; - - DBG("ReqSeparateConnection E"); - if (datalen < sizeof(int)) { - ALOGE("ReqSetMute: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqSeparateConnection *req = new ril_proto::ReqSeparateConnection(); - DBG("ReqSeparateConnection: index=%d", ((int *)data)[0]); - req->set_index(((int *)data)[0]); - DBG("ReqSeparateConnection: req->ByetSize=%d", req->ByteSize()); - buffer = Buffer::New(req->ByteSize()); - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - } - DBG("ReqSeparateConnection X status=%d", status); - return status; -} - -/** - * request for RIL_REQUEST_SET_MUTE // 53 - */ -int ReqSetMute(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - v8::HandleScope handle_scope; - - DBG("ReqSetMute E"); - if (datalen < sizeof(int)) { - ALOGE("ReqSetMute: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqSetMute *req = new ril_proto::ReqSetMute(); - DBG("ReqSetMute: state=%d", ((int *)data)[0]); - req->set_state(((int *)data)[0]); - DBG("ReqSetMute: req->ByetSize=%d", req->ByteSize()); - buffer = Buffer::New(req->ByteSize()); - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - } - DBG("ReqSetMute X status=%d", status); - return status; -} - -/** - * request for RIL_REQUEST_SCREEN_STATE // 61 - */ -int ReqScreenState(Buffer **pBuffer, - const void *data, const size_t datalen, const RIL_Token t) { - int status; - Buffer *buffer; - v8::HandleScope handle_scope; - - DBG("ReqScreenState E data=%p datalen=%d t=%p", - data, datalen, t); - if (datalen < sizeof(int)) { - ALOGE("ReqScreenState: data to small err size < sizeof int"); - status = STATUS_BAD_DATA; - } else { - ril_proto::ReqScreenState *req = new ril_proto::ReqScreenState(); - DBG("ReqScreenState: state=%d", ((int *)data)[0]); - req->set_state(((int *)data)[0]); - DBG("ReqScreenState: req->ByteSize()=%d", req->ByteSize()); - buffer = Buffer::New(req->ByteSize()); - DBG("ReqScreenState: serialize"); - req->SerializeToArray(buffer->data(), buffer->length()); - delete req; - *pBuffer = buffer; - status = STATUS_OK; - } - DBG("ReqScreenState X status=%d", status); - return status; -} - -/** - * Map from indexed by cmd and used to convert Data to Protobuf. - */ -typedef int (*ReqConversion)(Buffer** pBuffer, const void *data, - const size_t datalen, const RIL_Token t); -typedef std::map ReqConversionMap; -ReqConversionMap rilReqConversionMap; - -int callOnRilRequest(v8::Handle context, int cmd, - const void *buffer, RIL_Token t) { - DBG("callOnRilRequest E: cmd=%d", cmd); - - int status; - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - - // Get the onRilRequest Function - v8::Handle name = v8::String::New("onRilRequest"); - v8::Handle onRilRequestFunctionValue = context->Global()->Get(name); - v8::Handle onRilRequestFunction = - v8::Handle::Cast(onRilRequestFunctionValue); - - // Create the cmd and token - v8::Handle v8RequestValue = v8::Number::New(cmd); - v8::Handle v8TokenValue = v8::Number::New(int64_t(t)); - - // Invoke onRilRequest - const int argc = 3; - v8::Handle argv[argc] = { - v8RequestValue, v8TokenValue, ((Buffer *)buffer)->handle_ }; - v8::Handle result = - onRilRequestFunction->Call(context->Global(), argc, argv); - if (try_catch.HasCaught()) { - ALOGE("callOnRilRequest error"); - ReportException(&try_catch); - status = STATUS_ERR; - } else { - v8::String::Utf8Value result_string(result); - DBG("callOnRilRequest result=%s", ToCString(result_string)); - status = STATUS_OK; - } - - DBG("callOnRilRequest X: status=%d", status); - return status; -} - -RilRequestWorkerQueue::RilRequestWorkerQueue(v8::Handle context) { - DBG("RilRequestWorkerQueue E:"); - - context_ = context; - pthread_mutex_init(&free_list_mutex_, NULL); - - DBG("RilRequestWorkerQueue X:"); -} - -RilRequestWorkerQueue::~RilRequestWorkerQueue() { - DBG("~RilRequestWorkerQueue E:"); - Request *req; - pthread_mutex_lock(&free_list_mutex_); - while(free_list_.size() != 0) { - req = free_list_.front(); - delete req; - free_list_.pop(); - } - pthread_mutex_unlock(&free_list_mutex_); - pthread_mutex_destroy(&free_list_mutex_); - DBG("~RilRequestWorkerQueue X:"); -} - -/** - * Add a request to the processing queue. - * Data is serialized to a protobuf before adding to the queue. - */ -void RilRequestWorkerQueue::AddRequest (const int request, - const void *data, const size_t datalen, const RIL_Token token) { - DBG("RilRequestWorkerQueue:AddRequest: %d E", request); - - v8::Locker locker; - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(context_); - - int status; - - // Convert the data to a protobuf before inserting it into the request queue (serialize data) - Buffer *buffer = NULL; - ReqConversionMap::iterator itr; - itr = rilReqConversionMap.find(request); - if (itr != rilReqConversionMap.end()) { - status = itr->second(&buffer, data, datalen, token); - } else { - ALOGE("RilRequestWorkerQueue:AddRequest: X unknown request %d", request); - status = STATUS_UNSUPPORTED_REQUEST; - } - - if (status == STATUS_OK) { - // Add serialized request to the queue - Request *req; - pthread_mutex_lock(&free_list_mutex_); - DBG("RilRequestWorkerQueue:AddRequest: return ok, buffer = %p, buffer->length()=%d", - buffer, buffer->length()); - if (free_list_.size() == 0) { - req = new Request(request, buffer, token); - pthread_mutex_unlock(&free_list_mutex_); - } else { - req = free_list_.front(); - free_list_.pop(); - pthread_mutex_unlock(&free_list_mutex_); - req->Set(request, buffer, token); - } - // add the request - Add(req); - } else { - DBG("RilRequestWorkerQueue:AddRequest: return from the serialization, status is not OK"); - // An error report complete now - RIL_Errno rilErrCode = (status == STATUS_UNSUPPORTED_REQUEST) ? - RIL_E_REQUEST_NOT_SUPPORTED : RIL_E_GENERIC_FAILURE; - s_rilenv->OnRequestComplete(token, rilErrCode, NULL, 0); - } - - DBG("RilRequestWorkerQueue::AddRequest: X" - " request=%d data=%p datalen=%d token=%p", - request, data, datalen, token); -} - -void RilRequestWorkerQueue::Process(void *p) { - - Request *req = (Request *)p; - DBG("RilRequestWorkerQueue::Process: E" - " request=%d buffer=%p, bufferlen=%d t=%p", - req->request_, req->buffer_, req->buffer_->length(), req->token_); - - v8::Locker locker; - v8::HandleScope handle_scope; - v8::Context::Scope context_scope(context_); - callOnRilRequest(context_, req->request_, - req->buffer_, req->token_); - - pthread_mutex_lock(&free_list_mutex_); - free_list_.push(req); - pthread_mutex_unlock(&free_list_mutex_); -} - -int requestsInit(v8::Handle context, RilRequestWorkerQueue **rwq) { - ALOGD("requestsInit E"); - - rilReqConversionMap[RIL_REQUEST_GET_SIM_STATUS] = ReqWithNoData; // 1 - rilReqConversionMap[RIL_REQUEST_ENTER_SIM_PIN] = ReqEnterSimPin; // 2 - rilReqConversionMap[RIL_REQUEST_GET_CURRENT_CALLS] = ReqWithNoData; // 9 - rilReqConversionMap[RIL_REQUEST_DIAL] = ReqDial; // 10 - rilReqConversionMap[RIL_REQUEST_GET_IMSI] = ReqWithNoData; // 11 - rilReqConversionMap[RIL_REQUEST_HANGUP] = ReqHangUp; // 12 - rilReqConversionMap[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = ReqWithNoData; // 13 - rilReqConversionMap[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = ReqWithNoData; // 14 - rilReqConversionMap[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = ReqWithNoData; // 15 - rilReqConversionMap[RIL_REQUEST_CONFERENCE] = ReqWithNoData; // 16 - rilReqConversionMap[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = ReqWithNoData; // 18 - rilReqConversionMap[RIL_REQUEST_SIGNAL_STRENGTH] = ReqWithNoData; // 19 - rilReqConversionMap[RIL_REQUEST_VOICE_REGISTRATION_STATE] = ReqWithNoData; // 20 - rilReqConversionMap[RIL_REQUEST_DATA_REGISTRATION_STATE] = ReqWithNoData; // 21 - rilReqConversionMap[RIL_REQUEST_OPERATOR] = ReqWithNoData; // 22 - rilReqConversionMap[RIL_REQUEST_GET_IMEI] = ReqWithNoData; // 38 - rilReqConversionMap[RIL_REQUEST_GET_IMEISV] = ReqWithNoData; // 39 - rilReqConversionMap[RIL_REQUEST_ANSWER] = ReqWithNoData; // 40 - rilReqConversionMap[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = ReqWithNoData; // 45 - rilReqConversionMap[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = ReqWithNoData; // 46 - rilReqConversionMap[RIL_REQUEST_BASEBAND_VERSION] = ReqWithNoData; // 51 - rilReqConversionMap[RIL_REQUEST_SEPARATE_CONNECTION] = ReqSeparateConnection; // 52 - rilReqConversionMap[RIL_REQUEST_SET_MUTE] = ReqSetMute; // 53 - rilReqConversionMap[RIL_REQUEST_SCREEN_STATE] = ReqScreenState; // 61 - - *rwq = new RilRequestWorkerQueue(context); - int status = (*rwq)->Run(); - - ALOGD("requestsInit X: status=%d", status); - return status; -} - -/** - * Subroutine to test a single RIL request - */ -void testRilRequest(v8::Handle context, int request, const void *data, - const size_t datalen, const RIL_Token t) { - Buffer *buffer = NULL; - ReqConversionMap::iterator itr; - int status; - - ALOGD("testRilRequest: request=%d", request); - - itr = rilReqConversionMap.find(request); - if (itr != rilReqConversionMap.end()) { - status = itr->second(&buffer, data, sizeof(data), (void *)0x12345677); - } else { - ALOGE("testRequests X unknown request %d", request); - status = STATUS_UNSUPPORTED_REQUEST; - } - if (status == STATUS_OK) { - callOnRilRequest(context, request, buffer, (void *)0x12345677); - } else { - ALOGE("testRilRequest X, serialize error"); - } -} - -void testRequests(v8::Handle context) { - ALOGD("testRequests E: ********"); - - v8::TryCatch try_catch; - - char *buffer; - const char *fileName= "/sdcard/data/mock_ril.js"; - int status = ReadFile(fileName, &buffer); - if (status == 0) { - runJs(context, &try_catch, fileName, buffer); - Buffer *buffer = NULL; - ReqConversionMap::iterator itr; - int status; - int request; - - if (!try_catch.HasCaught()) { - { - const int data[1] = { 1 }; - testRilRequest(context, RIL_REQUEST_SIGNAL_STRENGTH, data, sizeof(data), - (void *)0x12345677); - } - { - const char *data[1] = { "winks-pin" }; - testRilRequest(context, RIL_REQUEST_ENTER_SIM_PIN, data, sizeof(data), - (void *)0x12345677); - } - { - const int data[1] = { 1 }; - testRilRequest(context, RIL_REQUEST_HANGUP, data, sizeof(data), - (void *)0x12345677); - } - { - const int data[1] = { 1 }; - testRilRequest(context, RIL_REQUEST_SCREEN_STATE, data, sizeof(data), - (void *)0x12345677); - } - { - const int data[1] = { 1 }; - testRilRequest(context, RIL_REQUEST_GET_SIM_STATUS, data, sizeof(data), - (void *)0x12345677); - } - { - RilRequestWorkerQueue *rwq = new RilRequestWorkerQueue(context); - if (rwq->Run() == STATUS_OK) { - const int data[1] = { 1 }; - rwq->AddRequest(RIL_REQUEST_SCREEN_STATE, - data, sizeof(data), (void *)0x1234567A); - rwq->AddRequest(RIL_REQUEST_SIGNAL_STRENGTH, - data, sizeof(data), (void *)0x1234567A); - // Sleep to let it be processed - v8::Unlocker unlocker; - sleep(3); - v8::Locker locker; - } - delete rwq; - } - } - } - - ALOGD("testRequests X: ********\n"); -} diff --git a/mock-ril/src/cpp/requests.h b/mock-ril/src/cpp/requests.h deleted file mode 100644 index 6c1b077..0000000 --- a/mock-ril/src/cpp/requests.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_REQUESTS_H_ -#define MOCK_RIL_REQUESTS_H_ - -#include -#include - -#include -#include "worker.h" -#include "node_object_wrap.h" - -/** - * A request - */ -struct Request { - int request_; - Buffer *buffer_; - RIL_Token token_; - - Request(const int request, const Buffer *buffer, const RIL_Token token) : - request_(0), - buffer_(NULL), - token_(0) { - Set(request, buffer, token); - } - - ~Request() { - delete [] buffer_; - } - - void Set(const int request, - const Buffer *buffer, const RIL_Token token) { - request_ = request; - token_ = token; - buffer_ = (Buffer *)buffer; - } -}; - -/** - * Ril request worker queue. - * - * Pass requests to mock-ril.js for processing - */ -class RilRequestWorkerQueue : public WorkerQueue { - private: - v8::Handle context_; - // TODO: Need a thread-safe queue - std::queue free_list_; - pthread_mutex_t free_list_mutex_; - - public: - /** - * Constructor - */ - RilRequestWorkerQueue(v8::Handle context); - - /** - * Destructor - */ - virtual ~RilRequestWorkerQueue(); - - /** - * Add a request to the Queue - */ - void AddRequest(const int request, - const void *data, const size_t datalen, const RIL_Token token); - - /** - * Processes a request sending it to mock-ril.js - */ - virtual void Process(void *p); -}; - -/** - * Initialize module - * - * @return 0 if no errors - */ -int requestsInit(v8::Handle context, RilRequestWorkerQueue **rwq); - -/** - * Run tests - */ -void testRequests(v8::Handle context); - -#endif // MOCK_RIL_REQUESTS_H_ diff --git a/mock-ril/src/cpp/responses.cpp b/mock-ril/src/cpp/responses.cpp deleted file mode 100644 index 89ca488..0000000 --- a/mock-ril/src/cpp/responses.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/** - * 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. - */ - -#include - -#include -#include "ril.h" - -#include "hardware/ril/mock-ril/src/proto/ril.pb.h" - -#include "logging.h" -#include "mock_ril.h" -#include "node_buffer.h" -#include "node_object_wrap.h" -#include "protobuf_v8.h" -#include "status.h" -#include "util.h" -#include "worker.h" - -#include "responses.h" - -//#define RESPONSES_DEBUG -#ifdef RESPONSES_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - - -/** - * The Buffer is assumed to be empty so nothing to convert - * @return STATUS_OK and *data = NULL *datalen = 0; - */ -RIL_Errno RspWithNoData( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { - DBG("RspWithNoData E"); - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); - - DBG("RspWithNoData X"); - return rilErrno; -} - -/** - * Handle response for an array of strings - * - * If a string value is "*magic-null*" then that value - * will be returned as null. - */ -RIL_Errno RspStrings( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { - DBG("RspStrings E"); - - ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - int result_len = rsp->strings_size() * sizeof(const char *); - const char **result = (const char **)alloca(result_len); - for (int i = 0; i < rsp->strings_size(); i++) { - result[i] = rsp->strings(i).c_str(); - DBG("result[%d]='%s'", i, result[i]); - if (strcmp("*magic-null*", result[i]) == 0) { - result[i] = NULL; - } - } - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); - - DBG("RspStrings X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle response for a string - */ -RIL_Errno RspString( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { - DBG("RspString E"); - - ril_proto::RspStrings *rsp = new ril_proto::RspStrings(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const char *result = rsp->strings(0).c_str(); - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, (void *)result, strlen(result)); - - DBG("RspString X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle response for an array of integers - */ -RIL_Errno RspIntegers( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { - DBG("RspIntegers E"); - - ril_proto::RspIntegers *rsp = new ril_proto::RspIntegers(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - int result_len = rsp->integers_size() * sizeof(const int32_t); - int32_t *result = (int32_t *)alloca(result_len); - for (int i = 0; i < rsp->integers_size(); i++) { - result[i] = rsp->integers(i); - DBG("result[%d]=%d", i, result[i]); - } - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); - - DBG("RspIntegers X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle RIL_REQUEST_GET_SIM_STATUS response - */ -RIL_Errno RspGetSimStatus( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 1 - DBG("RspGetSimStatus E"); - - ril_proto::RspGetSimStatus *rsp = new ril_proto::RspGetSimStatus(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const ril_proto::RilCardStatus& r = rsp->card_status(); - RIL_CardStatus_v6 cardStatus; - cardStatus.card_state = RIL_CardState(r.card_state()); - cardStatus.universal_pin_state = RIL_PinState(r.universal_pin_state()); - cardStatus.gsm_umts_subscription_app_index = r.gsm_umts_subscription_app_index(); - cardStatus.ims_subscription_app_index = r.ims_subscription_app_index(); - cardStatus.num_applications = r.num_applications(); - for (int i = 0; i < cardStatus.num_applications; i++) { - cardStatus.applications[i].app_type = RIL_AppType(r.applications(i).app_type()); - cardStatus.applications[i].app_state = RIL_AppState(r.applications(i).app_state()); - cardStatus.applications[i].perso_substate = - RIL_PersoSubstate(r.applications(i).perso_substate()); - cardStatus.applications[i].aid_ptr = const_cast(r.applications(i).aid().c_str()); - cardStatus.applications[i].app_label_ptr = - const_cast(r.applications(i).app_label().c_str()); - cardStatus.applications[i].pin1_replaced = r.applications(i).pin1_replaced(); - cardStatus.applications[i].pin1 = RIL_PinState(r.applications(i).pin1()); - cardStatus.applications[i].pin2 = RIL_PinState(r.applications(i).pin2()); - } - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, - &cardStatus, sizeof(cardStatus)); - - DBG("RspGetSimStatus X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle RIL_REQUEST_ENTER_SIM_PIN_DATA response - */ -RIL_Errno RspEnterSimPinData( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 2 - DBG("RspEnterSimPinData E"); - - ril_proto::RspEnterSimPin *rsp = new ril_proto::RspEnterSimPin(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - DBG("retries_remaining=%d", rsp->retries_remaining()); - int retries_remaining = rsp->retries_remaining(); - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, - &retries_remaining, sizeof(retries_remaining)); - - DBG("RspEnterSimPinData X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle RIL_REQUEST_GET_CURRENT_CALLS response // 9 - */ -RIL_Errno RspGetCurrentCalls ( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 9 - DBG("RspGetCurrentCalls E"); - - ril_proto::RspGetCurrentCalls *rsp = new ril_proto::RspGetCurrentCalls(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - int result_len = rsp->calls_size() * sizeof(const RIL_Call *); - DBG("RspGetCurrentCalls rilErrno=%d result_len=%d", rilErrno, result_len); - RIL_Call **result = (RIL_Call **)alloca(result_len); - for (int i = 0; i < rsp->calls_size(); i++) { - const ril_proto::RilCall& srcCall = rsp->calls(i); - RIL_Call *dstCall = (RIL_Call *)alloca(sizeof(RIL_Call)); - - result[i] = dstCall; - dstCall->state = (RIL_CallState)srcCall.state(); - dstCall->index = srcCall.index(); - dstCall->toa = srcCall.toa(); - dstCall->isMpty = (char)srcCall.is_mpty(); - dstCall->isMT = (char)srcCall.is_mt(); - dstCall->als = srcCall.als(); - dstCall->isVoice = (char)srcCall.is_voice(); - dstCall->isVoicePrivacy = (char)srcCall.is_voice_privacy(); - dstCall->number = (char *)srcCall.number().c_str(); - dstCall->numberPresentation = srcCall.number_presentation(); - dstCall->name = (char *)srcCall.name().c_str(); - dstCall->namePresentation = srcCall.name_presentation(); - if (srcCall.has_uus_info()) { - dstCall->uusInfo = - (RIL_UUS_Info *)alloca(sizeof(RIL_UUS_Info)); - dstCall->uusInfo->uusType = - (RIL_UUS_Type)srcCall.uus_info().uus_type(); - dstCall->uusInfo->uusDcs = - (RIL_UUS_DCS)srcCall.uus_info().uus_dcs(); - dstCall->uusInfo->uusLength = - srcCall.uus_info().uus_length(); - dstCall->uusInfo->uusData = - (char *)srcCall.uus_info().uus_data().c_str(); - } else { - dstCall->uusInfo = NULL; - } - } - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, result, result_len); - - DBG("RspGetCurrentCalls X rilErrno=%d", rilErrno); - return rilErrno; -} - - -void unmarshallRilSignalStrength(Buffer *buffer, RIL_SignalStrength_v6 *pSignalStrength) { - // Retrieve response from response message - ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); - const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); - const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); - const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); - - // Copy the response message from response to format defined in ril.h - RIL_SignalStrength_v6 curSignalStrength; - - curSignalStrength.GW_SignalStrength.signalStrength = gwST.signal_strength(); - curSignalStrength.GW_SignalStrength.bitErrorRate = gwST.bit_error_rate(); - curSignalStrength.CDMA_SignalStrength.dbm = cdmaST.dbm(); - curSignalStrength.CDMA_SignalStrength.ecio = cdmaST.ecio(); - curSignalStrength.EVDO_SignalStrength.dbm = evdoST.dbm(); - curSignalStrength.EVDO_SignalStrength.ecio = evdoST.ecio(); - curSignalStrength.EVDO_SignalStrength.signalNoiseRatio = evdoST.signal_noise_ratio(); - curSignalStrength.LTE_SignalStrength.signalStrength = lteST.signal_strength(); - curSignalStrength.LTE_SignalStrength.rsrp = lteST.rsrp(); - curSignalStrength.LTE_SignalStrength.rsrq = lteST.rsrq(); - curSignalStrength.LTE_SignalStrength.rssnr = lteST.rssnr(); - curSignalStrength.LTE_SignalStrength.cqi = lteST.cqi(); - - DBG("print response signal strength: "); - DBG("gw signalstrength = %d", curSignalStrength.GW_SignalStrength.signalStrength); - DBG("gw_bitErrorRate = %d", curSignalStrength.GW_SignalStrength.bitErrorRate); - DBG("cdma_dbm = %d", curSignalStrength.CDMA_SignalStrength.dbm); - DBG("cdma_ecio = %d", curSignalStrength.CDMA_SignalStrength.ecio); - DBG("evdo_dbm = %d", curSignalStrength.EVDO_SignalStrength.dbm); - DBG("evdo_ecio = %d", curSignalStrength.EVDO_SignalStrength.ecio); - DBG("evdo_signalNoiseRatio = %d", curSignalStrength.EVDO_SignalStrength.signalNoiseRatio); - DBG("lte_signalStrength = %d", curSignalStrength.LTE_SignalStrength.signalStrength); - DBG("lte_rsrp = %d", curSignalStrength.LTE_SignalStrength.rsrp); - DBG("lte_rsrq = %d", curSignalStrength.LTE_SignalStrength.rsrq); - DBG("lte_rssnr = %d", curSignalStrength.LTE_SignalStrength.rssnr); - DBG("lte_cqi = %d", curSignalStrength.LTE_SignalStrength.cqi); -} - -/** - * Handle RIL_REQUEST_SIGNAL_STRENGTH response - */ -RIL_Errno RspSignalStrength( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 19 - DBG("RspSignalStrength E"); - - DBG("cmd = %d, token=%p, rilErrno=%d", cmd, token, rilErrno); - - // Retrieve response from response message - ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); - const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); - const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); - const ril_proto::RILLTESignalStrength& lteST = rsp->lte_signalstrength(); - - // Copy the response message from response to format defined in ril.h - RIL_SignalStrength_v6 curSignalStrength; - unmarshallRilSignalStrength(buffer, &curSignalStrength); - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, &curSignalStrength, sizeof(curSignalStrength)); - - DBG("RspSignalStrength X rilErrno=%d", rilErrno); - return rilErrno; -} - -/** - * Handle RIL_REQUEST_OPERATOR response - */ -RIL_Errno RspOperator( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer *buffer) { // 22 - int status; - - DBG("RspOperator E"); - - ril_proto::RspOperator *rsp = new ril_proto::RspOperator(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const char *result[3] = { NULL, NULL, NULL }; - if (rsp->has_long_alpha_ons()) { - DBG("long_alpha_ons=%s", rsp->long_alpha_ons().c_str()); - result[0] = rsp->long_alpha_ons().c_str(); - } - if (rsp->has_short_alpha_ons()) { - DBG("short_alpha_ons=%s", rsp->short_alpha_ons().c_str()); - result[1] = rsp->short_alpha_ons().c_str(); - } - if (rsp->has_mcc_mnc()) { - DBG("mcc_mnc=%s", rsp->mcc_mnc().c_str()); - result[2] = rsp->mcc_mnc().c_str(); - } - - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, result, sizeof(result)); - - DBG("RspOperator X rilErrno=%d", rilErrno); - return rilErrno; -} - -// ----------------- Handle unsolicited response ---------------------------------------- - /** - * Handle RIL_UNSOL_SIGNAL_STRENGTH response - */ -void UnsolRspSignalStrength(int cmd, Buffer* buffer) { - - DBG("UnsolRspSignalStrength E"); - ALOGE("unsolicited response command: %d", cmd); - // Retrieve response from response message - ril_proto::RspSignalStrength *rsp = new ril_proto::RspSignalStrength(); - rsp->ParseFromArray(buffer->data(), buffer->length()); - const ril_proto::RILGWSignalStrength& gwST = rsp->gw_signalstrength(); - const ril_proto::RILCDMASignalStrength& cdmaST = rsp->cdma_signalstrength(); - const ril_proto::RILEVDOSignalStrength& evdoST = rsp->evdo_signalstrength(); - - // Copy the response message from response to format defined in ril.h - RIL_SignalStrength_v6 curSignalStrength; - unmarshallRilSignalStrength(buffer, &curSignalStrength); - - s_rilenv->OnUnsolicitedResponse(cmd, &curSignalStrength, sizeof(curSignalStrength)); - DBG("UnsolRspSignalStrength X"); -} - -/** - * Maps for converting request complete and unsoliciated response - * protobufs to ril data arrays. - */ -typedef RIL_Errno (*RspConversion)( - int cmd, RIL_Token token, RIL_Errno rilErrno, Buffer* buffer); -typedef std::map RspConversionMap; -RspConversionMap rilRspConversionMap; - -typedef void (*UnsolRspConversion)(int cmd, Buffer* buffer); -typedef std::map UnsolRspConversionMap; -UnsolRspConversionMap unsolRilRspConversionMap; - -/** - * Send a ril request complete response. - */ -v8::Handle SendRilRequestComplete(const v8::Arguments& args) { - DBG("SendRilRequestComplete E"); - v8::HandleScope handle_scope; - v8::Handle retValue; - - int cmd; - RIL_Errno rilErrno; - RIL_Token token; - Buffer* buffer; - - /** - * Get the arguments. There should be at least 3, cmd, - * ril error code and token. Optionally a Buffer containing - * the protobuf representation of the data to return. - */ - if (args.Length() < REQUEST_COMPLETE_REQUIRED_CMDS) { - // Expecting a cmd, ERROR and token - ALOGE("SendRilRequestComplete X %d parameters" - " expecting at least %d: rilErrno, cmd, and token", - args.Length(), REQUEST_COMPLETE_REQUIRED_CMDS); - return v8::Undefined(); - } - v8::Handle v8RilErrCode( - args[REQUEST_COMPLETE_RIL_ERR_CODE_INDEX]->ToObject()); - rilErrno = RIL_Errno(v8RilErrCode->NumberValue()); - - v8::Handle v8Cmd( - args[REQUEST_COMPLETE_CMD_INDEX]->ToObject()); - cmd = int(v8Cmd->NumberValue()); - - v8::Handle v8Token( - args[REQUEST_COMPLETE_TOKEN_INDEX]->ToObject()); - token = RIL_Token(int64_t(v8Token->NumberValue())); - - if (args.Length() >= (REQUEST_COMPLETE_DATA_INDEX+1)) { - buffer = ObjectWrap::Unwrap( - args[REQUEST_COMPLETE_DATA_INDEX]->ToObject()); - } else { - buffer = NULL; - } - - DBG("SendRilRequestComplete: rilErrno=%d, cmd=%d, token=%p", rilErrno, cmd, token); - RspConversionMap::iterator itr; - itr = rilRspConversionMap.find(cmd); - if (itr != rilRspConversionMap.end()) { - itr->second(cmd, token, rilErrno, buffer); - } else { - if ((buffer == NULL) || (buffer->length() <= 0)) { - // Nothing to convert - rilErrno = RIL_E_SUCCESS; - } else { - // There was a buffer but we don't support the resonse yet. - ALOGE("SendRilRequestComplete: No conversion routine for cmd %d," - " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); - rilErrno = RIL_E_REQUEST_NOT_SUPPORTED; - } - // Complete the request - s_rilenv->OnRequestComplete(token, rilErrno, NULL, 0); - } - - DBG("SendRilRequestComplete X rillErrno=%d", rilErrno); - return v8::Undefined(); -} - -/** - * Send an unsolicited response. - */ -v8::Handle SendRilUnsolicitedResponse(const v8::Arguments& args) { - DBG("SendRilUnsolicitedResponse E"); - v8::HandleScope handle_scope; - v8::Handle retValue; - - int status; - void *data; - size_t datalen; - - int cmd; - Buffer* buffer; - - /** - * Get the cmd number and data arguments - */ - if (args.Length() < UNSOL_RESPONSE_REQUIRED_CMDS) { - // Expecting a cmd - ALOGE("SendRilUnsolicitedResponse X %d parameters" - " expecting at least a cmd", - args.Length()); - return v8::Undefined(); - } - v8::Handle v8RilErrCode(args[UNSOL_RESPONSE_CMD_INDEX]->ToObject()); - cmd = int(v8RilErrCode->NumberValue()); - - // data is optional - if (args.Length() >= (UNSOL_RESPONSE_DATA_INDEX+1)) { - buffer = ObjectWrap::Unwrap(args[UNSOL_RESPONSE_DATA_INDEX]->ToObject()); - } else { - buffer = NULL; - } - - UnsolRspConversionMap::iterator itr; - itr = unsolRilRspConversionMap.find(cmd); - if (itr != unsolRilRspConversionMap.end()) { - itr->second(cmd, buffer); - } else { - if ((buffer == NULL) || (buffer->length() <= 0)) { - // Nothing to convert - data = NULL; - datalen = 0; - } else { - // There was a buffer but we don't support the response yet. - ALOGE("SendRilUnsolicitedResponse: No conversion routine for cmd %d," - " return RIL_E_REQUEST_NOT_SUPPORTED", cmd); - data = NULL; - datalen = 0; - } - s_rilenv->OnUnsolicitedResponse(cmd, NULL, 0); - } - - DBG("SendRilUnsolicitedResponse X"); - return v8::Undefined(); -} - -int responsesInit(v8::Handle context) { - ALOGD("responsesInit E"); - int status = STATUS_OK; - - rilRspConversionMap[RIL_REQUEST_GET_SIM_STATUS] = RspGetSimStatus; // 1 - rilRspConversionMap[RIL_REQUEST_ENTER_SIM_PIN] = RspEnterSimPinData; // 2 - rilRspConversionMap[RIL_REQUEST_GET_CURRENT_CALLS] = RspGetCurrentCalls; // 9 - rilRspConversionMap[RIL_REQUEST_GET_IMSI] = RspString; // 11 - rilRspConversionMap[RIL_REQUEST_HANGUP] = RspWithNoData; // 12 - rilRspConversionMap[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = RspWithNoData; // 13 - rilRspConversionMap[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = RspWithNoData; // 14 - rilRspConversionMap[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = RspWithNoData; // 15 - rilRspConversionMap[RIL_REQUEST_CONFERENCE] = RspWithNoData; // 16 - rilRspConversionMap[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = RspIntegers; // 18 - rilRspConversionMap[RIL_REQUEST_SIGNAL_STRENGTH] = RspSignalStrength; // 19 - rilRspConversionMap[RIL_REQUEST_VOICE_REGISTRATION_STATE] = RspStrings; // 20 - rilRspConversionMap[RIL_REQUEST_DATA_REGISTRATION_STATE] = RspStrings; // 21 - rilRspConversionMap[RIL_REQUEST_OPERATOR] = RspOperator; // 22 - rilRspConversionMap[RIL_REQUEST_GET_IMEI] = RspString; // 38 - rilRspConversionMap[RIL_REQUEST_GET_IMEISV] = RspString; // 39 - rilRspConversionMap[RIL_REQUEST_ANSWER] = RspWithNoData; // 39 - rilRspConversionMap[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = RspIntegers; // 45 - rilRspConversionMap[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = RspWithNoData; // 46 - rilRspConversionMap[RIL_REQUEST_BASEBAND_VERSION] = RspString; // 51 - rilRspConversionMap[RIL_REQUEST_SEPARATE_CONNECTION] = RspWithNoData; // 52 - rilRspConversionMap[RIL_REQUEST_SET_MUTE] = RspWithNoData; // 53 - rilRspConversionMap[RIL_REQUEST_SCREEN_STATE] = RspWithNoData; // 61 - - unsolRilRspConversionMap[RIL_UNSOL_SIGNAL_STRENGTH] = UnsolRspSignalStrength; // 1009 - - - ALOGD("responsesInit X: status=%d", status); - return STATUS_OK; -} diff --git a/mock-ril/src/cpp/responses.h b/mock-ril/src/cpp/responses.h deleted file mode 100644 index e177066..0000000 --- a/mock-ril/src/cpp/responses.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_RESPONSES_H_ -#define MOCK_RIL_RESPONSES_H_ - -#include - -/** - * Send a ril request complete, data is optional - * - * args[0] = rilErrCode - * args[1] = cmd - * args[2] = token - * args[3] = optional data - */ -#define REQUEST_COMPLETE_REQUIRED_CMDS 3 -#define REQUEST_COMPLETE_RIL_ERR_CODE_INDEX 0 -#define REQUEST_COMPLETE_CMD_INDEX 1 -#define REQUEST_COMPLETE_TOKEN_INDEX 2 -#define REQUEST_COMPLETE_DATA_INDEX 3 -v8::Handle SendRilRequestComplete(const v8::Arguments& args); - -/** - * Send a ril unsolicited response, buffer is optional - * - * args[0] = cmd - * args[1] = optional data - */ -#define UNSOL_RESPONSE_REQUIRED_CMDS 1 -#define UNSOL_RESPONSE_CMD_INDEX 0 -#define UNSOL_RESPONSE_DATA_INDEX 1 -v8::Handle SendRilUnsolicitedResponse(const v8::Arguments& args); - -// Initialize module -int responsesInit(v8::Handle context); - -#endif // MOCK_RIL_RESPONSES_H_ diff --git a/mock-ril/src/cpp/ril.h b/mock-ril/src/cpp/ril.h deleted file mode 120000 index eb9a122..0000000 --- a/mock-ril/src/cpp/ril.h +++ /dev/null @@ -1 +0,0 @@ -../../../include/telephony/ril.h \ No newline at end of file diff --git a/mock-ril/src/cpp/status.h b/mock-ril/src/cpp/status.h deleted file mode 100644 index cbacf22..0000000 --- a/mock-ril/src/cpp/status.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * 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. - */ - -#ifndef __STATUS_H_ -#define __STATUS_H_ - -// Internal STATUS values -#define STATUS_OK 0 -#define STATUS_ERR 1 -#define STATUS_BAD_DATA 2 -#define STATUS_BAD_PARAMETER 3 -#define STATUS_UNSUPPORTED_REQUEST 4 -#define STATUS_UNSUPPORTED_RESPONSE 5 -#define STATUS_NO_JS_ONREQUEST_FUNCTION 6 -#define STATUS_COULD_NOT_OPEN_FILE 7 -#define STATUS_COULD_NOT_READ_FILE 8 -#define STATUS_CLIENT_CLOSED_CONNECTION 9 - - -#endif // __STATUS_H_ diff --git a/mock-ril/src/cpp/util.cpp b/mock-ril/src/cpp/util.cpp deleted file mode 100644 index 97d9f9a..0000000 --- a/mock-ril/src/cpp/util.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/** - * 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. - */ - -#include -#include - -#include "logging.h" -#include "util.h" - -// Extracts a C string from a V8 Utf8Value. -const char* ToCString(const v8::String::Utf8Value& value) { - return *value ? *value : ""; -} - -// Extracts a C string from a V8 AsciiValue. -const char* ToCString(const v8::String::AsciiValue& value) { - return *value ? *value : ""; -} - -// Extracts a C string from a v8::Value -const char* ToCString(v8::Handle value) { - v8::String::AsciiValue strAsciiValue(value); - return ToCString(strAsciiValue); -} - -// Report an exception -void LogErrorMessage(v8::Handle message, - const char *alternate_message) { - v8::HandleScope handle_scope; - if (message.IsEmpty()) { - // V8 didn't provide any extra information about this error; just - // print the exception. - if (alternate_message == NULL || strlen(alternate_message) == 0) { - ALOGD("LogErrorMessage no message"); - } else { - ALOGD("LogErrorMessage no message: %s", alternate_message); - } - } else { - v8::String::Utf8Value filename(message->GetScriptResourceName()); - const char* filename_string = ToCString(filename); - int linenum = message->GetLineNumber(); - ALOGD("file:%s line:%i", filename_string, linenum); - - // Print line of source code. - v8::String::Utf8Value sourceline(message->GetSourceLine()); - const char* sourceline_string = ToCString(sourceline); - ALOGD("%s", sourceline_string); - - // Print location information under source line - int start = message->GetStartColumn(); - int end = message->GetEndColumn(); - int lenErr = end - start; - int size = end + 1; - if (lenErr == 0) { - lenErr += 1; - size += 1; - } - char *error_string = new char[size]; - memset(error_string, ' ', start); - memset(&error_string[start], '^', lenErr); - error_string[size-1] = 0; - ALOGD("%s", error_string); - ALOGD("%s", ToCString(v8::String::Utf8Value(message->Get()))); - delete [] error_string; - } -} - -// Report an exception -void ReportException(v8::TryCatch* try_catch) { - v8::HandleScope handle_scope; - - v8::String::Utf8Value exception(try_catch->Exception()); - v8::Handle msg = try_catch->Message(); - if (msg.IsEmpty()) { - // Why is try_catch->Message empty? - // it is always empty on compile errors - } - LogErrorMessage(msg, ToCString(exception)); -} diff --git a/mock-ril/src/cpp/util.h b/mock-ril/src/cpp/util.h deleted file mode 100644 index 1e49176..0000000 --- a/mock-ril/src/cpp/util.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_UTIL_H_ -#define MOCK_RIL_UTIL_H_ - -const char* ToCString(const v8::String::Utf8Value& value); - -const char* ToCString(const v8::String::AsciiValue& value); - -const char* ToCString(v8::Handle value); - -void LogErrorMessage(v8::Handle message, - const char *alternate_message); - -void ReportException(v8::TryCatch* try_catch); - - -#endif // MOCK_RIL_UTIL_H_ diff --git a/mock-ril/src/cpp/worker.cpp b/mock-ril/src/cpp/worker.cpp deleted file mode 100644 index 63eda56..0000000 --- a/mock-ril/src/cpp/worker.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/** - * 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. - */ - -#include "logging.h" -#include "status.h" -#include "worker.h" - -#include - -//#define WORKER_DEBUG -#ifdef WORKER_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -void * WorkerThread::Work(void *param) { - WorkerThread *t = (WorkerThread *)param; - android_atomic_acquire_store(STATE_RUNNING, &t->state_); - void * v = t->Worker(t->workerParam_); - android_atomic_acquire_store(STATE_STOPPED, &t->state_); - return v; -} - -bool WorkerThread::isRunning() { - DBG("WorkerThread::isRunning E"); - bool ret_value = android_atomic_acquire_load(&state_) == STATE_RUNNING; - DBG("WorkerThread::isRunning X ret_value=%d", ret_value); - return ret_value; -} - -WorkerThread::WorkerThread() { - DBG("WorkerThread::WorkerThread E"); - state_ = STATE_INITIALIZED; - pthread_mutex_init(&mutex_, NULL); - pthread_cond_init(&cond_, NULL); - DBG("WorkerThread::WorkerThread X"); -} - -WorkerThread::~WorkerThread() { - DBG("WorkerThread::~WorkerThread E"); - Stop(); - pthread_mutex_destroy(&mutex_); - DBG("WorkerThread::~WorkerThread X"); -} - -// Return true if changed from STATE_RUNNING to STATE_STOPPING -bool WorkerThread::BeginStopping() { - DBG("WorkerThread::BeginStopping E"); - bool ret_value = (android_atomic_acquire_cas(STATE_RUNNING, STATE_STOPPING, &state_) == 0); - DBG("WorkerThread::BeginStopping X ret_value=%d", ret_value); - return ret_value; -} - -// Wait until state is not STATE_STOPPING -void WorkerThread::WaitUntilStopped() { - DBG("WorkerThread::WaitUntilStopped E"); - pthread_cond_signal(&cond_); - while(android_atomic_release_load(&state_) == STATE_STOPPING) { - usleep(200000); - } - DBG("WorkerThread::WaitUntilStopped X"); -} - -void WorkerThread::Stop() { - DBG("WorkerThread::Stop E"); - if (BeginStopping()) { - WaitUntilStopped(); - } - DBG("WorkerThread::Stop X"); -} - -int WorkerThread::Run(void *workerParam) { - DBG("WorkerThread::Run E workerParam=%p", workerParam); - int status; - int ret; - - workerParam_ = workerParam; - - ret = pthread_attr_init(&attr_); - if (ret != 0) { - ALOGE("RIL_Init X: pthread_attr_init failed err=%s", strerror(ret)); - return STATUS_ERR; - } - ret = pthread_attr_setdetachstate(&attr_, PTHREAD_CREATE_DETACHED); - if (ret != 0) { - ALOGE("RIL_Init X: pthread_attr_setdetachstate failed err=%s", - strerror(ret)); - return STATUS_ERR; - } - ret = pthread_create(&tid_, &attr_, - (void * (*)(void *))&WorkerThread::Work, this); - if (ret != 0) { - ALOGE("RIL_Init X: pthread_create failed err=%s", strerror(ret)); - return STATUS_ERR; - } - - // Wait until worker is running - while (android_atomic_acquire_load(&state_) == STATE_INITIALIZED) { - usleep(200000); - } - - DBG("WorkerThread::Run X workerParam=%p", workerParam); - return STATUS_OK; -} - - -class WorkerQueueThread : public WorkerThread { - private: - friend class WorkerQueue; - - public: - WorkerQueueThread() { - } - - virtual ~WorkerQueueThread() { - Stop(); - } - - void * Worker(void *param) { - DBG("WorkerQueueThread::Worker E"); - WorkerQueue *wq = (WorkerQueue *)param; - - // Do the work until we're told to stop - while (isRunning()) { - pthread_mutex_lock(&mutex_); - while (isRunning() && wq->q_.size() == 0) { - if (wq->delayed_q_.size() == 0) { - // Both queue's are empty so wait - pthread_cond_wait(&cond_, &mutex_); - } else { - // delayed_q_ is not empty, move any - // timed out records to q_. - int64_t now = android::elapsedRealtime(); - while((wq->delayed_q_.size() != 0) && - ((wq->delayed_q_.top()->time - now) <= 0)) { - struct WorkerQueue::Record *r = wq->delayed_q_.top(); - DBG("WorkerQueueThread::Worker move p=%p time=%lldms", - r->p, r->time); - wq->delayed_q_.pop(); - wq->q_.push_back(r); - } - - if ((wq->q_.size() == 0) && (wq->delayed_q_.size() != 0)) { - // We need to do a timed wait - struct timeval tv; - struct timespec ts; - struct WorkerQueue::Record *r = wq->delayed_q_.top(); - int64_t delay_ms = r->time - now; - DBG("WorkerQueueThread::Worker wait" - " p=%p time=%lldms delay_ms=%lldms", - r->p, r->time, delay_ms); - gettimeofday(&tv, NULL); - ts.tv_sec = tv.tv_sec + (delay_ms / 1000); - ts.tv_nsec = (tv.tv_usec + - ((delay_ms % 1000) * 1000)) * 1000; - pthread_cond_timedwait(&cond_, &mutex_, &ts); - } - } - } - if (isRunning()) { - struct WorkerQueue::Record *r = wq->q_.front(); - wq->q_.pop_front(); - void *p = r->p; - wq->release_record(r); - pthread_mutex_unlock(&mutex_); - wq->Process(r->p); - } else { - pthread_mutex_unlock(&mutex_); - } - } - DBG("WorkerQueueThread::Worker X"); - return NULL; - } -}; - -WorkerQueue::WorkerQueue() { - DBG("WorkerQueue::WorkerQueue E"); - wqt_ = new WorkerQueueThread(); - DBG("WorkerQueue::WorkerQueue X"); -} - -WorkerQueue::~WorkerQueue() { - DBG("WorkerQueue::~WorkerQueue E"); - Stop(); - - Record *r; - pthread_mutex_lock(&wqt_->mutex_); - while(free_list_.size() != 0) { - r = free_list_.front(); - free_list_.pop_front(); - DBG("WorkerQueue::~WorkerQueue delete free_list_ r=%p", r); - delete r; - } - while(delayed_q_.size() != 0) { - r = delayed_q_.top(); - delayed_q_.pop(); - DBG("WorkerQueue::~WorkerQueue delete delayed_q_ r=%p", r); - delete r; - } - pthread_mutex_unlock(&wqt_->mutex_); - - delete wqt_; - DBG("WorkerQueue::~WorkerQueue X"); -} - -int WorkerQueue::Run() { - return wqt_->Run(this); -} - -void WorkerQueue::Stop() { - wqt_->Stop(); -} - -/** - * Obtain a record from free_list if it is not empty, fill in the record with provided - * information: *p and delay_in_ms - */ -struct WorkerQueue::Record *WorkerQueue::obtain_record(void *p, int delay_in_ms) { - struct Record *r; - if (free_list_.size() == 0) { - r = new Record(); - DBG("WorkerQueue::obtain_record new r=%p", r); - } else { - r = free_list_.front(); - DBG("WorkerQueue::obtain_record reuse r=%p", r); - free_list_.pop_front(); - } - r->p = p; - if (delay_in_ms != 0) { - r->time = android::elapsedRealtime() + delay_in_ms; - } else { - r->time = 0; - } - return r; -} - -/** - * release a record and insert into the front of the free_list - */ -void WorkerQueue::release_record(struct Record *r) { - DBG("WorkerQueue::release_record r=%p", r); - free_list_.push_front(r); -} - -/** - * Add a record to processing queue q_ - */ -void WorkerQueue::Add(void *p) { - DBG("WorkerQueue::Add E:"); - pthread_mutex_lock(&wqt_->mutex_); - struct Record *r = obtain_record(p, 0); - q_.push_back(r); - if (q_.size() == 1) { - pthread_cond_signal(&wqt_->cond_); - } - pthread_mutex_unlock(&wqt_->mutex_); - DBG("WorkerQueue::Add X:"); -} - -void WorkerQueue::AddDelayed(void *p, int delay_in_ms) { - DBG("WorkerQueue::AddDelayed E:"); - if (delay_in_ms <= 0) { - Add(p); - } else { - pthread_mutex_lock(&wqt_->mutex_); - struct Record *r = obtain_record(p, delay_in_ms); - delayed_q_.push(r); -#ifdef WORKER_DEBUG - int64_t now = android::elapsedRealtime(); - DBG("WorkerQueue::AddDelayed" - " p=%p delay_in_ms=%d now=%lldms top->p=%p" - " top->time=%lldms diff=%lldms", - p, delay_in_ms, now, delayed_q_.top()->p, - delayed_q_.top()->time, delayed_q_.top()->time - now); -#endif - if ((q_.size() == 0) && (delayed_q_.top() == r)) { - // q_ is empty and the new record is at delayed_q_.top - // so we signal the waiting thread so it can readjust - // the wait time. - DBG("WorkerQueue::AddDelayed signal"); - pthread_cond_signal(&wqt_->cond_); - } - pthread_mutex_unlock(&wqt_->mutex_); - } - DBG("WorkerQueue::AddDelayed X:"); -} - - -class TestWorkerQueue : public WorkerQueue { - virtual void Process(void *p) { - ALOGD("TestWorkerQueue::Process: EX p=%p", p); - } -}; - -class TesterThread : public WorkerThread { - public: - void * Worker(void *param) - { - ALOGD("TesterThread::Worker E param=%p", param); - WorkerQueue *wq = (WorkerQueue *)param; - - // Test AddDelayed - wq->AddDelayed((void *)1000, 1000); - wq->Add((void *)0); - wq->Add((void *)0); - wq->Add((void *)0); - wq->Add((void *)0); - wq->AddDelayed((void *)100, 100); - wq->AddDelayed((void *)2000, 2000); - - for (int i = 1; isRunning(); i++) { - ALOGD("TesterThread: looping %d", i); - wq->Add((void *)i); - wq->Add((void *)i); - wq->Add((void *)i); - wq->Add((void *)i); - sleep(1); - } - - ALOGD("TesterThread::Worker X param=%p", param); - - return NULL; - } -}; - -void testWorker() { - ALOGD("testWorker E: ********"); - - // Test we can create a thread and delete it - TesterThread *tester = new TesterThread(); - delete tester; - - TestWorkerQueue *wq = new TestWorkerQueue(); - if (wq->Run() == STATUS_OK) { - ALOGD("testWorker WorkerQueue %p running", wq); - - // Test we can run a thread, stop it then delete it - tester = new TesterThread(); - tester->Run(wq); - ALOGD("testWorker tester %p running", tester); - sleep(10); - ALOGD("testWorker tester %p stopping", tester); - tester->Stop(); - ALOGD("testWorker tester %p stopped", tester); - wq->Stop(); - ALOGD("testWorker wq %p stopped", wq); - } - ALOGD("testWorker X: ********\n"); -} diff --git a/mock-ril/src/cpp/worker.h b/mock-ril/src/cpp/worker.h deleted file mode 100644 index 9518fb3..0000000 --- a/mock-ril/src/cpp/worker.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_WORKER_H_ -#define MOCK_RIL_WORKER_H_ - -#include -#include -#include -#include -#include -#include - -/** - * A Thread class. - * - * 0) Extend WorkerThread creating a Worker method which - * monitors isRunning(). For example: - * - * void * Worker(void *param) { - * while (isRunning() == 0) { - * pthread_mutex_lock(&mutex_); - * while (isRunning() && !SOME-CONDITION) { - * pthread_cond_wait(&cond_, &mutex_); - * } - * if (isRunning()) { - * DO-WORK - * } else { - * pthread_mutex_unlock(&mutex_); - * } - * } - * return NULL; - * } - * - * 1) Create the WorkerThread. - * 2) Execute Run passing a param which will be passed to Worker. - * 3) Call Stop() or destroy the thread to stop processing. - * - */ -class WorkerThread { - protected: - pthread_attr_t attr_; - pthread_mutex_t mutex_; - pthread_cond_t cond_; - pthread_t tid_; - void *workerParam_; - - #define STATE_INITIALIZED 1 - #define STATE_RUNNING 2 - #define STATE_STOPPING 3 - #define STATE_STOPPED 4 - int32_t state_; - - static void * Work(void *param); - - virtual bool isRunning(); - - public: - WorkerThread(); - - virtual ~WorkerThread(); - - // Return true if changed from STATE_RUNNING to STATE_STOPPING - virtual bool BeginStopping(); - - // Wait until state is not STATE_STOPPING - virtual void WaitUntilStopped(); - - virtual void Stop(); - - virtual int Run(void *workerParam); - - /** - * Method called to do work, see example above. - * While running isRunning() must be monitored. - */ - virtual void *Worker(void *) = 0; -}; - - -/** - * A WorkerQueue. - * - * 0) Extend overriding Process - * 1) Create an instance - * 2) Call Run. - * 3) Call Add, passing a pointer which is added to a queue - * 4) Process will be called with a pointer as work can be done. - */ -class WorkerQueue { - private: - friend class WorkerQueueThread; - - struct Record { - int64_t time; - void *p; - }; - - class record_compare { - public: - // To get ascending order return true if lhs > rhs. - bool operator() (const struct Record* lhs, const struct Record* rhs) const { - return lhs->time > rhs->time; - } - }; - - std::list q_; // list of records to be processed - std::list free_list_; // list of records that have been released - std::priority_queue, record_compare> delayed_q_; - // list of records that are delayed - class WorkerQueueThread *wqt_; - - protected: - struct Record *obtain_record(void *p, int delay_in_ms); - - void release_record(struct Record *r); - - public: - WorkerQueue(); - - virtual ~WorkerQueue(); - - int Run(); - - void Stop(); - - void Add(void *p); - - void AddDelayed(void *p, int delay_in_ms); - - virtual void Process(void *) = 0; -}; - -extern void testWorker(); - -#endif // MOCK_RIL_WORKER_H_ diff --git a/mock-ril/src/cpp/worker_v8.cpp b/mock-ril/src/cpp/worker_v8.cpp deleted file mode 100644 index 0e71b06..0000000 --- a/mock-ril/src/cpp/worker_v8.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/** - * 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. - */ - -#include -#include - -#include "logging.h" -#include "js_support.h" -#include "node_object_wrap.h" -#include "node_util.h" -#include "util.h" -#include "worker.h" - -#include "worker_v8.h" - - -//#define WORKER_V8_V8_DEBUG -#ifdef WORKER_V8_V8_DEBUG - -#define DBG(...) ALOGD(__VA_ARGS__) - -#else - -#define DBG(...) - -#endif - -v8::Persistent WorkerV8Template; - -class WorkerV8 : public ObjectWrap { - private: - friend class Handler; - - - struct ArgInfo { - v8::Persistent js_this; - v8::Persistent value; - }; - - pthread_mutex_t ai_free_list_mutex_; - std::queue ai_free_list_; - - ArgInfo *ObtainArgInfo() { - ArgInfo *ai; - pthread_mutex_lock(&ai_free_list_mutex_); - if (ai_free_list_.size() == 0) { - ai = new ArgInfo(); - } else { - ai = ai_free_list_.front(); - ai_free_list_.pop(); - } - pthread_mutex_unlock(&ai_free_list_mutex_); - return ai; - } - - void ReleaseArgInfo(ArgInfo *ai) { - pthread_mutex_lock(&ai_free_list_mutex_); - ai_free_list_.push(ai); - pthread_mutex_unlock(&ai_free_list_mutex_); - } - - class Handler : public WorkerQueue { - private: - v8::Persistent functionValue_; - WorkerV8 *worker_; - - public: - Handler(WorkerV8 *worker, v8::Handle value) - : worker_(worker) { - functionValue_ = v8::Persistent::New(value); - } - - void Process(void *param) { - DBG("Handler::Process: E"); - - v8::Locker locker; - v8::HandleScope handle_scope; - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - ArgInfo *ai = (ArgInfo*)param; - v8::Handle args(ai->value); - v8::Function::Cast(*functionValue_)->Call(ai->js_this, 1, &args); - - ai->js_this.Dispose(); - ai->value.Dispose(); - - worker_->ReleaseArgInfo(ai); - - DBG("Handler::Process: X"); - } - }; - - Handler *handler_; - - public: - WorkerV8(v8::Handle self, v8::Handle functionValue) { - DBG("WorkerV8::WorkerV8 E:"); - pthread_mutex_init(&ai_free_list_mutex_, NULL); - handler_ = new Handler(this, functionValue); - Wrap(self); - DBG("WorkerV8::WorkerV8 X: this=%p handler_=%p", this, handler_); - } - - virtual ~WorkerV8() { - DBG("~WorkerV8::WorkerV8 E:"); - DBG("~WorkerV8::WorkerV8 X:"); - } - - static v8::Handle Run(const v8::Arguments& args) { - WorkerV8 *workerV8 = ObjectWrap::Unwrap(args.This()); - DBG("WorkerV8::Run(args) E:"); - workerV8->handler_->Run(); - DBG("WorkerV8::Run(args) X:"); - return v8::Undefined(); - } - - static v8::Handle Add(const v8::Arguments& args) { - DBG("WorkerV8::Add(args) E:"); - WorkerV8 *workerV8 = ObjectWrap::Unwrap(args.This()); - - // Validate one argument to add - if (args.Length() != 1) { - DBG("WorkerV8::Add(args) X: expecting one param"); - return v8::ThrowException(v8::String::New("Add has no parameter")); - } - ArgInfo *ai = workerV8->ObtainArgInfo(); - ai->js_this = v8::Persistent::New( args.This() ); - ai->value = v8::Persistent::New( args[0] ); - - workerV8->handler_->Add(ai); - DBG("WorkerV8::Add(args) X:"); - return v8::Undefined(); - } - - static v8::Handle AddDelayed(const v8::Arguments& args) { - DBG("WorkerV8::AddDelayed(args) E:"); - WorkerV8 *workerV8 = ObjectWrap::Unwrap(args.This()); - - // Validate two argument to addDelayed - if (args.Length() != 2) { - DBG("WorkerV8::AddDelayed(args) X: expecting two params"); - return v8::ThrowException(v8::String::New("AddDelayed expects req delayTime params")); - } - ArgInfo *ai = workerV8->ObtainArgInfo(); - ai->js_this = v8::Persistent::New( args.This() ); - ai->value = v8::Persistent::New( args[0] ); - v8::Handle v8DelayMs(args[1]->ToObject()); - int32_t delay_ms = v8DelayMs->Int32Value(); - workerV8->handler_->AddDelayed(ai, delay_ms); - - DBG("WorkerV8::AddDelayed(args) X:"); - return v8::Undefined(); - } - - static v8::Handle NewWorkerV8(const v8::Arguments& args) { - DBG("WorkerV8::NewWorkerV8 E: args.Length()=%d", args.Length()); - WorkerV8 *worker = new WorkerV8(args.This(), args[0]); - DBG("WorkerV8::NewWorkerV8 X:"); - return worker->handle_; - } -}; - -void WorkerV8Init() { - DBG("WorkerV8Init E:"); - v8::HandleScope handle_scope; - - WorkerV8Template = v8::Persistent::New( - v8::FunctionTemplate::New(WorkerV8::NewWorkerV8)); - WorkerV8Template->SetClassName(v8::String::New("Worker")); - // native self (Field 0 is handle_) field count is at least 1 - WorkerV8Template->InstanceTemplate()->SetInternalFieldCount(1); - - // Set prototype methods - SET_PROTOTYPE_METHOD(WorkerV8Template, "run", WorkerV8::Run); - SET_PROTOTYPE_METHOD(WorkerV8Template, "add", WorkerV8::Add); - SET_PROTOTYPE_METHOD(WorkerV8Template, "addDelayed", WorkerV8::AddDelayed); - - DBG("WorkerV8Init X:"); -} - -void testWorkerV8(v8::Handle context) { - ALOGD("testWorkerV8 E: ********"); - v8::HandleScope handle_scope; - - v8::TryCatch try_catch; - try_catch.SetVerbose(true); - - ALOGD("testWorkerV8 runJs"); - runJs(context, &try_catch, "local-string", - "var w1 = new Worker(function (msg) {" - " print('w1: ' + msg);\n" - "});\n" - "w1.run();\n" - "var w2 = new Worker(function (msg) {" - " print('w2: ' + msg);\n" - "});\n" - "w2.run();\n" - "w2.addDelayed('three', 1000);\n" - "w2.add('one');\n" - "w1.add('two');\n" - "w1.addDelayed('four', 2000);\n" - ); - ALOGD("testWorkerV8 X: ********"); -} - -extern void WorkerV8ObjectTemplateInit(v8::Handle target) { - DBG("WorkerV8ObjectTemplateInit(target) E:"); - target->Set(v8::String::New("Worker"), WorkerV8Template); - DBG("WorkerV8ObjectTemplateInit(target) X:\n"); -} diff --git a/mock-ril/src/cpp/worker_v8.h b/mock-ril/src/cpp/worker_v8.h deleted file mode 100644 index 7c9bb88..0000000 --- a/mock-ril/src/cpp/worker_v8.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * 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. - */ - -#ifndef MOCK_RIL_WORKER_V8_H_ -#define MOCK_RIL_WORKER_V8_H_ - -#include - -// Initialize this module -extern void WorkerV8Init(); - -// Add Worker to the object template -extern void WorkerV8ObjectTemplateInit(v8::Handle target); - -extern void testWorkerV8(v8::Handle context); - -#endif // MOCK_RIL_WORKER_V8_H_ diff --git a/mock-ril/src/java/com/android/internal/communication/Msg.java b/mock-ril/src/java/com/android/internal/communication/Msg.java deleted file mode 100644 index 6046fe7..0000000 --- a/mock-ril/src/java/com/android/internal/communication/Msg.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * 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. - */ - -package com.android.internal.communication; - -import android.util.Log; - -import com.android.internal.communication.MsgHeader; -import com.android.internal.telephony.RilChannel; -import com.google.protobuf.micro.InvalidProtocolBufferMicroException; -import com.google.protobuf.micro.MessageMicro; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * A message - */ -public class Msg { - private MsgHeader mHeader; - private ByteBuffer mData; - - /** - * Send a message header - * - * @param mh is message header to write - * @throws IOException - */ - private static void sendHeader(RilChannel rc, MsgHeader mh) throws IOException { - ByteBuffer lenBuffer = ByteBuffer.allocateDirect(4); - lenBuffer.order(ByteOrder.LITTLE_ENDIAN); - lenBuffer.putInt(mh.getSerializedSize()); - - ByteBuffer mhBuffer = ByteBuffer.allocateDirect(mh.getCachedSize()); - mhBuffer.put(mh.toByteArray()); - - rc.rewindSendAll(lenBuffer); - rc.rewindSendAll(mhBuffer); - } - - /** - * Read a message header - * - * @returns message header - * @throws IOException - */ - private static MsgHeader recvHeader(RilChannel rc) throws IOException { - ByteBuffer lenBuffer = ByteBuffer.allocate(4); - lenBuffer.order(ByteOrder.LITTLE_ENDIAN); - int lenRead = rc.recvAllRewind(lenBuffer); - int lenHeader = lenBuffer.getInt(); - - ByteBuffer mhBuffer = ByteBuffer.allocate(lenHeader); - lenRead = rc.recvAllRewind(mhBuffer); - MsgHeader mh = MsgHeader.parseFrom(mhBuffer.array()); - return mh; - } - - /** - * Msg Constructor - */ - private Msg() { - } - - /** - * Get a message - */ - public static Msg obtain() { - // TODO: Get from a free list - return new Msg(); - } - - /** - * Release a message - */ - public void release() { - // TODO: place back on free list - } - - /** - * Send a message header followed by the data if present - * - * The length data field will be filled in as appropriate - * @param mh header - * @param data if not null and length > 0 sent after header - * @throws IOException - */ - public static final void send(RilChannel rc, MsgHeader mh, ByteBuffer data) - throws IOException { - int lenData; - - if (data == null) { - lenData = 0; - } else { - data.rewind(); - lenData = data.remaining(); - } - mh.setLengthData(lenData); - sendHeader(rc, mh); - if (lenData > 0) { - rc.sendAll(data); - } - } - - /** - * Send a message with cmd, token, status followed by the data. - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @param token for the header - * @param status for the header - * @param pb is the protobuf to send - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd, long token, int status, MessageMicro pb) - throws IOException { - MsgHeader mh = new MsgHeader(); - mh.setCmd(cmd); - mh.setToken(token); - mh.setStatus(status); - - ByteBuffer data; - if (pb != null) { - data = ByteBuffer.wrap(pb.toByteArray()); - } else { - data = null; - } - send(rc, mh, data); - } - - /** - * Send a message with cmd, token, status followed by the data. - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @param token for the header - * @param pb is the protobuf to send - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd, long token, MessageMicro pb) - throws IOException { - send(rc, cmd, token, 0, pb); - } - - /** - * Send a message with cmd followed by the data. - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @param pb is the protobuf to send - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd, MessageMicro pb) throws IOException { - send(rc, cmd, 0, 0, pb); - } - - /** - * Send a message with cmd, token and status but no data - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @param token for the header - * @param status for the header - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd, long token, int status) - throws IOException { - send(rc, cmd, token, status, null); - } - - /** - * Send a message with cmd and token but no data - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @param token for the header - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd, long token) throws IOException { - send(rc, cmd, token, 0, null); - } - - /** - * Send a message with cmd but no data - * - * The length data field will be filled in as appropriate - * @param cmd for the header - * @throws IOException - */ - public static final void send(RilChannel rc, int cmd) throws IOException { - send(rc, cmd, 0, 0, null); - } - - /** - * Read a message - * - * @return Msg - * @throws IOException - */ - public static final Msg recv(RilChannel rc) throws IOException { - Msg msg = Msg.obtain(); - msg.read(rc); - return msg; - } - - /** - * Read a message header and data. - * - * @throws IOException - */ - public void read(RilChannel rc) throws IOException { - mHeader = recvHeader(rc); - if (mHeader.getLengthData() > 0) { - ByteBuffer bb = ByteBuffer.allocate(mHeader.getLengthData()); - rc.recvAllRewind(bb); - mData = bb; - } - } - - /** - * Print the message header. - * - * @param tag for the header - */ - public void printHeader(String tag) { - Log.d(tag, " cmd=" + mHeader.getCmd() + " token=" + mHeader.getToken() + " status=" - + mHeader.getStatus() + " lengthData=" + mHeader.getLengthData()); - } - - /** - * Set data (for testing purposes only). - */ - public void setData(ByteBuffer data) { - mData = data; - } - - /** - * Set header (for testing purposes only). - */ - public void setHeader(MsgHeader header) { - mHeader = header; - } - - /** - * @return cmd - */ - public int getCmd() { - return mHeader.getCmd(); - } - - /** - * @return token - */ - public long getToken() { - return mHeader.getToken(); - } - - /** - * @return status - */ - public int getStatus() { - return mHeader.getStatus(); - } - - /** - * @return data ByteBuffer - */ - public ByteBuffer getData() { - return mData; - } - - /** - * @return data at index - */ - public byte getData(int index) { - return mData.get(index); - } - - /** - * Return data as a Class. - * - * @param a class that extends MessageMicro. - * @param c the T.class to create from the data. - * @param data is the MessageMicro protobuf to be converted. - * @return null if an error occurs. - */ - @SuppressWarnings("unchecked") - public static final T getAs(Class c, byte[] data) { - Object o = null; - if ((data != null) && (data.length > 0)) { - try { - o = c.newInstance().mergeFrom(data); - } catch (InvalidProtocolBufferMicroException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return (T)o; - } - - /** - * Return data as a Class. - * - * @param a class that extends MessageMicro. - * @param c the T.class to create from data. - * @return null if an error occurs - */ - @SuppressWarnings("unchecked") - public T getDataAs(Class c) { - Object o; - - if ((mData != null) && (mData.remaining() > 0)) { - o = getAs(c, mData.array()); - } else { - o = null; - } - return (T)o; - } -} diff --git a/mock-ril/src/java/com/android/internal/telephony/RilChannel.java b/mock-ril/src/java/com/android/internal/telephony/RilChannel.java deleted file mode 100644 index abe32c7..0000000 --- a/mock-ril/src/java/com/android/internal/telephony/RilChannel.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * 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. - */ - -package com.android.internal.telephony; - -import android.util.Log; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.channels.SocketChannel; -import java.nio.ByteBuffer; - -public class RilChannel { - private static final boolean DBG = false; - - private static final String MOCKRIL_ADDR_STR = "127.0.0.1"; - private static final int MOCKRIL_PORT = 54312; - private SocketChannel mChannel = null; - - /** - * Constructor - */ - private RilChannel() { - if (DBG) log("ctor EX"); - } - - /** - * Open the channel - * - * @throws IOException - */ - private void open() throws IOException { - InetSocketAddress mockRilAddr = new InetSocketAddress(MOCKRIL_ADDR_STR, MOCKRIL_PORT); - mChannel= SocketChannel.open(mockRilAddr); - } - - /** - * Make the channel - * - * @return the channel - * @throws IOException - */ - public static RilChannel makeRilChannel() throws IOException { - if (DBG) log("makeMockRilChannel E"); - RilChannel sm = new RilChannel(); - sm.open(); - if (DBG) log("makeMockRilChannel X"); - return sm; - } - - /** - * Close an open channel - */ - public void close() { - try { - if (mChannel != null) { - mChannel.close(); - if (DBG) log("DefaultState.enter closed socket"); - } - } catch (IOException e) { - log("Could not close conection to mock-ril"); - e.printStackTrace(); - } - } - - /** - * @return the channel - */ - public SocketChannel getChannel() { - return mChannel; - } - - /** - * write the bb contents to sc - * - * @param bb is the ByteBuffer to write - * @return number of bytes written - * @throws IOException - */ - public final int sendAll(ByteBuffer bb) throws IOException { - int count = 0; - while (bb.remaining() != 0) { - count += mChannel.write(bb); - } - return count; - } - - /** - * read from sc until bb is filled then rewind bb - * - * @param bb is the ByteBuffer to fill - * @return number of bytes read - * @throws IOException - */ - public final int recvAll(ByteBuffer bb) throws IOException { - int count = 0; - while (bb.remaining() != 0) { - count += mChannel.read(bb); - } - return count; - } - - /** - * Rewind bb then write the contents to sc - * - * @param bb is the ByteBuffer to write - * @return number of bytes written - * @throws IOException - */ - public final int rewindSendAll(ByteBuffer bb) throws IOException { - bb.rewind(); - return sendAll(bb); - } - - /** - * read from sc until bb is filled then rewind bb - * - * @param bb is the ByteBuffer to fill - * @return number of bytes read - * @throws IOException - */ - public final int recvAllRewind(ByteBuffer bb) throws IOException { - int count = recvAll(bb); - bb.rewind(); - return count; - } - - /** - * Write to log. - * - * @param s - */ - static void log(String s) { - Log.v("MockRilChannel", s); - } -} diff --git a/mock-ril/src/js/ctrl_server.js b/mock-ril/src/js/ctrl_server.js deleted file mode 100644 index e64b96c..0000000 --- a/mock-ril/src/js/ctrl_server.js +++ /dev/null @@ -1,188 +0,0 @@ -/** - * 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"); -} diff --git a/mock-ril/src/js/ctrl_server_tests.js b/mock-ril/src/js/ctrl_server_tests.js deleted file mode 100644 index 0ef7615..0000000 --- a/mock-ril/src/js/ctrl_server_tests.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 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. - */ - -// TOOD: Add tests diff --git a/mock-ril/src/js/mock_ril.js b/mock-ril/src/js/mock_ril.js deleted file mode 100644 index 8485358..0000000 --- a/mock-ril/src/js/mock_ril.js +++ /dev/null @@ -1,320 +0,0 @@ -/** - * 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. - */ - -/** - * @fileoverview Mock Radio Interface Layer (RIL) used for testing - * - * The following routines are defined in c++: - * - * Print a string to android log - * print(string) - * - * Read a file to a string. - * String readFileToString(String fileName) - * - * Read a file to a Buffer. - * Buffer readFileToBuffer(String fileName) - * - * Send an response unsolicited response to the framework. - * sendRilUnsolicitedResponse(Number responseNum, Buffer responseProtobuf) - * - * Send a completion request to the framework. - * sendRilRequestComplete(Number rilErrCode, Number reqNum, - * String token, Buffer responseProtobuf) - * - * Send a complete request to the controller. - * sendCtrlRequestComplete(Number ctrlStatus, Number reqNum, - * String token, Buffer responseProtobuf) - * - * Include the javascript file. - * include(string) - * - * The following objects are defined in c++ - * - * Buffer is defined in node_buffer and provides a wrapper - * for a buffer that can be shared between c++ and js. - * Buffer(length) - * Buffer::length() - * Buffer::data() - * - * Schema is defined in protobuf_v8 and converts between - * a buffer and an object. A protobuf descriptor, ril.desc - * and ctrl.desc, is used to drive the conversation. - * Object Schema::parse(Buffer protobuf) - * Buffer Schema::serialize(object) - * - * Worker is a thread which receives messages to be handled. - * It is passed a function which is called once for each - * message as it arrives. Call the add method to queue up - * requests for the worker function to process. - * Object Worker(function (req)) - * Worker::add(req); - */ - -/** - * Globals - */ - -include("ril_vars.js"); - -var NULL_RESPONSE_STRING = '*magic-null*'; - -// The state of the radio, needed by currentState() -var gRadioState = RADIOSTATE_UNAVAILABLE; - -// The state of the screen -var gScreenState = 0; - -// The base band version -var gBaseBandVersion = 'mock-ril 0.1'; - -// define a global variable to access the global object -var globals = this; - -// Empty Protobuf, defined here so we don't have -// to recreate an empty Buffer frequently -var emptyProtobuf = new Buffer(); - -// Get the ril description file and create a schema -var packageNameAndSeperator = 'ril_proto.'; -var rilSchema = new Schema(readFileToBuffer('ril.desc')); -var ctrlSchema = new Schema(readFileToBuffer('ctrl.desc')); - -/** - * Print properties of an object - */ -function printProperties(obj, maxDepth, depth) { - if (typeof maxDepth == 'undefined') { - maxDepth = 1; - } - if (typeof depth == 'undefined') { - depth = 1; - } - if (depth == 1) { - print('printProperties:'); - } - for (var property in obj) { - try { - if ((typeof obj[property] == 'object') - && (depth < maxDepth)) { - printProperties(obj[property], maxDepth, depth+1); - } else { - print(depth + ': ' + property + '=' + obj[property] + - ' type=' + typeof obj[property]); - } - } catch (err) { - print('err=' + err) - } - } -} - -// Test printProperties -if (false) { - var myObject = { 'field1' : '1', 'field2' : '2', 'hello' : [ 'hi', 'there' ] }; - printProperties(myObject, 3); -} - -/** - * Include the components - */ - -include("simulated_radio.js"); -include("simulated_icc.js"); -include("ctrl_server.js"); - -/** - * Construct a new request which is passed to the - * Worker handler method. - */ -function Request(reqNum, token, protobuf, schema, schemaName) { - this.reqNum = reqNum; - this.token = token; - try { - this.data = schema[packageNameAndSeperator + schemaName].parse(protobuf); - } catch (err) { - // not a valid protobuf in the request - this.data = null; - } -} - -/** - * Dispatch incoming requests from RIL to the appropriate component. - */ -function onRilRequest(reqNum, token, requestProtobuf) { - try { - //print('onRilRequest E: reqNum=' + reqNum + ' token=' + token); - - /** - * Validate parameters - */ - rilErrCode = RIL_E_SUCCESS; - if (typeof reqNum != 'number') { - print('onRilRequest: reqNum is not a number'); - rilErrCode = RIL_E_GENERIC_FAILURE; - } - if (typeof token != 'number') { - print('onRilRequest: token is not a number'); - rilErrCode = RIL_E_GENERIC_FAILURE; - } - if (typeof requestProtobuf != 'object') { - print('onRilRequest: requestProtobuf is not an object'); - rilErrCode = RIL_E_GENERIC_FAILURE; - } - if (rilErrCode != RIL_E_SUCCESS) { - sendRilRequestComplete(rilErrCode, reqNum, token); - return 'onRilRequest X: invalid parameter'; - } - - try { - //print('onRilRequest: get entry from dispatchTable reqNum=' + reqNum); - entry = dispatchTable[reqNum]; - if (typeof entry == 'undefined') { - throw ('entry = dispatchTable[' + reqNum + '] was undefined'); - } else { - req = new Request(reqNum, token, requestProtobuf, rilSchema, entry.schemaName); - for(i = 0; i < entry.components.length; i++) { - entry.components[i].add(req); - } - } - } catch (err) { - print('onRilRequest: Unknown reqNum=' + reqNum + ' err=' + err); - sendRilRequestComplete(RIL_E_REQUEST_NOT_SUPPORTED, reqNum, token); - } - // print('onRilRequest X: reqNum=' + reqNum + ' token=' + token); - } catch (err) { - print('onRilRequest X: Exception err=' + err); - return('onRilRequest X: Exception err=' + err); - } - return 'onRilRequest X'; -} - -function onUnsolicitedTick(tick) { - print('onUnsolicitedTick EX tick=' + tick); - return 3; -} - -/** - * Dispatch table for requests - * - * Each table entry is index by the RIL_REQUEST_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. - * - * DispatchTable[RIL_REQUEST_xxx].components = Array of components - * DisptachTable[RIL_REQUEST_xxx].Entry.schemaName = 'Name-of-schema'; - */ -var dispatchTable = new Array(); - -dispatchTable[RIL_REQUEST_GET_SIM_STATUS] = { // 1 - 'components' : [simulatedIccWorker], - 'schemaName' : 'ReqGetSimStatus', -}; -dispatchTable[RIL_REQUEST_ENTER_SIM_PIN] = { // 2 - 'components' : [simulatedIccWorker], - 'schemaName' : 'ReqEnterSimPin', -}; -dispatchTable[RIL_REQUEST_GET_CURRENT_CALLS] = { // 9 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_DIAL] = { // 10 - 'components' : [simulatedRadioWorker], - 'schemaName' : 'ReqDial', -}; -dispatchTable[RIL_REQUEST_GET_IMSI] = { // 11 - 'components' : [simulatedIccWorker], -}; -dispatchTable[RIL_REQUEST_HANGUP] = { // 12 - 'components' : [simulatedRadioWorker], - 'schemaName' : 'ReqHangUp', -}; -dispatchTable[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = { // 13 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = { // 14 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = { // 15 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_CONFERENCE] = { // 16 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = { // 18 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_SIGNAL_STRENGTH] = { // 19 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_VOICE_REGISTRATION_STATE] = { // 20 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_DATA_REGISTRATION_STATE] = { // 21 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_OPERATOR] = { // 22 - 'components' : [simulatedIccWorker], -}; -dispatchTable[RIL_REQUEST_GET_IMEI] = { // 38 - 'components' : [simulatedIccWorker], -}; -dispatchTable[RIL_REQUEST_GET_IMEISV] = { // 39 - 'components' : [simulatedIccWorker], -}; -dispatchTable[RIL_REQUEST_ANSWER] = { // 40 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = { // 45 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = { // 46 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_BASEBAND_VERSION] = { // 51 - 'components' : [simulatedRadioWorker], -}; -dispatchTable[RIL_REQUEST_SEPARATE_CONNECTION] = { // 52 - 'components' : [simulatedRadioWorker], - 'schemaName' : 'ReqSeparateConnection', -}; -dispatchTable[RIL_REQUEST_SET_MUTE ] = { // 53 - 'components' : [simulatedRadioWorker], - 'schemaName' : 'ReqSetMute', -}; -dispatchTable[RIL_REQUEST_SCREEN_STATE] = { // 61 - 'components' : [simulatedRadioWorker], - 'schemaName' : 'ReqScreenState', -}; - -/** - * Start the mock rill after loading - */ -function startMockRil() { - print("startMockRil E:"); - setRadioState(RADIOSTATE_SIM_READY); - // send the signal strength after 5 seconds, wait until mock ril is started - simulatedRadioWorker.addDelayed({ - 'reqNum' : CMD_UNSOL_SIGNAL_STRENGTH}, 5000); - print("startMockRil X:"); -} - -/** - * Optional tests - */ -if (false) { - include("mock_ril_tests.js"); -} diff --git a/mock-ril/src/js/mock_ril_tests.js b/mock-ril/src/js/mock_ril_tests.js deleted file mode 100644 index 0ef7615..0000000 --- a/mock-ril/src/js/mock_ril_tests.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 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. - */ - -// TOOD: Add tests diff --git a/mock-ril/src/js/ril_vars.js b/mock-ril/src/js/ril_vars.js deleted file mode 100644 index aadc35a..0000000 --- a/mock-ril/src/js/ril_vars.js +++ /dev/null @@ -1,346 +0,0 @@ -/** - * 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. - */ - -/** - * variables from ril.h - */ - -/** - * RIL Error codes - */ -var RIL_E_SUCCESS = 0; -var RIL_E_RADIO_NOT_AVAILABLE = 1; /* If radio did not start or is resetting */ -var RIL_E_GENERIC_FAILURE = 2; -var RIL_E_PASSWORD_INCORRECT = 3; /* for PIN/PIN2 methods only! */ -var RIL_E_SIM_PIN2 = 4; /* Operation requires SIM PIN2 to be entered */ -var RIL_E_SIM_PUK2 = 5; /* Operation requires SIM PIN2 to be entered */ -var RIL_E_REQUEST_NOT_SUPPORTED = 6; -var RIL_E_CANCELLED = 7; -var RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8; /* data ops are not allowed during voice - call on a Class C GPRS device */ -var RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9; /* data ops are not allowed before device - registers in network */ -var RIL_E_SMS_SEND_FAIL_RETRY = 10; /* fail to send sms and need retry */ -var RIL_E_SIM_ABSENT = 11; /* fail to set the location where CDMA subscription - shall be retrieved because of SIM or RUIM - card absent */ -var RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12; /* fail to find CDMA subscription from specified - location */ -var RIL_E_MODE_NOT_SUPPORTED = 13; /* HW does not support preferred network type */ -var RIL_E_FDN_CHECK_FAILURE = 14; /* command failed because recipient is not on FDN - list */ -var RIL_E_ILLEGAL_SIM_OR_ME = 15; /* network selection failed due to */ - -var CARD_MAX_APPS = 8; - -/** - * Icc card state - */ -var CARDSTATE_ABSENT = 0; -var CARDSTATE_PRESENT = 1; -var CARDSTATE_ERROR = 2; - -/** - * RIL_PersoSubState - */ -var PERSOSUBSTATE_UNKNOWN = 0; /* initial state */ -var PERSOSUBSTATE_IN_PROGRESS = 1; /* in between each lock transition */ -var PERSOSUBSTATE_READY = 2; /* when either SIM or RUIM Perso is finished - since each app can only have 1 active perso - involved */ -var PERSOSUBSTATE_SIM_NETWORK = 3; -var PERSOSUBSTATE_SIM_NETWORK_SUBSET = 4; -var PERSOSUBSTATE_SIM_CORPORATE = 5; -var PERSOSUBSTATE_SIM_SERVICE_PROVIDER = 6; -var PERSOSUBSTATE_SIM_SIM = 7; -var PERSOSUBSTATE_SIM_NETWORK_PUK = 8; /* The corresponding perso lock is blocked */ -var PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK = 9; -var PERSOSUBSTATE_SIM_CORPORATE_PUK = 10; -var PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK = 11; -var PERSOSUBSTATE_SIM_SIM_PUK = 12; -var PERSOSUBSTATE_RUIM_NETWORK1 = 13; -var PERSOSUBSTATE_RUIM_NETWORK2 = 14; -var PERSOSUBSTATE_RUIM_HRPD = 15; -var PERSOSUBSTATE_RUIM_CORPORATE = 16; -var PERSOSUBSTATE_RUIM_SERVICE_PROVIDER = 17; -var PERSOSUBSTATE_RUIM_RUIM = 18; -var PERSOSUBSTATE_RUIM_NETWORK1_PUK = 19; /* The corresponding perso lock is blocked */ -var PERSOSUBSTATE_RUIM_NETWORK2_PUK = 20; -var PERSOSUBSTATE_RUIM_HRPD_PUK = 21; -var PERSOSUBSTATE_RUIM_CORPORATE_PUK = 22; -var PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK = 23; -var PERSOSUBSTATE_RUIM_RUIM_PUK = 24; - -/** - * RIL_AppState - */ -var APPSTATE_UNKNOWN = 0; -var APPSTATE_DETECTED = 1; -var APPSTATE_PIN = 2; /* If PIN1 or UPin is required */ -var APPSTATE_PUK = 3; /* If PUK1 or Puk for UPin is required */ -var APPSTATE_SUBSCRIPTION_PERSO = 4; /* perso_substate should be look at - when app_state is assigned to this value */ -var APPSTATE_READY = 5; - -/** - * RIL_PinState - */ -var PINSTATE_UNKNOWN = 0; -var PINSTATE_ENABLED_NOT_VERIFIED = 1; -var PINSTATE_ENABLED_VERIFIED = 2; -var PINSTATE_DISABLED = 3; -var PINSTATE_ENABLED_BLOCKED = 4; -var PINSTATE_ENABLED_PERM_BLOCKED = 5; - -/** - * RIL_AppType - */ -var APPTYPE_UNKNOWN = 0; -var APPTYPE_SIM = 1; -var APPTYPE_USIM = 2; -var APPTYPE_RUIM = 3; -var APPTYPE_CSIM = 4; - -/** - * RIL_CallState - */ -var CALLSTATE_ACTIVE = 0; -var CALLSTATE_HOLDING = 1; -var CALLSTATE_DIALING = 2; /* MO call only */ -var CALLSTATE_ALERTING = 3; /* MO call only */ -var CALLSTATE_INCOMING = 4; /* MT call only */ -var CALLSTATE_WAITING = 5; /* MT call only */ - -/** - * RIL_RadioState - */ -var RADIOSTATE_OFF = 0; /* Radio explictly powered off (eg CFUN=0) */ -var RADIOSTATE_UNAVAILABLE = 1; /* Radio unavailable (eg, resetting or not booted) */ -var RADIOSTATE_SIM_NOT_READY = 2; /* Radio is on, but the SIM interface is not ready */ -var RADIOSTATE_SIM_LOCKED_OR_ABSENT = 3; /* SIM PIN locked, PUK required, network - personalization locked; or SIM absent */ -var RADIOSTATE_SIM_READY = 4; /* Radio is on and SIM interface is available */ -var RADIOSTATE_RUIM_NOT_READY = 5; /* Radio is on, but the RUIM interface is not ready */ -var RADIOSTATE_RUIM_READY = 6; /* Radio is on and the RUIM interface is available */ -var RADIOSTATE_RUIM_LOCKED_OR_ABSENT = 7; /* RUIM PIN locked, PUK required, network - personalization locked; or RUIM absent */ -var RADIOSTATE_NV_NOT_READY = 8; /* Radio is on, but the NV interface is not available */ -var RADIOSTATE_NV_READY = 9; /* Radio is on and the NV interface is available */ - -/** - * Last call fail cause - */ -var CALL_FAIL_UNOBTAINABLE_NUMBER = 1; -var CALL_FAIL_NORMAL = 16; -var CALL_FAIL_BUSY = 17; -var CALL_FAIL_CONGESTION = 34; -var CALL_FAIL_ACM_LIMIT_EXCEEDED = 68; -var CALL_FAIL_CALL_BARRED = 240; -var CALL_FAIL_FDN_BLOCKED = 241; -var CALL_FAIL_IMSI_UNKNOWN_IN_VLR = 242; -var CALL_FAIL_IMEI_NOT_ACCEPTED = 243; -var CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000; -var CALL_FAIL_CDMA_DROP = 1001; -var CALL_FAIL_CDMA_INTERCEPT = 1002; -var CALL_FAIL_CDMA_REORDER = 1003; -var CALL_FAIL_CDMA_SO_REJECT = 1004; -var CALL_FAIL_CDMA_RETRY_ORDER = 1005; -var CALL_FAIL_CDMA_ACCESS_FAILURE = 1006; -var CALL_FAIL_CDMA_PREEMPTED = 1007; -var CALL_FAIL_CDMA_NOT_EMERGENCY = 1008; /* For non-emergency number dialed during emergency callback mode */ -var CALL_FAIL_CDMA_ACCESS_BLOCKED = 1009; /* CDMA network access probes blocked */ -var CALL_FAIL_ERROR_UNSPECIFIED = 0xffff; - -/** - * RIL requests - */ -var RIL_REQUEST_GET_SIM_STATUS = 1 -var RIL_REQUEST_ENTER_SIM_PIN = 2 -var RIL_REQUEST_ENTER_SIM_PUK = 3 -var RIL_REQUEST_ENTER_SIM_PIN2 = 4 -var RIL_REQUEST_ENTER_SIM_PUK2 = 5 -var RIL_REQUEST_CHANGE_SIM_PIN = 6 -var RIL_REQUEST_CHANGE_SIM_PIN2 = 7 -var RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION = 8 -var RIL_REQUEST_GET_CURRENT_CALLS = 9 -var RIL_REQUEST_DIAL = 10 -var RIL_REQUEST_GET_IMSI = 11 -var RIL_REQUEST_HANGUP = 12 -var RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND = 13 -var RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND = 14 -var RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE = 15 -var RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE = 15 -var RIL_REQUEST_CONFERENCE = 16 -var RIL_REQUEST_UDUB = 17 -var RIL_REQUEST_LAST_CALL_FAIL_CAUSE = 18 -var RIL_REQUEST_SIGNAL_STRENGTH = 19 -var RIL_REQUEST_VOICE_REGISTRATION_STATE = 20 -var RIL_REQUEST_DATA_REGISTRATION_STATE = 21 -var RIL_REQUEST_OPERATOR = 22 -var RIL_REQUEST_RADIO_POWER = 23 -var RIL_REQUEST_DTMF = 24 -var RIL_REQUEST_SEND_SMS = 25 -var RIL_REQUEST_SEND_SMS_EXPECT_MORE = 26 -var RIL_REQUEST_SETUP_DATA_CALL = 27 -var RIL_REQUEST_SIM_IO = 28 -var RIL_REQUEST_SEND_USSD = 29 -var RIL_REQUEST_CANCEL_USSD = 30 -var RIL_REQUEST_GET_CLIR = 31 -var RIL_REQUEST_SET_CLIR = 32 -var RIL_REQUEST_QUERY_CALL_FORWARD_STATUS = 33 -var RIL_REQUEST_SET_CALL_FORWARD = 34 -var RIL_REQUEST_QUERY_CALL_WAITING = 35 -var RIL_REQUEST_SET_CALL_WAITING = 36 -var RIL_REQUEST_SMS_ACKNOWLEDGE = 37 -var RIL_REQUEST_GET_IMEI = 38 -var RIL_REQUEST_GET_IMEISV = 39 -var RIL_REQUEST_ANSWER = 40 -var RIL_REQUEST_DEACTIVATE_DATA_CALL = 41 -var RIL_REQUEST_QUERY_FACILITY_LOCK = 42 -var RIL_REQUEST_SET_FACILITY_LOCK = 43 -var RIL_REQUEST_CHANGE_BARRING_PASSWORD = 44 -var RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE = 45 -var RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC = 46 -var RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL = 47 -var RIL_REQUEST_QUERY_AVAILABLE_NETWORKS = 48 -var RIL_REQUEST_DTMF_START = 49 -var RIL_REQUEST_DTMF_STOP = 50 -var RIL_REQUEST_BASEBAND_VERSION = 51 -var RIL_REQUEST_SEPARATE_CONNECTION = 52 -var RIL_REQUEST_SET_MUTE = 53 -var RIL_REQUEST_GET_MUTE = 54 -var RIL_REQUEST_QUERY_CLIP = 55 -var RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE = 56 -var RIL_REQUEST_DATA_CALL_LIST = 57 -var RIL_REQUEST_RESET_RADIO = 58 -var RIL_REQUEST_OEM_HOOK_RAW = 59 -var RIL_REQUEST_OEM_HOOK_STRINGS = 60 -var RIL_REQUEST_SCREEN_STATE = 61 -var RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION = 62 -var RIL_REQUEST_WRITE_SMS_TO_SIM = 63 -var RIL_REQUEST_DELETE_SMS_ON_SIM = 64 -var RIL_REQUEST_SET_BAND_MODE = 65 -var RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE = 66 -var RIL_REQUEST_STK_GET_PROFILE = 67 -var RIL_REQUEST_STK_SET_PROFILE = 68 -var RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND = 69 -var RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE = 70 -var RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM = 71 -var RIL_REQUEST_EXPLICIT_CALL_TRANSFER = 72 -var RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE = 73 -var RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE = 74 -var RIL_REQUEST_GET_NEIGHBORING_CELL_IDS = 75 -var RIL_REQUEST_SET_LOCATION_UPDATES = 76 -var RIL_REQUEST_CDMA_SET_SUBSCRIPTION = 77 -var RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE = 78 -var RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE = 79 -var RIL_REQUEST_SET_TTY_MODE = 80 -var RIL_REQUEST_QUERY_TTY_MODE = 81 -var RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE = 82 -var RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE = 83 -var RIL_REQUEST_CDMA_FLASH = 84 -var RIL_REQUEST_CDMA_BURST_DTMF = 85 -var RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY = 86 -var RIL_REQUEST_CDMA_SEND_SMS = 87 -var RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE = 88 -var RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG = 89 -var RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG = 90 -var RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION = 91 -var RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG = 92 -var RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG = 93 -var RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION = 94 -var RIL_REQUEST_CDMA_SUBSCRIPTION = 95 -var RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM = 96 -var RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM = 97 -var RIL_REQUEST_DEVICE_IDENTITY = 98 -var RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE = 99 -var RIL_REQUEST_GET_SMSC_ADDRESS = 100 -var RIL_REQUEST_SET_SMSC_ADDRESS = 101 -var RIL_REQUEST_REPORT_SMS_MEMORY_STATUS = 102 -var RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING = 103 - -/** - * RIL unsolicited requests - */ -var RIL_UNSOL_RESPONSE_BASE = 1000 -var RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED = 1000 -var RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED = 1001 -var RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED = 1002 -var RIL_UNSOL_RESPONSE_NEW_SMS = 1003 -var RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT = 1004 -var RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM = 1005 -var RIL_UNSOL_ON_USSD = 1006 -var RIL_UNSOL_ON_USSD_REQUEST = 1007 -var RIL_UNSOL_NITZ_TIME_RECEIVED = 1008 -var RIL_UNSOL_SIGNAL_STRENGTH = 1009 -var RIL_UNSOL_DATA_CALL_LIST_CHANGED = 1010 -var RIL_UNSOL_SUPP_SVC_NOTIFICATION = 1011 -var RIL_UNSOL_STK_SESSION_END = 1012 -var RIL_UNSOL_STK_PROACTIVE_COMMAND = 1013 -var RIL_UNSOL_STK_EVENT_NOTIFY = 1014 -var RIL_UNSOL_STK_CALL_SETUP = 1015 -var RIL_UNSOL_SIM_SMS_STORAGE_FULL = 1016 -var RIL_UNSOL_SIM_REFRESH = 1017 -var RIL_UNSOL_CALL_RING = 1018 -var RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED = 1019 -var RIL_UNSOL_RESPONSE_CDMA_NEW_SMS = 1020 -var RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS = 1021 -var RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL = 1022 -var RIL_UNSOL_RESTRICTED_STATE_CHANGED = 1023 -var RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE = 1024 -var RIL_UNSOL_CDMA_CALL_WAITING = 1025 -var RIL_UNSOL_CDMA_OTA_PROVISION_STATUS = 1026 -var RIL_UNSOL_CDMA_INFO_REC = 1027 -var RIL_UNSOL_OEM_HOOK_RAW = 1028 -var RIL_UNSOL_RINGBACK_TONE = 1029 -var RIL_UNSOL_RESEND_INCALL_MUTE = 1030 - -/** - * Control commands in ctrl.proto for control server - */ -var CTRL_CMD_GET_RADIO_STATE = 1 -var CTRL_CMD_SET_RADIO_STATE = 2 - -/** - * Control commands in ctrl.proto that will be dispatched to - * simulatedRadio or simulatedIcc - */ -var CTRL_CMD_DISPATH_BASE = 1000 -var CTRL_CMD_SET_MT_CALL = 1001 -var CTRL_CMD_HANGUP_CONN_REMOTE = 1002 -var CTRL_CMD_SET_CALL_TRANSITION_FLAG = 1003 -var CTRL_CMD_SET_CALL_ALERT = 1004 -var CTRL_CMD_SET_CALL_ACTIVE = 1005 -var CTRL_CMD_ADD_DIALING_CALL = 1006 - -/* status for control commands, defined in ctrl.proto */ -var CTRL_STATUS_OK = 0 -var CTRL_STATUS_ERR = 1 - -/** - * Local requests from simulated_radio or simulated_icc - */ -var CMD_DELAY_TEST = 2000 -var CMD_UNSOL_SIGNAL_STRENGTH = 2001 -var CMD_UNSOL_CALL_STATE_CHANGED = 2002 // Send RIL_UNSOL_CALL_STATE_CHANGED -var CMD_CALL_STATE_CHANGE = 2003 // call state change: dialing->alert->active -var CMD_UNSOL_CALL_RING = 2004 - -/** - * Other variables - */ -var OUTGOING = 0; /* outgoing call */ -var INCOMING = 1; /* incoming call */ diff --git a/mock-ril/src/js/simulated_icc.js b/mock-ril/src/js/simulated_icc.js deleted file mode 100644 index 959031f..0000000 --- a/mock-ril/src/js/simulated_icc.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * 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. - */ - -/** - * Simulated Icc - */ -function Icc() { - - var MCC = '310'; - var MNC = '260'; - var MSN = '123456789'; - var IMEI = '123456789012345'; - var IMEISV = '00'; - - function RilAppStatus(type, state, persoState, aidPtr, appLabelPtr, pin1R, curPin1, curPin2) { - this.appType = type; - this.appState = state; - this.persoSubstate = persoState; - this.aid = aidPtr; - this.appLabel = appLabelPtr; - this.pin1Replaced = pin1R; - this.pin1 = curPin1; - this.pint2 = curPin2; - } - - function RilCardStatus() { - this.cardState = CARDSTATE_PRESENT; - this.universalPinState = PINSTATE_UNKNOWN; - this.gsmUmtsSubscriptionAppIndex = 0; - this.cdmaSubscriptionAppIndex = CARD_MAX_APPS; - this.imsSubscriptionAppIndex = CARD_MAX_APPS; - this.numApplications = 1; - this.applications = new Array(CARD_MAX_APPS); - - // Initialize application status - for (i = 0; i < CARD_MAX_APPS; i++) { - var app = new RilAppStatus(APPTYPE_UNKNOWN, APPSTATE_UNKNOWN, PERSOSUBSTATE_UNKNOWN, - null, null, 0, PINSTATE_UNKNOWN, PINSTATE_UNKNOWN); - this.applications[i] = app; - } - - // set gsm application status. - var gsmApp = new RilAppStatus(APPTYPE_SIM, APPSTATE_READY, PERSOSUBSTATE_READY, null, null, - 0, PINSTATE_UNKNOWN, PINSTATE_UNKNOWN); - this.applications[this.gsmUmtsSubscriptionAppIndex] = gsmApp; - } - - var cardStatus = new RilCardStatus(); - - // The result returned by the request handlers - var result = new Object(); - - this.rilRequestGetSimStatus = function(req) { // 1 - print('Icc: rilRequestGetSimStatus'); - - var rsp = new Object(); - rsp.cardStatus = cardStatus; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspGetSimStatus'].serialize(rsp); - return result; - } - - this.rilRequestEnterSimPin = function(req) { // 2 - print('Icc: rilRequestEnterSimPin req.data.pin=' + req.data.pin); - - var rsp = new Object(); - rsp.retriesRemaining = 3; - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspEnterSimPin'].serialize(rsp); - return result; - } - - this.rilRequestGetImsi = function(req) { // 11 - print('Icc: rilRequestGetImsi'); - - var rsp = new Object(); - rsp.strings = new Array(); - rsp.strings[0] = MCC + MNC + MSN; - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - this.rilRequestOperator = function(req) { // 22 - print('Icc: rilRequestOperator'); - - var rsp = new Object(); - rsp.longAlphaOns = 'Mock-Ril long Alpha Ons'; - rsp.shortAlphaOns = 'Mock-Ril'; - rsp.mccMnc = MCC + MNC; - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspOperator'].serialize(rsp); - return result; - } - - this.rilRequestGetImei = function(req) { // 38 - print('Icc: rilRequestGetImei'); - - var rsp = new Object(); - rsp.strings = new Array(); - rsp.strings[0] = IMEI; - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - this.rilRequestGetImeisv = function(req) { // 39 - print('Icc: rilRequestGetImeisv'); - - var rsp = new Object(); - rsp.strings = new Array(); - rsp.strings[0] = IMEISV; - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - /** - * Process the request - */ - this.process = function(req) { - try { - // print('Icc E: req.reqNum=' + req.reqNum + ' req.token=' + req.token); - - // Assume the result will be true, successful and nothing to return - result.sendResponse = true; - result.rilErrCode = RIL_E_SUCCESS; - result.responseProtobuf = emptyProtobuf; - - try { - result = (this.simDispatchTable[req.reqNum]).call(this, req); - } catch (err) { - print('Icc: Unknown reqNum=' + req.reqNum); - result.rilErrCode = RIL_E_REQUEST_NOT_SUPPORTED; - } - - if (result.sendResponse) { - sendRilRequestComplete(result.rilErrCode, req.reqNum, - req.token, result.responseProtobuf); - } - - // print('Icc X: req.reqNum=' + req.reqNum + ' req.token=' + req.token); - } catch (err) { - print('Icc X: Exception req.reqNum=' + - req.reqNum + ' req.token=' + req.token + ' err=' + err); - } - } - - print('Icc: constructor E'); - this.simDispatchTable = new Array(); - this.simDispatchTable[RIL_REQUEST_GET_SIM_STATUS] = this.rilRequestGetSimStatus; // 1 - this.simDispatchTable[RIL_REQUEST_ENTER_SIM_PIN] = this.rilRequestEnterSimPin; // 2 - this.simDispatchTable[RIL_REQUEST_GET_IMSI] = this.rilRequestGetImsi; // 11 - this.simDispatchTable[RIL_REQUEST_OPERATOR] = this.rilRequestOperator; // 22 - this.simDispatchTable[RIL_REQUEST_GET_IMEI] = this.rilRequestGetImei; // 38 - this.simDispatchTable[RIL_REQUEST_GET_IMEISV] = this.rilRequestGetImeisv; // 39 - print('Icc: constructor X'); -} - -// The simulated sim instance and its associated Worker -var simulatedIcc = new Icc(); -var simulatedIccWorker = new Worker(function (req) { - simulatedIcc.process(req); -}); -simulatedIccWorker.run(); - -/** - * Optional tests - */ -if (false) { - include("simulated_icc_tests.js"); -} diff --git a/mock-ril/src/js/simulated_icc_tests.js b/mock-ril/src/js/simulated_icc_tests.js deleted file mode 100644 index ca685fc..0000000 --- a/mock-ril/src/js/simulated_icc_tests.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 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. - */ - -// TODO: Add tests diff --git a/mock-ril/src/js/simulated_radio.js b/mock-ril/src/js/simulated_radio.js deleted file mode 100644 index 9153694..0000000 --- a/mock-ril/src/js/simulated_radio.js +++ /dev/null @@ -1,1269 +0,0 @@ -/** - * 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. - */ - -/** - * The Radio object contains a set of methods and objects to handle ril request - * which is passed from simulatedRadioWorker queue. The global object initialize - * an instance of Radio object by calling "new Radio". For each ril request, - * rilDispatchTable gets searched and the corresponding method is called. - * Extra requests are also defined to process unsolicited rerequests. - * - * The rilDispatchTable is an array indexed by RIL_REQUEST_* or REQUEST_UNSOL_*, - * in which each request corresponds to a functions defined in the Radio object. - * We need to pay attention when using "this" within those functions. When they are - * called in "this.process" using - * result = this.radioDispatchTable[req.reqNum])(req); - * this scope of "this" within those functions are the radioDispatchTable, not the - * object that "this.process" belongs to. Using "this." to access other - * functions in the object may cause trouble. - * To avoid that, the object is passed in when those functions are called as - * shown in the following: - * result = (this.radioDispatchTable[req.reqNum]).call(this, req); - */ - -/** - * Set radio state - */ -function setRadioState(newState) { - newRadioState = newState; - if (typeof newState == 'string') { - newRadioState = globals[newState]; - if (typeof newRadioState == 'undefined') { - throw('setRadioState: Unknow string: ' + newState); - } - } - if ((newRadioState < RADIOSTATE_OFF) || (newRadioState > RADIOSTATE_NV_READY)) { - throw('setRadioState: newRadioState: ' + newRadioState + ' is invalid'); - } - gRadioState = newRadioState; - sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED); -} - -/** - * Create a call. - * - * @return a RilCall - */ -function RilCall(state, phoneNumber, callerName) { - this.state = state; - this.index = 0; - this.toa = 0; - this.isMpty = false; - this.isMt = false; - this.als = 0; - this.isVoice = true; - this.isVoicePrivacy = false; - this.number = phoneNumber; - this.numberPresentation = 0; - this.name = callerName; -} - -/** - * Simulated Radio - */ -function Radio() { - var registrationState = '1'; - var lac = '0'; - var cid = '0'; - var radioTechnology = '3'; - var baseStationId = NULL_RESPONSE_STRING; - var baseStationLatitude = NULL_RESPONSE_STRING; - var baseStationLongitude = NULL_RESPONSE_STRING; - var concurrentServices = NULL_RESPONSE_STRING; - var systemId = NULL_RESPONSE_STRING; - var networkId = NULL_RESPONSE_STRING; - var roamingIndicator = NULL_RESPONSE_STRING; - var prlActive = NULL_RESPONSE_STRING; - var defaultRoamingIndicator = NULL_RESPONSE_STRING; - var registrationDeniedReason = NULL_RESPONSE_STRING; - var primaryScrambingCode = NULL_RESPONSE_STRING; - - var NETWORK_SELECTION_MODE_AUTOMATIC = 0; - var NETWORK_SELECTION_MODE_MANUAL = 1; - var networkSelectionMode = NETWORK_SELECTION_MODE_AUTOMATIC; - - var muteState = 0; // disable mute - - // Number of active calls in calls - var numberActiveCalls = 0; - - // Maximum number of active calls - var maxNumberActiveCalls = 7; - var maxConnectionsPerCall = 5; // only 5 connections allowed per call - - // Flag to denote whether an incoming/waiting call is answered - var incomingCallIsProcessed = false; - - // Call transition flag - var callTransitionFlag = false; // default to auto-transition - - var lastCallFailCause = 0; - - // Array of "active" calls - var calls = Array(maxNumberActiveCalls + 1); - - // The result returned by the request handlers - var result = new Object(); - - function GWSignalStrength() { - this.signalStrength = 10; // 10 * 2 + (-113) = -93dBm, make it three bars - this.bitErrorRate = 0; - } - - function CDMASignalStrength() { - this.dbm = -1; - this.ecio = -1; - } - - function EVDOSignalStrength() { - this.dbm = -1; - this.ecio = -1; - this.signalNoiseRatio = 0; - } - - function LTESignalStrength() { - this.signalStrength = -1; - this.rsrp = 0; - this.rsrq = 0; - this.rssnr = 0; - this.cqi = 0; - } - - var gwSignalStrength = new GWSignalStrength; - var cdmaSignalStrength = new CDMASignalStrength(); - var evdoSignalStrength = new EVDOSignalStrength(); - var lteSignalStrength = new LTESignalStrength(); - - /** - * The the array of calls, this is a sparse - * array and some elements maybe 'undefined'. - * - * @return Array of RilCall's - */ - this.getCalls = function() { - return calls; - } - - /** - * @return the RilCall at calls[index] or null if undefined. - */ - this.getCall = function(index) { - var c = null; - try { - c = calls[index]; - if (typeof c == 'undefined') { - c = null; - } - } catch (err) { - c = null; - } - return c; - } - - /** - * @return the first call that is in the given state - */ - this.getCallIdByState = function(callState) { - if ((callState < CALLSTATE_ACTIVE) || (callState > CALLSTATE_WAITING)) { - return null; - } - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if (calls[i].state == callState) { - return i; - } - } - } - return null; - } - - /** Add an active call - * - * @return a RilCall or null if too many active calls. - */ - this.addCall = function(state, phoneNumber, callerName) { - print('Radio: addCall'); - var c = null; - if (numberActiveCalls < maxNumberActiveCalls) { - numberActiveCalls += 1; - c = new RilCall(state, phoneNumber, callerName); - // call index should fall in the closure of [1, 7] - // Search for an "undefined" element in the array and insert the call - for (var i = 1; i < (maxNumberActiveCalls + 1); i++) { - print('Radio: addCall, i=' + i); - if (typeof calls[i] == 'undefined') { - print('Radio: addCall, calls[' + i + '] is undefined'); - c.index = i; - calls[i] = c; - break; - } - } - this.printCalls(calls); - } - return c; - } - - /** - * Remove the call, does nothing if the call is undefined. - * - * @param index into calls to remove. - * @return the call removed or null if did not exist - */ - this.removeCall = function(index) { - var c = null; - if ((numberActiveCalls > 0) - && (index < calls.length) - && (typeof calls[index] != 'undefined')) { - c = calls[index]; - delete calls[index]; - numberActiveCalls -= 1; - if (numberActiveCalls == 0) { - calls = new Array(); - } - } else { - c = null; - } - return c; - } - - /** - * Print the call - * - * @param c is the RilCall to print - */ - this.printCall = function(c) { - if ((c != null) && (typeof c != 'undefined')) { - print('c[' + c.index + ']: index=' + c.index + ' state=' + c.state + - ' number=' + c.number + ' name=' + c.name); - } - } - - /** - * Print all the calls. - * - * @param callArray is an Array of RilCall's - */ - this.printCalls = function(callArray) { - if (typeof callArray == 'undefined') { - callArray = calls; - } - print('callArray.length=' + callArray.length); - for (var i = 0; i < callArray.length; i++) { - if ((callArray[i] == null) || (typeof callArray[i] == 'undefined')) { - print('c[' + i + ']: undefined'); - } else { - this.printCall(callArray[i]); - } - } - } - - /** - * Count number of calls in the given state - * - * @param callState is the give state - */ - this.countCallsInState = function(callState) { - var count = 0; - if ((callState < CALLSTATE_ACTIVE) || (callState > CALLSTATE_WAITING)) { - // not a valid call state - return null; - } - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if (calls[i].state == callState) { - count++; - } - } - } - return count; - } - - /** - * Print signal strength - */ - this.printSignalStrength = function() { - print('rssi: ' + gwSignalStrength.signalStrength); - print('bitErrorRate: ' + gwSignalStrength.bitErrorRate); - print('cdmaDbm: ' + cdmaSignalStrength.dbm); - print('cdmaEcio: ' + cdmaSignalStrength.ecio); - print('evdoRssi: ' + evdoSignalStrength.dbm); - print('evdoEcio: ' + evdoSignalStrength.ecio); - print('evdoSnr: ' + evdoSignalStrength.signalNoiseRatio); - print('lteRssi: ' + lteSignalStrength.signalStrength); - print('lteRsrp: ' + lteSignalStrength.rsrp); - print('lteRsrq: ' + lteSignalStrength.rsrq); - print('lteRssnr: ' + lteSignalStrength.rssnr); - print('lteCqi: ' + lteSignalStrength.cqi); - } - - /** - * set signal strength - * - * @param rssi and bitErrorRate are signal strength parameters for GSM - * cdmaDbm, cdmaEcio, evdoRssi, evdoEcio, evdoSnr are parameters for CDMA & EVDO - */ - this.setSignalStrength = function(rssi, bitErrorRate, cdmaDbm, cdmaEcio, evdoRssi, - evdoEcio, evdoSnr, lteSigStrength, lteRsrp, - lteRsrq, lteRssnr, lteCqi) { - print('setSignalStrength E'); - - if (rssi != 99) { - if ((rssi < 0) || (rssi > 31)) { - throw ('not a valid signal strength'); - } - } - // update signal strength - gwSignalStrength.signalStrength = rssi; - gwSignalStrength.bitErrorRate = bitErrorRate; - cdmaSignalStrength.dbm = cdmaDbm; - cdmaSignalStrength.ecio = cdmaEcio; - evdoSignalStrength.dbm = evdoRssi; - evdoSignalStrength.ecio = evdoEcio; - evdoSignalStrength.signalNoiseRatio = evdoSnr; - lteSignalStrength.signalStrength = lteSigStrength; - lteSignalStrength.rsrp = lteRsrp; - lteSignalStrength.rsrq = lteRsrq; - lteSignalStrength.rssnr = lteRssnr; - lteSignalStrength.cqi = lteCqi; - - // pack the signal strength into RspSignalStrength and send a unsolicited response - var rsp = new Object(); - - rsp.gwSignalstrength = gwSignalStrength; - rsp.cdmSignalstrength = cdmaSignalStrength; - rsp.evdoSignalstrength = evdoSignalStrength; - rsp.lteSignalstrength = lteSignalStrength; - - var response = rilSchema[packageNameAndSeperator + - 'RspSignalStrength'].serialize(rsp); - - sendRilUnsolicitedResponse(RIL_UNSOL_SIGNAL_STRENGTH, response); - - // send the unsolicited signal strength every 1 minute. - simulatedRadioWorker.addDelayed( - {'reqNum' : CMD_UNSOL_SIGNAL_STRENGTH}, 60000); - print('setSignalStrength X'); - } - - /** - * Handle RIL_REQUEST_GET_CURRENT_CALL - * - * @param req is the Request - */ - this.rilRequestGetCurrentCalls = function(req) { // 9 - print('Radio: rilRequestGetCurrentCalls E'); - var rsp = new Object(); - - // pack calls into rsp.calls - rsp.calls = new Array(); - var i; - var j; - for (i = 0, j = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - rsp.calls[j++] = calls[i]; - } - } - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspGetCurrentCalls'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_DIAL - * - * @param req is the Request - */ - this.rilRequestDial = function(req) { // 10 - print('Radio: rilRequestDial E'); - var newCall = new Object(); - newCall = this.addCall(CALLSTATE_DIALING, req.data.address, ''); - if (newCall == null) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } - this.printCalls(calls); - - print('after add the call'); - // Set call state to dialing - simulatedRadioWorker.add( - {'reqNum' : CMD_CALL_STATE_CHANGE, - 'callType' : OUTGOING, - 'callIndex' : newCall.index, - 'nextState' : CALLSTATE_DIALING}); - if (!callTransitionFlag) { - // for auto transition - // Update call state to alerting after 1 second - simulatedRadioWorker.addDelayed( - {'reqNum' : CMD_CALL_STATE_CHANGE, - 'callType' : OUTGOING, - 'callIndex' : newCall.index, - 'nextState' : CALLSTATE_ALERTING}, 1000); - // Update call state to active after 2 seconds - simulatedRadioWorker.addDelayed( - {'reqNum' : CMD_CALL_STATE_CHANGE, - 'callType' : OUTGOING, - 'callIndex': newCall.index, - 'nextState' : CALLSTATE_ACTIVE}, 2000); - } - return result; - } - - /** - * Handle RIL_REQUEST_HANG_UP - * - * @param req is the Request - */ - this.rilRequestHangUp = function(req) { // 12 - print('Radio: rilRequestHangUp data.connection_index=' + req.data.connectionIndex); - if (this.removeCall(req.data.connectionIndex) == null) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - print('no connection to hangup'); - } - return result; - } - - /** - * Handle RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND - * Hang up waiting or held - * - * @param req is the Request - */ - this.rilRequestHangupWaitingOrBackground = function(req) { // 13 - print('Radio: rilRequestHangupWaitingOrBackground'); - if (numberActiveCalls <= 0) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - } else { - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - switch (calls[i].state) { - case CALLSTATE_HOLDING: - case CALLSTATE_WAITING: - case CALLSTATE_INCOMING: - this.removeCall(i); - incomingCallIsProcessed = true; - break; - default: - result.rilErrCode = RIL_E_GENERIC_FAILURE; - break; - } - this.printCalls(calls); - if(result.rilErrCode == RIL_E_GENERIC_FAILURE) { - return result; - } - } // end of processing call[i] - } // end of for - } - // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - return result; - } - - /** - * Handle RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND - * release all active calls (if any exist) and resume held or waiting calls. - * @param req is the Request - */ - this.rilRequestHangUpForegroundResumeBackground = function(req) { //14 - print('Radio: rilRequestHangUpForegroundResumeBackground'); - if (numberActiveCalls <= 0) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - } else { - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - switch (calls[i].state) { - case CALLSTATE_ACTIVE: - this.removeCall(i); - break; - case CALLSTATE_HOLDING: - case CALLSTATE_WAITING: - calls[i].state = CALLSTATE_ACTIVE; - break; - default: - result.rilErrCode = RIL_E_GENERIC_FAILURE; - break; - } - this.printCalls(calls); - if(result.rilErrCode == RIL_E_GENERIC_FAILURE) { - return result; - } - } // end of processing call[i] - } - } - // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - return result; - } - - /** - * Handle RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE - * - * BEFORE AFTER - * Call 1 Call 2 Call 1 Call 2 - * ACTIVE HOLDING HOLDING ACTIVE - * ACTIVE WAITING HOLDING ACTIVE - * HOLDING WAITING HOLDING ACTIVE - * ACTIVE IDLE HOLDING IDLE - * IDLE IDLE IDLE IDLE - * - * @param req is the Request - */ - this.rilRequestSwitchWaitingOrHoldingAndActive = function(req) { // 15 - print('Radio: rilRequestSwitchWaitingOrHoldingAndActive'); - print('Radio: lastReq = ' + lastReq); - print('Radio: req.reqNum = ' + req.reqNum); - if (lastReq == req.reqNum) { - print('Radio: called twice'); - return result; - } - - if (numberActiveCalls <= 0) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - } else { - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - switch (calls[i].state) { - case CALLSTATE_ACTIVE: - calls[i].state = CALLSTATE_HOLDING; - break; - case CALLSTATE_HOLDING: - case CALLSTATE_WAITING: - calls[i].state = CALLSTATE_ACTIVE; - break; - default: - result.rilErrCode = RIL_E_GENERIC_FAILURE; - break; - } - this.printCalls(calls); - if(result.rilErrCode == RIL_E_GENERIC_FAILURE) { - return result; - } - } // end of processing call[i] - } // end of for - } - // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - return result; - } - - /** - * Handle RIL_REQUEST_CONFERENCE - * Conference holding and active - * - * @param req is the Request - */ - this.rilRequestConference = function(req) { // 16 - print('Radio: rilRequestConference E'); - if ((numberActiveCalls <= 0) || (numberActiveCalls > maxConnectionsPerCall)) { - // The maximum number of connections within a call is 5 - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } else { - var numCallsInBadState = 0; - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if ((calls[i].state != CALLSTATE_ACTIVE) && - (calls[i].state != CALLSTATE_HOLDING)) { - numCallsInBadState++; - } - } - } - - // if there are calls not in ACITVE or HOLDING state, return error - if (numCallsInBadState > 0) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } else { // conference ACTIVE and HOLDING calls - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - switch (calls[i].state) { - case CALLSTATE_ACTIVE: - break; - case CALLSTATE_HOLDING: - calls[i].state = CALLSTATE_ACTIVE; - break; - default: - result.rilErrCode = RIL_E_GENERIC_FAILURE; - break; - } - } - this.printCalls(calls); - if(result.rilErrCode == RIL_E_GENERIC_FAILURE) { - return result; - } - } - } - } - - // Only if conferencing is successful, - // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - return result; - } - - /** - * Handle RIL_REQUEST_LAST_CALL_FAIL_CAUSE - * - * @param req is the request - */ - this.rilRequestLastCallFailCause = function(req) { - print('Radio: rilRequestLastCallFailCause E'); - - var rsp = new Object(); - rsp.integers = new Array(); - rsp.integers[0] = lastCallFailCause; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspIntegers'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_SIGNAL_STRENGTH - * - * @param req is the Request - */ - this.rilRequestSignalStrength = function(req) { // 19 - print('Radio: rilRequestSignalStrength E'); - var rsp = new Object(); - - // pack the signal strength into RspSignalStrength - rsp.gwSignalstrength = gwSignalStrength; - rsp.cdmaSignalstrength = cdmaSignalStrength; - rsp.evdoSignalstrength = evdoSignalStrength; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspSignalStrength'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_VOICE_REGISTRATION_STATE - * - * @param req is the Request - */ - this.rilRequestVoiceRegistrationState = function(req) { // 20 - print('Radio: rilRequestVoiceRegistrationState'); - - var rsp = new Object(); - rsp.strings = Array(); - rsp.strings[0] = registrationState; - rsp.strings[1] = lac; - rsp.strings[2] = cid; - rsp.strings[3] = radioTechnology; - rsp.strings[4] = baseStationId; - rsp.strings[5] = baseStationLatitude; - rsp.strings[6] = baseStationLongitude; - rsp.strings[7] = concurrentServices; - rsp.strings[8] = systemId; - rsp.strings[9] = networkId; - rsp.strings[10] = roamingIndicator; - rsp.strings[11] = prlActive; - rsp.strings[12] = defaultRoamingIndicator; - rsp.strings[13] = registrationDeniedReason; - rsp.strings[14] = primaryScrambingCode; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_DATA_REGISTRATION_STATE - * - * @param req is the Request - */ - this.rilRequestDataRegistrationState = function(req) { // 21 - print('Radio: rilRequestDataRegistrationState'); - - var rsp = new Object(); - rsp.strings = Array(); - rsp.strings[0] = registrationState; - rsp.strings[1] = lac; - rsp.strings[2] = cid; - rsp.strings[3] = radioTechnology; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_ANSWER - * - * @param req is the Request - */ - this.rilRequestAnswer = function(req) { // 40 - print('Radio: rilRequestAnswer'); - - if (numberActiveCalls != 1) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } else { - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if (calls[i].state == CALLSTATE_INCOMING) { - calls[i].state = CALLSTATE_ACTIVE; - break; - } else { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - this.removeCall(i); - return result; - } - } // end of processing call[i] - } // end of for - } - incomingCallIsProcessed = true; - return result; - } - - /** - * Handle RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE - * - * @param req is the Request - */ - this.rilRequestQueryNeworkSelectionMode = function(req) { // 45 - print('Radio: rilRequestQueryNeworkSelectionMode'); - - var rsp = new Object(); - rsp.integers = Array(); - rsp.integers[0] = networkSelectionMode; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspIntegers'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC - * - * @param req is the Request - */ - this.rilRequestSetNeworkSelectionAutomatic = function(req) { // 46 - print('Radio: rilRequestSetNeworkSelectionAutomatic'); - - networkSelectionMode = NETWORK_SELECTION_MODE_AUTOMATIC; - - return result; - } - - /** - * Handle RIL_REQUEST_BASE_BAND_VERSION - * - * @param req is the Request - */ - this.rilRequestBaseBandVersion = function(req) { // 51 - print('Radio: rilRequestBaseBandVersion'); - var rsp = new Object(); - rsp.strings = Array(); - rsp.strings[0] = gBaseBandVersion; - - result.responseProtobuf = rilSchema[packageNameAndSeperator + - 'RspStrings'].serialize(rsp); - return result; - } - - /** - * Handle RIL_REQUEST_SEPRATE_CONNECTION - * Separate a party from a multiparty call placing the multiparty call - * (less the specified party) on hold and leaving the specified party - * as the only other member of the current (active) call - * - * See TS 22.084 1.3.8.2 (iii) - * - * @param req is the Request - */ - this.rilReqestSeparateConnection = function(req) { // 52 - print('Radio: rilReqestSeparateConnection'); - var index = req.data.index; - - if (numberActiveCalls <= 0) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } else { - // get the connection to separate - var separateConn = this.getCall(req.data.index); - if (separateConn == null) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } else { - if (separateConn.state != CALLSTATE_ACTIVE) { - result.rilErrCode = RIL_E_GENERIC_FAILURE; - return result; - } - // Put all other connections in hold. - for (var i = 0; i < calls.length; i++) { - if (index != i) { - // put all the active call to hold - if (typeof calls[i] != 'undefined') { - switch (calls[i].state) { - case CALLSTATE_ACTIVE: - calls[i].state = CALLSTATE_HOLDING; - break; - default: - result.rilErrCode = RIL_E_GENERIC_FAILURE; - break; - } - this.printCalls(calls); - if(result.rilErrCode == RIL_E_GENERIC_FAILURE) { - return result; - } - } // end of processing call[i] - } - } // end of for - } - } - - // Send out RIL_UNSOL_CALL_STATE_CHANGED after the request is returned - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - return result; - } - - /** - * Handle RIL_REQUEST_SET_MUTE - */ - this.rilRequestSetMute = function(req) { // 53 - print('Radio: rilRequestSetMute: req.data.state=' + req.data.state); - muteState = req.data.state; - if (gRadioState == RADIOSTATE_UNAVAILABLE) { - result.rilErrCode = RIL_E_RADIO_NOT_AVAILABLE; - } - return result; - } - - /** - * Handle RIL_REQUEST_SCREEN_STATE - * - * @param req is the Request - */ - this.rilRequestScreenState = function(req) { // 61 - print('Radio: rilRequestScreenState: req.data.state=' + req.data.state); - screenState = req.data.state; - return result; - } - - /** - * Delay test - */ - this.cmdDelayTest = function(req) { // 2000 - print('cmdDelayTest: req.hello=' + req.hello); - result.sendResponse = false; - return result; - } - - /** - * Delay for RIL_UNSOL_SIGNAL_STRENGTH - * TODO: Simulate signal strength changes: - * Method 1: provide an array for signal strength, and send the unsolicited - * reponse periodically (the period can also be simulated) - * Method 2: Simulate signal strength randomly (within a certain range) and - * send the response periodically. - */ - this.cmdUnsolSignalStrength = function(req) { // 2001 - print('cmdUnsolSignalStrength: req.reqNum=' + req.reqNum); - var rsp = new Object(); - - // pack the signal strength into RspSignalStrength - rsp.gwSignalstrength = gwSignalStrength; - rsp.cdmaSignalstrength = cdmaSignalStrength; - rsp.evdoSignalstrength = evdoSignalStrength; - - response = rilSchema[packageNameAndSeperator + - 'RspSignalStrength'].serialize(rsp); - - // upldate signal strength - sendRilUnsolicitedResponse(RIL_UNSOL_SIGNAL_STRENGTH, response); - - // Send the unsolicited signal strength every 1 minute. - simulatedRadioWorker.addDelayed( - {'reqNum' : CMD_UNSOL_SIGNAL_STRENGTH}, 60000); - - // this is not a request, no response is needed - result.sendResponse = false; - return result; - } - - /** - * Send RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED - */ - this.cmdUnsolCallStateChanged = function(req) { // 2002 - print('cmdUnsolCallStateChanged: req.reqNum=' + req.reqNum); - sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED); - result.sendResponse = false; - return result; - } - - /** - * Simulate call state change - */ - this.cmdCallStateChange = function(req) { // 2003 - print('cmdCallStateChange: req.reqNum=' + req.reqNum); - print('cmdCallStateChange: req.callType=' + req.callType); - print('cmdCallStateChange: req.callIndex=' + req.callIndex); - print('cmdCallStateChange: req.nextState=' + req.nextState); - - // if it is an outgoing call, update the call state of the call - // Send out call state changed flag - var curCall = this.getCall(req.callIndex); - this.printCall(curCall); - - if (curCall != null) { - curCall.state = req.nextState; - } else { - this.removeCall(req.callIndex); - } - - // TODO: if it is an incoming call, update the call state of the call - // Send out call state change flag - // Send out RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - result.sendResponse = false; - return result; - } - - /** - * send UNSOL_CALL_STATE_CHANGED and UNSOL_CALL_RING - */ - this.cmdUnsolCallRing = function(req) { // 2004 - print('cmdUnsolCallRing: req.reqNum=' + req.reqNum); - if(!incomingCallIsProcessed) { - sendRilUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED); - sendRilUnsolicitedResponse(RIL_UNSOL_CALL_RING); - - // Send the next alert in 3 seconds. [refer to ril.h definition] - simulatedRadioWorker.addDelayed( - {'reqNum' : CMD_UNSOL_CALL_RING}, 3000); - } - result.sendResponse = false; - return result; - } - - /** - * Create an incoming call for the giving number - * return CTRL_STATUS_ERR if there is already a call in any of the states of - * dialing, alerting, incoming, waiting [TS 22 030 6.5] , else - * return CTRL_STATUS_OK and update the call state - */ - this.ctrlServerCmdStartInComingCall = function(req) { // 1001 - print('ctrlServerCmdStartInComingCall: req.reqNum:' + req.reqNum); - print('ctrlServerCmdStartInComingCall: req.data.phonenumber:' + req.data.phoneNumber); - - var phoneNumber = req.data.phoneNumber; - var state; - - if (numberActiveCalls <= 0) { - // If there is no connection in use, the call state is INCOMING - state = CALLSTATE_INCOMING; - } else { - // If there is call in any of the states of dialing, alerting, incoming - // waiting, this MT call can not be set - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if ( (calls[i].state == CALLSTATE_DIALING) || - (calls[i].state == CALLSTATE_ALERTING) || - (calls[i].state == CALLSTATE_INCOMING) || - (calls[i].state == CALLSTATE_WAITING)) - { - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - } - } - // If the incoming call is a second call, the state is WAITING - state = CALLSTATE_WAITING; - } - - // Add call to the call array - this.addCall(state, phoneNumber, ''); - - // set the incomingCallIsProcessed flag to be false - incomingCallIsProcessed = false; - - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_RING}); - - result.rilErrCode = CTRL_STATUS_OK; - return result; - } - - /** - * Handle control command CTRL_CMD_HANGUP_CONN_REMOTE - * hangup the connection for the given failure cause - * - *@param req is the control request - */ - this.ctrlServerCmdHangupConnRemote = function(req) { // 1002 - print('ctrlServerCmdHangupConnRemote: req.data.connectionId=' + req.data.connectionId + - ' req.data.callFailCause' + req.data.callFailCause); - - var connection = req.data.connectionId; - var failureCause = req.data.callFailCause; - - this.printCalls(calls); - var hangupCall = this.removeCall(connection); - if (hangupCall == null) { - print('ctrlServerCmdHangupConnRemote: connection id is required.'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } else { - // for incoming call, stop sending call ring - if ((hangupCall.state == CALLSTATE_INCOMING) || - (hangupCall.state == CALLSTATE_WAITING)) { - incomingCallIsProcessed = true; - } - } - this.printCalls(calls); - lastCallFailCause = failureCause; - - // send out call state changed response - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - - result.rilErrCode = CTRL_STATUS_OK; - return result; - } - - /** - * Set call transition flag - */ - this.ctrlServerCmdSetCallTransitionFlag = function(req) { // 1003 - print('ctrlServerCmdSetCallTransitionFlag: flag=' + req.data.flag); - - callTransitionFlag = req.data.flag; - result.rilErrCode = CTRL_STATUS_OK; - return result; - } - - /** - * Set the dialing call to alert - */ - this.ctrlServerCmdSetCallAlert = function(req) { // 1004 - print('ctrlServerCmdSetCallAlert: E'); - - if (callTransitionFlag == false) { - print('ctrlServerCmdSetCallAlert: need to set the flag first'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - if (numberActiveCalls <= 0) { - print('ctrlServerCmdSetCallAlert: no active calls'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - var dialingCalls = this.countCallsInState(CALLSTATE_DIALING); - var index = this.getCallIdByState(CALLSTATE_DIALING); - if ((dialingCalls == 1) && (index != null)) { - calls[index].state = CALLSTATE_ALERTING; - } else { - // if there 0 or more than one call in dialing state, return error - print('ctrlServerCmdSetCallAlert: no valid calls in dialing state'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - // send unsolicited call state change response - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - - result.rilErrCode = CTRL_STATUS_OK; - return result; - } - - /** - * Set the alserting call to active - */ - this.ctrlServerCmdSetCallActive = function(req) { // 1005 - print('ctrlServerCmdSetCallActive: E'); - - if (callTransitionFlag == false) { - print('ctrlServerCmdSetCallActive: need to set the flag firt'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - if (numberActiveCalls <= 0) { - print('ctrlServerCmdSetCallActive: no active calls'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - var alertingCalls = this.countCallsInState(CALLSTATE_ALERTING); - var index = this.getCallIdByState(CALLSTATE_ALERTING); - if ((alertingCalls == 1) && (index != null)) { - calls[index].state = CALLSTATE_ACTIVE; - } else { - print('ctrlServerCmdSetCallActive: no valid calls in alert state'); - result.rilErrCode = CTRL_STATUS_ERR; - return result; - } - // send out unsolicited call state change response - simulatedRadioWorker.add( - {'reqNum' : CMD_UNSOL_CALL_STATE_CHANGED}); - - result.rilErrCode = CTRL_STATUS_OK; - return result; - } - - /** - * Add a dialing call - */ - this.ctrlServerCmdAddDialingCall = function(req) { // 1006 - print('ctrlServerCmdAddDialingCall: E'); - - var phoneNumber = req.data.phoneNumber; - var dialingCalls = this.countCallsInState(CALLSTATE_DIALING); - if (dialingCalls == 0) { - this.addCall(CALLSTATE_DIALING, phoneNumber, ''); - result.rilErrCode = CTRL_STATUS_OK; - } else { - print('ctrlServerCmdAddDialingCall: add dialing call failed'); - result.rilErrCode = CTRL_STATUS_ERR; - } - return result; - } - - /** - * Process the request by dispatching to the request handlers - */ - this.process = function(req) { - try { - print('Radio E: req.reqNum=' + req.reqNum + ' req.token=' + req.token); - - // Assume the result will be true, successful and nothing to return - result.sendResponse = true; - result.rilErrCode = RIL_E_SUCCESS; - result.responseProtobuf = emptyProtobuf; - - try { - // Pass "this" object to each ril request call such that - // they have the same scope - result = (this.radioDispatchTable[req.reqNum]).call(this, req); - } catch (err) { - print('Radio:process err = ' + err); - print('Radio: Unknown reqNum=' + req.reqNum); - result.rilErrCode = RIL_E_REQUEST_NOT_SUPPORTED; - } - - if (req.reqNum < 200) { - lastReq = req.reqNum; - } - if (result.sendResponse) { - if (isCtrlServerDispatchCommand(req.reqNum)) { - //print('Command ' + req.reqNum + ' is a control server command'); - sendCtrlRequestComplete(result.rilErrCode, req.reqNum, - req.token, result.responseProtobuf); - } else { - //print('Request ' + req.reqNum + ' is a ril request'); - sendRilRequestComplete(result.rilErrCode, req.reqNum, - req.token, result.responseProtobuf); - } - } - //print('Radio X: req.reqNum=' + req.reqNum + ' req.token=' + req.token); - } catch (err) { - print('Radio: Exception req.reqNum=' + - req.reqNum + ' req.token=' + req.token + ' err=' + err); - } - } - - /** - * Construct the simulated radio - */ - print('Radio: constructor E'); - this.radioDispatchTable = new Array(); - this.radioDispatchTable[RIL_REQUEST_GET_CURRENT_CALLS] = // 9 - this.rilRequestGetCurrentCalls; - this.radioDispatchTable[RIL_REQUEST_DIAL] = // 10 - this.rilRequestDial; - this.radioDispatchTable[RIL_REQUEST_HANGUP] = // 12 - this.rilRequestHangUp; - this.radioDispatchTable[RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND] = // 13 - this.rilRequestHangupWaitingOrBackground; - this.radioDispatchTable[RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND] = // 14 - this.rilRequestHangUpForegroundResumeBackground; - this.radioDispatchTable[RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE] = // 15 - this.rilRequestSwitchWaitingOrHoldingAndActive; - this.radioDispatchTable[RIL_REQUEST_CONFERENCE] = // 16 - this.rilRequestConference; - this.radioDispatchTable[RIL_REQUEST_LAST_CALL_FAIL_CAUSE] = // 18 - this.rilRequestLastCallFailCause; - this.radioDispatchTable[RIL_REQUEST_SIGNAL_STRENGTH] = // 19 - this.rilRequestSignalStrength; - this.radioDispatchTable[RIL_REQUEST_VOICE_REGISTRATION_STATE] = // 20 - this.rilRequestVoiceRegistrationState; - this.radioDispatchTable[RIL_REQUEST_DATA_REGISTRATION_STATE] = // 21 - this.rilRequestDataRegistrationState; - this.radioDispatchTable[RIL_REQUEST_ANSWER] = // 40 - this.rilRequestAnswer; - this.radioDispatchTable[RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE] = // 45 - this.rilRequestQueryNeworkSelectionMode; - this.radioDispatchTable[RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = // 46 - this.rilRequestSetNeworkSelectionAutomatic; - this.radioDispatchTable[RIL_REQUEST_BASEBAND_VERSION] = // 51 - this.rilRequestBaseBandVersion; - this.radioDispatchTable[RIL_REQUEST_SEPARATE_CONNECTION] = // 52 - this.rilReqestSeparateConnection; - this.radioDispatchTable[RIL_REQUEST_SET_MUTE] = // 53 - this.rilRequestSetMute; - this.radioDispatchTable[RIL_REQUEST_SCREEN_STATE] = // 61 - this.rilRequestScreenState; - - this.radioDispatchTable[CTRL_CMD_SET_MT_CALL] = //1001 - this.ctrlServerCmdStartInComingCall; - this.radioDispatchTable[CTRL_CMD_HANGUP_CONN_REMOTE] = //1002 - this.ctrlServerCmdHangupConnRemote; - this.radioDispatchTable[CTRL_CMD_SET_CALL_TRANSITION_FLAG] = //1003 - this.ctrlServerCmdSetCallTransitionFlag; - this.radioDispatchTable[CTRL_CMD_SET_CALL_ALERT] = // 1004 - this.ctrlServerCmdSetCallAlert; - this.radioDispatchTable[CTRL_CMD_SET_CALL_ACTIVE] = // 1005 - this.ctrlServerCmdSetCallActive; - this.radioDispatchTable[CTRL_CMD_ADD_DIALING_CALL] = // 1006 - this.ctrlServerCmdAddDialingCall; - - this.radioDispatchTable[CMD_DELAY_TEST] = // 2000 - this.cmdDelayTest; - this.radioDispatchTable[CMD_UNSOL_SIGNAL_STRENGTH] = // 2001 - this.cmdUnsolSignalStrength; - this.radioDispatchTable[CMD_UNSOL_CALL_STATE_CHANGED] = // 2002 - this.cmdUnsolCallStateChanged; - this.radioDispatchTable[CMD_CALL_STATE_CHANGE] = //2003 - this.cmdCallStateChange; - this.radioDispatchTable[CMD_UNSOL_CALL_RING] = //2004 - this.cmdUnsolCallRing; - - print('Radio: constructor X'); -} - -// The simulated radio instance and its associated Worker -var simulatedRadio = new Radio(); -var simulatedRadioWorker = new Worker(function (req) { - simulatedRadio.process(req); -}); -simulatedRadioWorker.run(); - -// TODO: this is a workaround for bug http://b/issue?id=3001613 -// When adding a new all, two RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE -// will be sent from the framework. -var lastReq = 0; - -/** - * Optional tests - */ -if (false) { - include("simulated_radio_tests.js"); -} diff --git a/mock-ril/src/js/simulated_radio_tests.js b/mock-ril/src/js/simulated_radio_tests.js deleted file mode 100644 index 497767b..0000000 --- a/mock-ril/src/js/simulated_radio_tests.js +++ /dev/null @@ -1,425 +0,0 @@ -/** - * 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. - */ - -/** - * TODO:update tests in the format of test incoming call - * Have a global counter to count passes and failures - */ -/** - * A test to test set signal strength - */ -if (false) { - function testSetSignalStrength() { - print('testSetSignalStrength E:'); - simulatedRadio.printSignalStrength(); - try { - simulatedRadio.setSignalStrength(0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - } catch (err) { - print('test failed'); - } - simulatedRadio.printSignalStrength(); - try { - simulatedRadio.setSignalStrength(60, 30, 29 , 28, 27, 26, 25, 24, 23, 22, 21, 20); - } catch (err) { - print('test success: ' + err); - } - simulatedRadio.printSignalStrength(); - } - testSetSignalStrength(); -} - -/** - * TODO: A test for RIL_REQUEST_GET_CURRENT_CALLS, - * remove when satisfied all is well. - */ -if (false) { - var calls = simulatedRadio.getCalls(); - - function testCalls() { - print('testCalls E:'); - var c0 = simulatedRadio.addCall(CALLSTATE_ACTIVE, '16502859848', 'w'); - simulatedRadio.printCalls(); - var c1 = simulatedRadio.addCall(CALLSTATE_ACTIVE, '16502583456', 'm'); - simulatedRadio.printCalls(); - var c2 = simulatedRadio.addCall(CALLSTATE_ACTIVE, '16502345678', 'x'); - simulatedRadio.printCalls(); - var c3 = simulatedRadio.addCall(CALLSTATE_ACTIVE, '16502349876', 'y'); - simulatedRadio.printCalls(); - - simulatedRadio.removeCall(c0.index); - simulatedRadio.printCalls(); - simulatedRadio.removeCall(c1.index); - simulatedRadio.printCalls(); - simulatedRadio.removeCall(c2.index); - simulatedRadio.printCalls(); - - result = simulatedRadio.rilRequestGetCurrentCalls(); - newCalls = rilSchema[packageNameAndSeperator + - 'RspGetCurrentCalls'].parse(result.responseProtobuf); - simulatedRadio.printCalls(newCalls.calls); - - // Set to false to test RIL_REQUEST_GET_CURRENT_CALLS as there will - // be on call still active on the first RIL_REQUEST_GET_CURRENT_CALLS - // request. - if (false) { - simulatedRadio.removeCall(c3.index); - simulatedRadio.printCalls(); - } - print('testCalls X:'); - } - - testCalls(); -} - -/** - * A test for creating incoming call - */ -if (false) { - /* Only one incoming call is in the call list */ - function verifyIncomingCall() { - var calls = simulatedRadio.getCalls(); - var numIncomingCalls = 0; - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if (calls[i].state == CALLSTATE_INCOMING) { - numIncomingCalls++; - } - } - } - return (numIncomingCalls == 1); - } - - function testStartIncomingCall() { - print('testCreateIncomingCall E:'); - - var req = new Object(); - req.reqNum = CTRL_CMD_SET_MT_CALL; - req.data = new Object(); - req.data.phoneNumber = '6502249208'; - - var numberTestPass = 0; - var numberTestFail = 0; - - // case 1: incoming call is the only active call - var result = new Object(); - result = simulatedRadio.ctrlServerCmdStartInComingCall(req); - if ( (result.rilErrCode == CTRL_STATUS_OK) && verifyIncomingCall()) { - numberTestPass++; - } else { - numberTestFail++; - print('testStartIncomingCall: TEST CASE 1 FAIL'); - } - - // case 2: one incoming call, add another incoming call will fail - req.data.phoneNumber = '6502223456'; - result = simulatedRadio.ctrlServerCmdStartInComingCall(req); - if ((result.rilErrCode == CTRL_STATUS_ERR) && verifyIncomingCall()) { - numberTestPass++; - } else { - numberTestFail++; - print('testStartIncomingCall: TEST CASE 2 FAIL'); - } - - // case 3: one dialing call, add another incoming call will fail - // Make the first call in dialing state - var calls = simulatedRadio.getCalls(); - for (var i = 0; i < calls.length; i++) { - if (typeof calls[i] != 'undefined') { - if (calls[i].state == CALLSTATE_INCOMING) { - calls[i].state = CALLSTATE_DIALING; - break; - } - } - } - result = simulatedRadio.ctrlServerCmdStartInComingCall(req); - if (result.rilErrCode == CTRL_STATUS_ERR) { - numberTestPass++; - } else { - numberTestFail++; - print('testStartIncomingCall: TEST CASE 3 FAIL'); - } - - // case 4: one dialing call, adding another incoming call will fail - calls[i].state = CALLSTATE_ALERTING; - result = simulatedRadio.ctrlServerCmdStartInComingCall(req); - if (result.rilErrCode == CTRL_STATUS_ERR) { - numberTestPass++; - } else { - numberTestFail++; - print('testStartIncomingCall: TEST CASE 4 FAIL'); - } - - // case 5: one active call, adding another incoming call will succeed - calls[i].state = CALLSTATE_ACTIVE; - result = simulatedRadio.ctrlServerCmdStartInComingCall(req); - if (result.rilErrCode == CTRL_STATUS_OK) { - numberTestPass++; - } else { - numberTestFail++; - print('testStartIncomingCall: TEST CASE 5 FAIL'); - } - - print('*************TEST RESULT ****************'); - print('Number of Test Passed: ' + numberTestPass); - print('Number of Test Failed: ' + numberTestFail); - print('************ End **********************'); - // after the test, remove any calls - for (i = 0; i < calls.length; i++) { - simulatedRadio.removeCall(i); - } - print('testStartIncomingCall X:'); - } - - testStartIncomingCall(); -} - -/** - * A test for RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND - */ -if (false) { - var calls = simulatedRadio.getCalls(); - - function testHangUpForegroundResumeBackground() { - print('testHangUpForegroundResumeBackground E:'); - var testOutput = false; - for (var state = CALLSTATE_ACTIVE; state <= CALLSTATE_WAITING; state++) { - var c0 = simulatedRadio.addCall(state, '16502849230', 'smith'); - var req = new Object(); - req.reqNum = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND; - var testResult = simulatedRadio.rilRequestHangUpForegroundResumeBackground(req); - if (state == CALLSTATE_ACTIVE) { - var testCalls = simulatedRadio.getCalls(); - if (testCalls.length == 0) { - testOutput = true; - } else { - testOutput = false; - } - } else if (state == CALLSTATE_WAITING) { - if (c0.state == CALLSTATE_ACTIVE) { - testOutput = true; - } else { - testOutput = false; - } - } else if (state == CALLSTATE_HOLDING) { - if (c0.state == CALLSTATE_ACTIVE) { - testOutput = true; - } else { - testOutput = false; - } - } else { - if (testResult.rilErrCode == RIL_E_GENERIC_FAILURE) { - testOutput = true; - } else { - testOutput = false; - } - } - if (testOutput == true) { - print('testHangUpForegroundResumeBackground, call ' + state + ' PASS \n'); - } else { - print('testHangUpForegroundResumeBackground, call ' + state + ' FAIL \n'); - } - simulatedRadio.removeCall(c0.index); - simulatedRadio.printCalls(); - } - } - - testHangUpForegroundResumeBackground(); -} - -/** - * Test RIL_REQUEST_CONFERENCE - */ -if(false) { - var calls = simulatedRadio.getCalls(); - - function testConference() { - print('testConference E'); - - // test case 1: one holding, one dialing - var c0 = simulatedRadio.addCall(CALLSTATE_HOLDING, '16502859848', 'w'); - simulatedRadio.printCalls(); - var c1 = simulatedRadio.addCall(CALLSTATE_DIALING, '16502583456', 'm'); - simulatedRadio.printCalls(); - - var req = new Object(); - req.reqNum = RIL_REQUEST_CONFERENCE; - var testResult = new Object(); - testResult.rilErrCode = RIL_E_SUCCESS; - testResult = simulatedRadio.rilRequestConference(req); - if (testResult.rilErrCode == RIL_E_GENERIC_FAILURE) { - print('testConference: holding & dialing: pass'); - } else { - print('testConference: holding & dialing: fail'); - } - - // test case 2: one holding, one alerting - c1.state = CALLSTATE_ALERTING; - testResult.rilErrCode = RIL_E_SUCCESS; - testResult = simulatedRadio.rilRequestConference(req); - if (testResult.rilErrCode == RIL_E_GENERIC_FAILURE) { - print('testConference: holding & alerting: pass'); - } else { - print('testConference: holding & alerting: fail'); - } - - // test case 3: one holding, one active - c1.state = CALLSTATE_ACTIVE; - testResult.rilErrCode = RIL_E_SUCCESS; - testResult = simulatedRadio.rilRequestConference(req); - if (testResult.rilErrCode == RIL_E_SUCCESS) { - print('testConference: holding & active: pass'); - } else { - print('testConference: holding & active: fail'); - } - - // test case 4: one holding, one incoming - c1.state = CALLSTATE_INCOMING; - testResult.rilErrCode = RIL_E_SUCCESS; - testResult = simulatedRadio.rilRequestConference(req); - if (testResult.rilErrCode == RIL_E_GENERIC_FAILURE) { - print('testConference: holding & incoming: pass'); - } else { - print('testConference: holding & incoming: fail'); - } - - // test case 5: one holding, one waiting - c1.state = CALLSTATE_WAITING; - testResult.rilErrCode = RIL_E_SUCCESS; - testResult = simulatedRadio.rilRequestConference(req); - if (testResult.rilErrCode == RIL_E_GENERIC_FAILURE) { - print('testConference: holding & waiting: pass'); - } else { - print('testConference: holding & waiting: fail'); - } - - simulatedRadio.removeCall(c0.index); - simulatedRadio.removeCall(c1.index); - print('testConference: X'); - } - - testConference(); -} -/** - * Test serialization of bad numeric enum - */ -if (false) { - var c = new RilCall(1000, '11234567890', 'me'); - rsp = new Object(); - rsp.calls = [ c ]; - try { - rilSchema[packageNameAndSeperator + 'RspGetCurrentCalls'].serialize(rsp); - print('test-enum a bad numeric enum value, FAILURE exception expected'); - } catch (err) { - print('test-enum a bad numeric enum value, SUCCESS exception expected: ' + err); - } -} - -/** - * Test serialization of bad string enum - */ -if (false) { - // The state parameter 'NOT_CALLSTATE_ACTIVE' can get corrupted in ToProto? - var c = new RilCall('NOT_CALLSTATE_ACTIVE', '11234567890', 'me'); - rsp = new Object(); - rsp.calls = [ c ]; - try { - rilSchema[packageNameAndSeperator + 'RspGetCurrentCalls'].serialize(rsp); - print('test-enum a bad string enum value, FAILURE exception expected'); - } catch (err) { - print('test-enum a bad string enum value, SUCCESS exception expected: ' + err); - } -} - -/** - * Test addDelayed - */ -if (false) { - print("test addDelayed E"); - simulatedRadioWorker.add( { - 'reqNum' : CMD_DELAY_TEST, - 'hello' : 'hi no delay' }); - simulatedRadioWorker.addDelayed( { - 'reqNum' : CMD_DELAY_TEST, - 'hello' : 'hi not-a-number is 0 delay' }, "not-a-number"); - simulatedRadioWorker.addDelayed( { - 'reqNum' : CMD_DELAY_TEST, - 'hello' : 'hi negative delay is 0 delay' }, -1000); - simulatedRadioWorker.addDelayed( { - 'reqNum' : CMD_DELAY_TEST, - 'hello' : 'hi delayed 2 seconds' }, 2000); - print("test addDelayed X"); -} - -/** - * A test for setRadioState, verify it can handle valid string variable, - * undefined varilabe, and invalid radio state correctly. - */ -if (false) { - function testSetRadioState() { - print('testSetRadioState E:'); - // defined string variable - newState = 'RADIOSTATE_UNAVAILABLE'; - try { - setRadioState(newState); - } catch (err) { - print('test failed'); - } - print('Expecting gRadioState to be ' + RADIOSTATE_UNAVAILABLE + - ', gRadioState is: ' + gRadioState); - - // undefined string variable, expecting exception - try { - setRadioState('RADIOSTATE_UNDEFINED'); - } catch (err) { - if (err.indexOf('Unknow string') >= 0) { - print('test success'); - print('err: ' + err); - } else { - print('test failed'); - } - } - - // valid radio state - try { - setRadioState(RADIOSTATE_NV_READY); - } catch (err) { - print('test failed'); - } - print('Expecting gRadioState to be ' + RADIOSTATE_NV_READY + - ', gRadioState is: ' + gRadioState); - - // invalid radio state - try { - setRadioState(-1); - } catch (err) { - if (err.indexOf('invalid') >= 0) { - print('test success'); - print('err: ' + err); - } else { - print('test failed, err: ' + err); - } - } - print('gRadioState should not be set: ' + gRadioState); - - // set radio state to be SIM_READY - setRadioState(RADIOSTATE_SIM_READY); - print('Expecting gRadioState to be ' + RADIOSTATE_SIM_READY + - ', gRadioState is: ' + gRadioState); - print('testSetRadioState X:'); - } - - testSetRadioState(); -} diff --git a/mock-ril/src/proto/ctrl.proto b/mock-ril/src/proto/ctrl.proto deleted file mode 100644 index 0705386..0000000 --- a/mock-ril/src/proto/ctrl.proto +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2010 Google Inc. All Rights Reserved. -// Author: wink@google.com (Wink Saville) - -package ril_proto; - -option java_package='com.android.internal.telephony.ril_proto'; -option java_outer_classname='RilCtrlCmds'; - -import "hardware/ril/mock-ril/src/proto/ril.proto"; - -enum CtrlCmd { - CTRL_CMD_ECHO = 0; - CTRL_CMD_GET_RADIO_STATE = 1; - CTRL_CMD_SET_RADIO_STATE = 2; - CTRL_CMD_SET_MT_CALL = 1001; - CTRL_CMD_HANGUP_CONN_REMOTE = 1002; - CTRL_CMD_SET_CALL_TRANSITION_FLAG = 1003; - CTRL_CMD_SET_CALL_ALERT = 1004; - CTRL_CMD_SET_CALL_ACTIVE = 1005; - CTRL_CMD_ADD_DIALING_CALL = 1006; // this command is for testing -} - -enum CtrlStatus { - CTRL_STATUS_OK = 0; - CTRL_STATUS_ERR = 1; -} - -// request of setting radio state -message CtrlReqRadioState { - required ril_proto.RadioState state = 1; -} - -// response of set/get radio state -message CtrlRspRadioState { - required ril_proto.RadioState state = 1; -} - -// 1001: request of creating an incoming call -message CtrlReqSetMTCall { - required string phone_number = 1; // Phone number to display -} - -// 1002: request of hangup a connection for the given disconnection cause -message CtrlHangupConnRemote { - required int32 connection_id = 1; // connection id - required int32 call_fail_cause = 2; // call failure cause -} - -// 1003: set call transition flag: true for controlled transition -// false for auto-transition -message CtrlSetCallTransitionFlag { - required bool flag = 1; -} - -// 1006: Add a dialing call -message CtrlReqAddDialingCall { - required string phone_number = 1; // phone number -} diff --git a/mock-ril/src/proto/msgheader.proto b/mock-ril/src/proto/msgheader.proto deleted file mode 100644 index 0886de9..0000000 --- a/mock-ril/src/proto/msgheader.proto +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2010 Google Inc. All Rights Reserved. -// Author: wink@google.com (Wink Saville) - -package communication; - -option java_package='com.android.internal.communication'; - -message MsgHeader { - required uint32 cmd = 1; - required uint32 length_data = 2; - optional uint32 status = 3; - optional uint64 token = 4; -} diff --git a/mock-ril/src/proto/ril.proto b/mock-ril/src/proto/ril.proto deleted file mode 100644 index f7c2e73..0000000 --- a/mock-ril/src/proto/ril.proto +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright 2010 Google Inc. All Rights Reserved. -// Author: wink@google.com (Wink Saville) - -package ril_proto; - -option java_package='com.android.internal.telephony.ril_proto'; -option java_outer_classname='RilCmds'; - -enum RadioState { - RADIOSTATE_OFF = 0; /* Radio explictly powered off (eg CFUN=0) */ - RADIOSTATE_UNAVAILABLE = 1; /* Radio unavailable (eg, resetting or not booted) */ - RADIOSTATE_SIM_NOT_READY = 2; /* Radio is on, but the SIM interface is not ready */ - RADIOSTATE_SIM_LOCKED_OR_ABSENT = 3; /* SIM PIN locked, PUK required, network - personalization locked, or SIM absent */ - RADIOSTATE_SIM_READY = 4; /* Radio is on and SIM interface is available */ - RADIOSTATE_RUIM_NOT_READY = 5; /* Radio is on, but the RUIM interface is not ready */ - RADIOSTATE_RUIM_READY = 6; /* Radio is on and the RUIM interface is available */ - RADIOSTATE_RUIM_LOCKED_OR_ABSENT = 7; /* RUIM PIN locked, PUK required, network - personalization locked, or RUIM absent */ - RADIOSTATE_NV_NOT_READY = 8; /* Radio is on, but the NV interface is not available */ - RADIOSTATE_NV_READY = 9; /* Radio is on and the NV interface is available */ -} - -enum RilCardState { - CARDSTATE_ABSENT = 0; - CARDSTATE_PRESENT = 1; - CARDSTATE_ERROR = 2; -} - -enum RilPersoSubstate { - PERSOSUBSTATE_UNKNOWN = 0; /* initial state */ - PERSOSUBSTATE_IN_PROGRESS = 1; /* in between each lock transition */ - PERSOSUBSTATE_READY = 2; /* when either SIM or RUIM Perso is finished - since each app can only have 1 active perso - involved */ - PERSOSUBSTATE_SIM_NETWORK = 3; - PERSOSUBSTATE_SIM_NETWORK_SUBSET = 4; - PERSOSUBSTATE_SIM_CORPORATE = 5; - PERSOSUBSTATE_SIM_SERVICE_PROVIDER = 6; - PERSOSUBSTATE_SIM_SIM = 7; - PERSOSUBSTATE_SIM_NETWORK_PUK = 8; /* The corresponding perso lock is blocked */ - PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK = 9; - PERSOSUBSTATE_SIM_CORPORATE_PUK = 10; - PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK = 11; - PERSOSUBSTATE_SIM_SIM_PUK = 12; - PERSOSUBSTATE_RUIM_NETWORK1 = 13; - PERSOSUBSTATE_RUIM_NETWORK2 = 14; - PERSOSUBSTATE_RUIM_HRPD = 15; - PERSOSUBSTATE_RUIM_CORPORATE = 16; - PERSOSUBSTATE_RUIM_SERVICE_PROVIDER = 17; - PERSOSUBSTATE_RUIM_RUIM = 18; - PERSOSUBSTATE_RUIM_NETWORK1_PUK = 19; /* The corresponding perso lock is blocked */ - PERSOSUBSTATE_RUIM_NETWORK2_PUK = 20; - PERSOSUBSTATE_RUIM_HRPD_PUK = 21; - PERSOSUBSTATE_RUIM_CORPORATE_PUK = 22; - PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK = 23; - PERSOSUBSTATE_RUIM_RUIM_PUK = 24; -} - -enum RilAppState { - APPSTATE_UNKNOWN = 0; - APPSTATE_DETECTED = 1; - APPSTATE_PIN = 2; /* If PIN1 or UPin is required */ - APPSTATE_PUK = 3; /* If PUK1 or Puk for UPin is required */ - APPSTATE_SUBSCRIPTION_PERSO = 4; /* perso_substate should be look at - when app_state is assigned to this value */ - APPSTATE_READY = 5; -} - -enum RilPinState { - PINSTATE_UNKNOWN = 0; - PINSTATE_ENABLED_NOT_VERIFIED = 1; - PINSTATE_ENABLED_VERIFIED = 2; - PINSTATE_DISABLED = 3; - PINSTATE_ENABLED_BLOCKED = 4; - PINSTATE_ENABLED_PERM_BLOCKED = 5; -} - -enum RilAppType { - APPTYPE_UNKNOWN = 0; - APPTYPE_SIM = 1; - APPTYPE_USIM = 2; - APPTYPE_RUIM = 3; - APPTYPE_CSIM = 4; -} - -message RilAppStatus { - optional RilAppType app_type = 1; - optional RilAppState app_state = 2; - optional RilPersoSubstate perso_substate = 3; /* applicable only if app_state == - APPSTATE_SUBSCRIPTION_PERSO */ - optional string aid = 4; /* null terminated string, e.g., from 0xA0, 0x00 -> 0x41, - 0x30, 0x30, 0x30 */ - optional string app_label = 5; /* null terminated string */ - optional int32 pin1_replaced = 6; /* applicable to USIM and CSIM */ - optional RilPinState pin1 = 7; - optional RilPinState pin2 = 8; -} - - -message RilCardStatus { - optional RilCardState card_state = 1; /* current state */ - optional RilPinState universal_pin_state = 2; /* applicable to USIM and CSIM: PINSTATE_xxx */ - optional int32 gsm_umts_subscription_app_index = 3; /* value < CARD_MAX_APPS */ - optional int32 cdma_subscription_app_index = 4; /* value < CARD_MAX_APPS */ - optional int32 ims_subscription_app_index = 5; /* value < CARD_MAX_APPS */ - optional int32 num_applications = 6; /* value <= CARD_MAX_APPS */ - repeated RilAppStatus applications = 7; /* CARD_MAX_APPS == 8 */ -} - -/* User-to-User signaling Info activation types derived from 3GPP 23.087 v8.0 */ -enum RilUusType { - RILUUSTYPE1_IMPLICIT = 0; - RILUUSTYPE1_REQUIRED = 1; - RILUUSTYPE1_NOT_REQUIRED = 2; - RILUUSTYPE2_REQUIRED = 3; - RILUUSTYPE2_NOT_REQUIRED = 4; - RILUUSTYPE3_REQUIRED = 5; - RILUUSTYPE3_NOT_REQUIRED = 6; -}; - -/* User-to-User Signaling Information data coding schemes. Possible values for - * Octet 3 (Protocol Discriminator field) in the UUIE. The values have been - * specified in section 10.5.4.25 of 3GPP TS 24.008 */ -enum RilUusDcs { - RILUUSDCS_USP = 0; /* User specified protocol */ - RILUUSDCS_OSIHLP = 1; /* OSI higher layer protocol */ - RILUUSDCS_X244 = 2; /* X.244 */ - RILUUSDCS_RMCF = 3; /* Reserved for system mangement - convergence function */ - RILUUSDCS_IA5c = 4; /* IA5 characters */ -} - -/* User-to-User Signaling Information defined in 3GPP 23.087 v8.0 - * This data is passed in RIL_ExtensionRecord and rec contains this - * structure when type is RIL_UUS_INFO_EXT_REC */ -message RilUusInfo { - optional RilUusType uus_type = 1; /* UUS Type */ - optional RilUusDcs uus_dcs = 2; /* UUS Data Coding Scheme */ - optional int32 uus_length = 3; /* Length of UUS Data */ - optional string uus_data = 4; /* UUS Data */ -} - -enum RilCallState { - CALLSTATE_ACTIVE = 0; - CALLSTATE_HOLDING = 1; - CALLSTATE_DIALING = 2; /* MO call only */ - CALLSTATE_ALERTING = 3; /* MO call only */ - CALLSTATE_INCOMING = 4; /* MT call only */ - CALLSTATE_WAITING = 5; /* MT call only */ -} - -message RilCall { - optional RilCallState state = 1; /* State of the call */ - optional int32 index = 2; /* Connection Index for use with, - eg, AT+CHLD */ - optional int32 toa = 3; /* type of address, eg 145 = intl */ - optional bool is_mpty = 4; /* true if is mpty call */ - optional bool is_mt = 5; /* true if call is mobile terminated */ - optional int32 als = 6; /* ALS line indicator if available - (0 = line 1) */ - optional bool is_voice = 7; /* true if this is is a voice call */ - optional bool is_voice_privacy = 8; /* true if CDMA voice privacy mode - is active */ - optional string number = 9; /* Remote party number */ - optional int32 number_presentation = 10; /* 0=Allowed, 1=Restricted, - 2=Not Specified/Unknown 3=Payphone */ - optional string name = 11; /* Remote party name */ - optional int32 name_presentation = 12; /* 0=Allowed, 1=Restricted, - 2=Not Specified/Unknown 3=Payphone */ - optional RilUusInfo uus_info = 13; /* NULL or Pointer to User-User Signaling - Information */ -} - -message RILGWSignalStrength { - optional int32 signal_strength = 1; /* Valid values are (0-31, 99) as defined - in TS 27.007 8.5 */ - optional int32 bit_error_rate = 2; /* bit error rate (0-7, 99) as defined - in TS 27.007 8.5 */ -} - -message RILCDMASignalStrength { - optional int32 dbm = 1; /* Valid values are positive integers. This value is the actual RSSI - value multiplied by -1. Example: If the actual RSSI is -75, then - this response value will be 75. */ - optional int32 ecio = 2; /* Valid values are positive integers. This value is the actual Ec/Io - multiplied by -10. Example: If the actual Ec/Io is -12.5 dB, then - this response value will be 125. */ -} - -message RILEVDOSignalStrength { - optional int32 dbm = 1; /* Valid values are positive integers. This value is the actual RSSI - value multiplied by -1. Example: If the actual RSSI is -75, then - this response value will be 75. */ - optional int32 ecio = 2; /* Valid values are positive integers. This value is the actual - Ec/Io multiplied by -10. Example: If the actual Ec/Io is -12.5 dB, - then this response value will be 125. */ - optional int32 signal_noise_ratio = 3; /* Valid values are 0-8. - 8 is the highest signal to noise ratio. */ -} - -message RILLTESignalStrength { - optional int32 signal_strength = 1; /* Valid values are (0-31, 99) - * as defined in TS 27.007 8.5 */ - optional int32 rsrp = 2; /* The current Reference Signal Receive Power in dBm - * multipled by -1. Range: 44 to 140 dBm, - * TODO: doc reference */ - optional int32 rsrq = 3; /* The current Reference Signal Receive Quality in dB - * multiplied by -1. Range: 20 to 3 dB. - * TODO: doc reference */ - optional int32 rssnr = 4; /* TODO: Need documentation and doc reference */ - optional int32 cqi = 5; /* TODO: Need documentation and doc reference */ -} - -// Response is an array of strings. -// -// If a strings(i) is "*magic-null*" then that value will be returned as null. -message RspStrings{ - repeated string strings = 1; -} - -// Response is an array of integers -message RspIntegers{ - repeated int32 integers = 1; -} - -// 1 RIL_REQUEST_GET_SIM_STATUS -message RspGetSimStatus { - required RilCardStatus card_status = 1; -} - -// 2 RIL_REQUEST_ENTER_SIM_PIN -message ReqEnterSimPin { - required string pin = 1; -} -// RIL_REQUEST_ENTER_SIM_PIN response -message RspEnterSimPin { - required int32 retries_remaining = 1; -} - -// 9 RIL_GET_CURRENT_CALLS response -message RspGetCurrentCalls { - repeated RilCall calls = 1; -} - -// 10 RIL_REQUEST_DIAL -message ReqDial { - optional string address = 1; - optional int32 clir = 2; - /* (same as 'n' paremeter in TS 27.007 7.7 "+CLIR" - * clir == 0 on "use subscription default value" - * clir == 1 on "CLIR invocation" (restrict CLI presentation) - * clir == 2 on "CLIR suppression" (allow CLI presentation) - */ - optional RilUusInfo uus_info = 3; /* NULL or Pointer to User-User Signaling Information */ -} - -// 12 RIL_REQUEST_HANG_UP -message ReqHangUp { - required int32 connection_index = 1; -} - -// 18 response for RIL_REQUEST_LAST_CALL_FAIL_CAUSE -message RspLastCallFailCause { - required int32 last_call_fail_cause = 1; -} - -// 19 RIL_REQUEST_SIGNAL_STRENGTH response -message RspSignalStrength { - optional RILGWSignalStrength gw_signalstrength = 1; - optional RILCDMASignalStrength cdma_signalstrength = 2; - optional RILEVDOSignalStrength evdo_signalstrength = 3; - optional RILLTESignalStrength lte_signalstrength = 4; -} - -// 22 RIL_REQUEST_OPERATOR response -message RspOperator{ - optional string long_alpha_ons = 1; // The long alpha ons or eons - optional string short_alpha_ons = 2; // The short alpha ons or eons - optional string mcc_mnc = 3; // The 5 or 6 digit mcc + mnc -} - -// 52 RIL_REQUEST_SEPARATE_CONNECTION -message ReqSeparateConnection{ - required int32 index = 1; // Connection index to separate - // from multiparty call -} - -// 53 RIL_REQUEST_SET_MUTE -message ReqSetMute{ - required bool state = 1; // true to "enable mute", false to "disable mute" -} - -// 61 RIL_REQUEST_SCREEN_STATE -message ReqScreenState { - required bool state = 1; // true screen is on, false screen is off -} - diff --git a/mock-ril/src/python/tcs.py b/mock-ril/src/python/tcs.py deleted file mode 100755 index 0b56301..0000000 --- a/mock-ril/src/python/tcs.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/python -# -# 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. -# - -"""Test server - -A detailed description of tms. -""" - -__author__ = 'wink@google.com (Wink Saville)' - -import socket -import struct -import sys -import time - -import ctrl_pb2 -import ril_pb2 -import msgheader_pb2 - -def recvall(s, count): - """Receive all of the data otherwise return none. - - Args: - s: socket - count: number of bytes - - Returns: - data received - None if no data is received - """ - all_data = [] - while (count > 0): - data = s.recv(count) - if (len(data) == 0): - return None - count -= len(data) - all_data.append(data) - result = ''.join(all_data); - return result - -def sendall(s, data): - """Send all of the data - - Args: - s: socket - count: number of bytes - - Returns: - Nothing - """ - s.sendall(data) - -class MsgHeader: - """A fixed length message header; cmd, token, status and length of protobuf.""" - def __init__(self): - self.cmd = 0 - self.token = 0 - self.status = 0 - self.length_protobuf = 0 - - def sendHeader(self, s): - """Send the header to the socket - - Args: - s: socket - - Returns - nothing - """ - mh = msgheader_pb2.MsgHeader() - mh.cmd = self.cmd - mh.token = self.token - mh.status = self.status - mh.length_data = self.length_protobuf - mhser = mh.SerializeToString() - len_msg_header_raw = struct.pack(' 0): - self.header.length_protobuf = len(protobuf) - else: - self.header.length_protobuf = 0 - self.protobuf = '' - self.header.sendHeader(s) - if (self.header.length_protobuf > 0): - sendall(s, self.protobuf) - - def recvMsg(self, s): - """Receive a message from a socket - - Args: - s: socket - - Returns: - nothing - """ - self.header.recvHeader(s) - self.cmd = self.header.cmd - self.token = self.header.token - self.status = self.header.status - if (self.header.length_protobuf > 0): - self.protobuf = recvall(s, self.header.length_protobuf) - else: - self.protobuf = '' - -def main(argv): - """Create a socket and connect. - - Before using you'll need to forward the port - used by mock_ril, 54312 to a port on the PC. - The following worked for me: - - adb forward tcp:11111 tcp:54312. - - Then you can execute this test using: - - tms.py 127.0.0.1 11111 - """ - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - host = sys.argv[1] # server address - print "host=%s" % host - port = int(sys.argv[2]) # server port - print "port=%d" % port - s.connect((host, port)) - - # Create an object which is serializable to a protobuf - rrs = ctrl_pb2.CtrlRspRadioState() - rrs.state = ril_pb2.RADIOSTATE_UNAVAILABLE - print "rrs.state=%d" % (rrs.state) - - # Serialize - rrs_ser = rrs.SerializeToString() - print "len(rrs_ser)=%d" % (len(rrs_ser)) - - # Deserialize - rrs_new = ctrl_pb2.CtrlRspRadioState() - rrs_new.ParseFromString(rrs_ser) - print "rrs_new.state=%d" % (rrs_new.state) - - - # Do an echo test - req = Msg() - req.sendMsg(s, 0, 1234567890123, rrs_ser) - resp = Msg() - resp.recvMsg(s) - response = ctrl_pb2.CtrlRspRadioState() - response.ParseFromString(resp.protobuf) - - print "cmd=%d" % (resp.cmd) - print "token=%d" % (resp.token) - print "status=%d" % (resp.status) - print "len(protobuf)=%d" % (len(resp.protobuf)) - print "response.state=%d" % (response.state) - if ((resp.cmd == 0) & (resp.token == 1234567890123) & - (resp.status == 0) & (response.state == 1)): - print "SUCCESS: echo ok" - else: - print "ERROR: expecting cmd=0 token=1234567890123 status=0 state=1" - - # Test CTRL_GET_RADIO_STATE - req.sendMsg(s, ctrl_pb2.CTRL_CMD_GET_RADIO_STATE, 4) - resp = Msg() - resp.recvMsg(s) - - print "cmd=%d" % (resp.cmd) - print "token=%d" % (resp.token) - print "status=%d" % (resp.status) - print "length_protobuf=%d" % (len(resp.protobuf)) - - if (resp.cmd == ctrl_pb2.CTRL_CMD_GET_RADIO_STATE): - response = ctrl_pb2.CtrlRspRadioState() - response.ParseFromString(resp.protobuf) - print "SUCCESS: response.state=%d" % (response.state) - else: - print "ERROR: expecting resp.cmd == ctrl_pb2.CTRL_CMD_GET_RADIO_STATE" - - # Close socket - print "closing socket" - s.close() - - -if __name__ == '__main__': - main(sys.argv)