summaryrefslogtreecommitdiffstats
path: root/telephony/jni
diff options
context:
space:
mode:
Diffstat (limited to 'telephony/jni')
-rw-r--r--telephony/jni/cdmasms/Android.mk24
-rw-r--r--telephony/jni/cdmasms/cdma_sms_jni.cpp1300
-rw-r--r--telephony/jni/cdmasms/cdma_sms_jni.h159
3 files changed, 1483 insertions, 0 deletions
diff --git a/telephony/jni/cdmasms/Android.mk b/telephony/jni/cdmasms/Android.mk
new file mode 100644
index 0000000..b0c96b4
--- /dev/null
+++ b/telephony/jni/cdmasms/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES:= \
+ cdma_sms_jni.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libutils \
+ libandroid_runtime \
+ libnativehelper
+
+LOCAL_MODULE:= libcdma_sms_jni
+
+LOCAL_C_INCLUDES += \
+ $(JNI_H_INCLUDE) \
+ hardware/ril/include/telephony
+
+LOCAL_C_INCLUDES += hardware/ril/reference-cdma-sms
+LOCAL_SHARED_LIBRARIES += libreference-cdma-sms
+LOCAL_CFLAGS += -DREFERENCE_CDMA_SMS
+
+LOCAL_PRELINK_MODULE := false
+include $(BUILD_SHARED_LIBRARY)
diff --git a/telephony/jni/cdmasms/cdma_sms_jni.cpp b/telephony/jni/cdmasms/cdma_sms_jni.cpp
new file mode 100644
index 0000000..2a8e825
--- /dev/null
+++ b/telephony/jni/cdmasms/cdma_sms_jni.cpp
@@ -0,0 +1,1300 @@
+/*
+ * Copyright (C) 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.
+ * 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.
+ */
+
+/**
+ * @file cdma_sms_jni.cpp
+ *
+ * This file implement the Java Native Interface
+ * for encoding and decoding of SMS
+ */
+
+
+#include <nativehelper/jni.h>
+#include <nativehelper/JNIHelp.h>
+#include <android_runtime/AndroidRuntime.h>
+#include <cdma_sms_jni.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif //__cplusplus
+
+#include <reference-cdma-sms.h>
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#undef LOG_TAG
+#define LOG_TAG "CDMA"
+#include <utils/Log.h>
+
+static RIL_CDMA_SMS_ClientBd *clientBdData = NULL;
+
+
+static jint getObjectIntField(JNIEnv * env, jobject obj, const char *name, jint * value)
+{
+ jclass clazz;
+ jfieldID field;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("getObjectIntField():");
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "I");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ *value = env->GetIntField(obj, field);
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD(" %s = %d\n", name, *value);
+#endif
+
+ return JNI_SUCCESS;
+}
+
+static jint setObjectIntField(JNIEnv * env, jobject obj, const char *name, jint value)
+{
+ jclass clazz;
+ jfieldID field;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("setObjectIntField(): %s = %d\n", name, value);
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "I");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ env->SetIntField(obj, field, value);
+
+ return JNI_SUCCESS;
+}
+
+static jint getObjectByteField(JNIEnv * env, jobject obj, const char *name, jbyte * value)
+{
+ jclass clazz;
+ jfieldID field;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("getObjectByteField():");
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "B");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ *value = env->GetByteField(obj, field);
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD(" %s = %02x\n", name, *value);
+#endif
+
+ return JNI_SUCCESS;
+}
+
+static jint setObjectByteField(JNIEnv * env, jobject obj, const char *name, jbyte value)
+{
+ jclass clazz;
+ jfieldID field;
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("setObjectByteField(): %s = 0x%02x\n", name, value);
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "B");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ env->SetByteField(obj, field, value);
+
+ return JNI_SUCCESS;
+}
+
+static jint getObjectBooleanField(JNIEnv * env, jobject obj, const char *name, jboolean * value)
+{
+ jclass clazz;
+ jfieldID field;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("getObjectBooleanField():");
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "Z");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ *value = env->GetBooleanField(obj, field);
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD(" %s = %d\n", name, *value);
+#endif
+
+ return JNI_SUCCESS;
+}
+
+static jint setObjectBooleanField(JNIEnv * env, jobject obj, const char *name, jboolean value)
+{
+ jclass clazz;
+ jfieldID field;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("setObjectBooleanField(): %s = %d\n", name, value);
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "Z");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ env->SetBooleanField(obj, field, value);
+
+ return JNI_SUCCESS;
+}
+
+static jint getObjectByteArrayField(JNIEnv * env, jobject obj, const char *name, jbyte* arrData, int* length)
+{
+ jclass clazz;
+ jfieldID field;
+ jbyte * data_buf;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("getObjectByteArrayField(): %s\n", name);
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "[B");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ jbyteArray buffer = (jbyteArray)(env->GetObjectField(obj, field));
+ if (buffer != NULL) {
+ int len = env->GetArrayLength(buffer);
+ data_buf = env->GetByteArrayElements(buffer, NULL);
+ for (int i=0; i<len; i++) {
+ *arrData++ = data_buf[i];
+#ifdef DBG_LOG_LEVEL_B
+ LOGD(" [%d] = 0x%02x\n", i, data_buf[i]);
+#endif
+ }
+ *length = len;
+ } else {
+ jniThrowException(env, "java/lang/NullPointerException", NULL);
+ return JNI_FAILURE;
+ }
+
+ return JNI_SUCCESS;
+}
+
+static jint setObjectByteArrayField(JNIEnv * env, jobject obj, const char *name, jbyte* arrData, int length)
+{
+ jclass clazz;
+ jfieldID field;
+ jbyte* byte_buf;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("setObjectByteArrayField(): %s\n", name);
+#endif
+
+ clazz = env->GetObjectClass(obj);
+ if (NULL == clazz) {
+ jniThrowException(env, "java/lang/Exception", NULL);
+ return JNI_FAILURE;
+ }
+
+ field = env->GetFieldID(clazz, name, "[B");
+ env->DeleteLocalRef(clazz);
+
+ if (NULL == field) {
+ jniThrowException(env, "java/lang/NoSuchFieldException", name);
+ return JNI_FAILURE;
+ }
+
+ jbyteArray buffer = (jbyteArray)(env->GetObjectField(obj, field));
+ if (buffer == NULL) {
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("setObjectByteArrayField(): %s = null\n", name);
+#endif
+ buffer = env->NewByteArray(length);
+ env->SetObjectField(obj, field, buffer);
+ }
+
+ if (buffer != NULL) {
+#ifdef DBG_LOG_LEVEL_B
+ for (int i=0; i<length; i++) {
+ LOGD(" [%d] = 0x%02x\n", i, arrData[i]);
+ }
+#endif
+ env->SetByteArrayRegion(buffer, 0, length, arrData);
+ } else {
+ jniThrowException(env, "java/lang/NullPointerException", NULL);
+ return JNI_FAILURE;
+ }
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsConstructClientBD
+ (JNIEnv * env, jobject obj)
+{
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsConstructClientBD()...\n");
+#endif
+
+ clientBdData = (RIL_CDMA_SMS_ClientBd *)malloc(sizeof(RIL_CDMA_SMS_ClientBd));
+ if (NULL == clientBdData) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", "clientBdData memory allocation failed");
+ return JNI_FAILURE;
+ }
+ memset(clientBdData, 0, sizeof(RIL_CDMA_SMS_ClientBd));
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDestructClientBD
+ (JNIEnv * env, jobject obj)
+{
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsDestructClientBD()...\n");
+#endif
+
+ if (clientBdData == NULL) {
+ jniThrowException(env, "java/lang/NullPointerException", "clientBdData is null");
+ return JNI_FAILURE;
+ }
+ free(clientBdData);
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetBearerDataPrimitives
+ (JNIEnv * env, jobject obj, jobject bearerData)
+{
+ jbyteArray mc_time = NULL;
+ jbyte mctime_buffer[6];
+ int length;
+ jint intData;
+ jbyte byteData;
+ jboolean booleanData;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsSetBearerDataPrimitives()...\n");
+#endif
+
+ // mask
+ if (getObjectIntField(env, bearerData, "mask", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->mask = intData;
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->mask = 0x%x\n", clientBdData->mask);
+#endif
+
+ // message_id.type
+ if (getObjectByteField(env, bearerData, "messageType", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->message_id.type = (RIL_CDMA_SMS_BdMessageType)(byteData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.type = 0x%02x\n", clientBdData->message_id.type);
+#endif
+
+ // message_id.id_number
+ if ((clientBdData->mask & WMS_MASK_BD_MSG_ID) == WMS_MASK_BD_MSG_ID) {
+ if (getObjectIntField(env, bearerData, "messageID", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->message_id.id_number = (RIL_CDMA_SMS_MessageNumber)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.id_number = %d\n", clientBdData->message_id.id_number);
+#endif
+ }
+
+ // message_id.udh_present
+ if (getObjectBooleanField(env, bearerData, "hasUserDataHeader", &booleanData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->message_id.udh_present = (unsigned char)(booleanData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.udh_present = %d\n", clientBdData->message_id.udh_present);
+#endif
+
+ // user_response
+ // TODO
+
+ // mc_time
+ if ((clientBdData->mask & WMS_MASK_BD_MC_TIME) == WMS_MASK_BD_MC_TIME) {
+ if (getObjectByteArrayField(env, bearerData, "timeStamp", mctime_buffer, &length) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ if (mctime_buffer != NULL) {
+ clientBdData->mc_time.year = mctime_buffer[0];
+ clientBdData->mc_time.month = mctime_buffer[1];
+ clientBdData->mc_time.day = mctime_buffer[2];
+ clientBdData->mc_time.hour = mctime_buffer[3];
+ clientBdData->mc_time.minute = mctime_buffer[4];
+ clientBdData->mc_time.second = mctime_buffer[5];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->mc_time.year = %d\n", clientBdData->mc_time.year);
+ LOGD("clientBdData->mc_time.month = %d\n", clientBdData->mc_time.month);
+ LOGD("clientBdData->mc_time.day = %d\n", clientBdData->mc_time.day);
+ LOGD("clientBdData->mc_time.hour = %d\n", clientBdData->mc_time.hour);
+ LOGD("clientBdData->mc_time.minute = %d\n", clientBdData->mc_time.minute);
+ LOGD("clientBdData->mc_time.second = %d\n", clientBdData->mc_time.second);
+#endif
+ }
+ }
+
+ // clientBdData->mc_time.timezone
+ // TODO
+
+ // validity_absolute;
+ // TODO
+
+ // validity_relative;
+ // TODO
+
+ // deferred_absolute
+ // TODO
+
+ // deferred_relative;
+ // TODO
+
+ // priority
+ // TODO
+
+ // privacy
+ // TODO
+
+ if ((clientBdData->mask & WMS_MASK_BD_REPLY_OPTION) == WMS_MASK_BD_REPLY_OPTION) {
+ // reply_option.user_ack_requested
+ if (getObjectBooleanField(env, bearerData, "userAckReq", &booleanData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->reply_option.user_ack_requested = (unsigned char)(booleanData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.user_ack_requested = %d\n", clientBdData->reply_option.user_ack_requested);
+#endif
+ // reply_option.user_ack_requested
+ if (getObjectBooleanField(env, bearerData, "deliveryAckReq", &booleanData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->reply_option.delivery_ack_requested = (unsigned char)(booleanData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.delivery_ack_requested = %d\n", clientBdData->reply_option.delivery_ack_requested);
+#endif
+ // reply_option.user_ack_requested
+ if (getObjectBooleanField(env, bearerData, "readAckReq", &booleanData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->reply_option.read_ack_requested = (unsigned char)(booleanData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.read_ack_requested = %d\n", clientBdData->reply_option.read_ack_requested);
+#endif
+ }
+
+ // num_messages
+ if ((clientBdData->mask & WMS_MASK_BD_NUM_OF_MSGS) == WMS_MASK_BD_NUM_OF_MSGS) {
+ if (getObjectIntField(env, bearerData, "numberOfMessages", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->num_messages = (unsigned char)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->num_messages = %d\n", clientBdData->num_messages);
+#endif
+ }
+
+ // alert_mode
+ // TODO
+
+ // language
+ // TODO
+
+ // display_mode
+ if ((clientBdData->mask & WMS_MASK_BD_DISPLAY_MODE) == WMS_MASK_BD_DISPLAY_MODE) {
+ if (getObjectByteField(env, bearerData, "displayMode", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->display_mode = (RIL_CDMA_SMS_DisplayMode)(byteData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->display_mode = 0x%02x\n", clientBdData->display_mode);
+#endif
+ }
+
+ // delivery_status
+ if ((clientBdData->mask & WMS_MASK_BD_DELIVERY_STATUS) == WMS_MASK_BD_DELIVERY_STATUS) {
+ // delivery_status.error_class
+ if (getObjectIntField(env, bearerData, "errorClass", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->delivery_status.error_class = (RIL_CDMA_SMS_ErrorClass)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->delivery_status.error_class = %d\n", clientBdData->delivery_status.error_class);
+#endif
+ // delivery_status.status
+ if (getObjectIntField(env, bearerData, "messageStatus", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->delivery_status.status = (RIL_CDMA_SMS_DeliveryStatusE)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->delivery_status.status = %d\n", clientBdData->delivery_status.status);
+#endif
+ }
+
+ // deposit_index
+ // TODO
+
+ // ip_address
+ // TODO
+
+ // rsn_no_notify
+ // TODO
+
+ // other
+ // TODO
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetBearerDataPrimitives
+ (JNIEnv * env, jobject obj, jobject bearerData)
+{
+ jclass BearerDataClass;
+ jfieldID field;
+ jbyte mctime_buffer[6];
+ jbyteArray addr_array;
+ int length;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsGetBearerDataPrimitives()...\n");
+#endif
+
+ // mask
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->mask = 0x%x\n", clientBdData->mask);
+#endif
+ if (setObjectIntField(env, bearerData, "mask", clientBdData->mask) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // message_id.type
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.type = 0x%02x\n", clientBdData->message_id.type);
+#endif
+ if (setObjectByteField(env, bearerData, "messageType", (jbyte)clientBdData->message_id.type) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // message_id.id_number
+ if ((clientBdData->mask & WMS_MASK_BD_MSG_ID) == WMS_MASK_BD_MSG_ID) {
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.id_number = %d\n", clientBdData->message_id.id_number);
+#endif
+ if (setObjectIntField(env, bearerData, "messageID", clientBdData->message_id.id_number) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // message_id.udh_present
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->message_id.udh_present = %d\n", clientBdData->message_id.udh_present);
+#endif
+ if (setObjectBooleanField(env, bearerData, "hasUserDataHeader", (jboolean)clientBdData->message_id.udh_present) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // user_response
+ // TODO
+
+ // mc_time
+ if ((clientBdData->mask & WMS_MASK_BD_MC_TIME) == WMS_MASK_BD_MC_TIME) {
+ jclass clazz= env->GetObjectClass(bearerData);
+ if (NULL == clazz)
+ return JNI_FAILURE;
+ jfieldID field = env->GetFieldID(clazz, "timeStamp", "[B");
+ env->DeleteLocalRef(clazz);
+
+ addr_array = env->NewByteArray((jsize)6);
+ env->SetObjectField(bearerData, field, addr_array);
+
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->mc_time.year = %d\n", clientBdData->mc_time.year);
+ LOGD("clientBdData->mc_time.month = %d\n", clientBdData->mc_time.month);
+ LOGD("clientBdData->mc_time.day = %d\n", clientBdData->mc_time.day);
+ LOGD("clientBdData->mc_time.hour = %d\n", clientBdData->mc_time.hour);
+ LOGD("clientBdData->mc_time.minute = %d\n", clientBdData->mc_time.minute);
+ LOGD("clientBdData->mc_time.second = %d\n", clientBdData->mc_time.second);
+#endif
+ mctime_buffer[0] = clientBdData->mc_time.year;
+ mctime_buffer[1] = clientBdData->mc_time.month;
+ mctime_buffer[2] = clientBdData->mc_time.day;
+ mctime_buffer[3] = clientBdData->mc_time.hour;
+ mctime_buffer[4] = clientBdData->mc_time.minute;
+ mctime_buffer[5] = clientBdData->mc_time.second;
+ length = sizeof(mctime_buffer) / sizeof(jbyte);
+ if (setObjectByteArrayField(env, bearerData, "timeStamp", mctime_buffer, length) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // clientBdData->mc_time.timezone
+ // TODO
+
+ // validity_absolute;
+ // TODO
+
+ // validity_relative;
+ // TODO
+
+ // deferred_absolute
+ // TODO
+
+ // deferred_relative;
+ // TODO
+
+ // priority
+ // TODO
+
+ // privacy
+ // TODO
+
+ if ((clientBdData->mask & WMS_MASK_BD_REPLY_OPTION) == WMS_MASK_BD_REPLY_OPTION) {
+ // reply_option.user_ack_requested
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.user_ack_requested = %d\n", clientBdData->reply_option.user_ack_requested);
+#endif
+ if (setObjectBooleanField(env, bearerData, "userAckReq", (jboolean)clientBdData->reply_option.user_ack_requested) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // reply_option.user_ack_requested
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.delivery_ack_requested = %d\n", clientBdData->reply_option.delivery_ack_requested);
+#endif
+ if (setObjectBooleanField(env, bearerData, "deliveryAckReq", (jboolean)clientBdData->reply_option.delivery_ack_requested) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // reply_option.user_ack_requested
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->reply_option.read_ack_requested = %d\n", clientBdData->reply_option.read_ack_requested);
+#endif
+ if (setObjectBooleanField(env, bearerData, "readAckReq", (jboolean)clientBdData->reply_option.read_ack_requested) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // num_messages
+ if ((clientBdData->mask & WMS_MASK_BD_NUM_OF_MSGS) == WMS_MASK_BD_NUM_OF_MSGS) {
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->num_messages = %d\n", clientBdData->num_messages);
+#endif
+ if (setObjectIntField(env, bearerData, "numberOfMessages", (int)clientBdData->num_messages) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // alert_mode
+ // TODO
+
+ // language
+ // TODO
+
+ // display_mode
+ if ((clientBdData->mask & WMS_MASK_BD_DISPLAY_MODE) == WMS_MASK_BD_DISPLAY_MODE) {
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->display_mode = 0x%02x\n", clientBdData->display_mode);
+#endif
+ if (setObjectByteField(env, bearerData, "displayMode", (jbyte)clientBdData->display_mode) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // delivery_status
+ if ((clientBdData->mask & WMS_MASK_BD_DELIVERY_STATUS) == WMS_MASK_BD_DELIVERY_STATUS) {
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->delivery_status.error_class = %d\n", clientBdData->delivery_status.error_class);
+#endif
+ // delivery_status.error_class
+ if (setObjectIntField(env, bearerData, "errorClass", (int)clientBdData->delivery_status.error_class) != JNI_SUCCESS)
+ return JNI_FAILURE;
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->delivery_status.status = %d\n", clientBdData->delivery_status.status);
+#endif
+ // delivery_status.status
+ if (setObjectIntField(env, bearerData, "messageStatus", (int)clientBdData->delivery_status.status) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ }
+
+ // deposit_index
+ // TODO
+
+ // ip_address
+ // TODO
+
+ // rsn_no_notify
+ // TODO
+
+ // other
+ // TODO
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserData
+ (JNIEnv * env, jobject obj, jobject userData)
+{
+ jclass UserDataClass;
+ jfieldID field;
+ jbyteArray arrData = NULL;
+ jbyte data_buf[RIL_CDMA_SMS_USER_DATA_MAX];
+ int length;
+ jint intData;
+ jbyte byteData;
+ jboolean booleanData;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsSetUserData()...\n");
+#endif
+
+ // set num_headers to 0 here, increment later
+ clientBdData->user_data.num_headers = 0;
+
+ // user_data.encoding
+ if (getObjectIntField(env, userData, "userDataEncoding", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->user_data.encoding = (RIL_CDMA_SMS_UserDataEncoding)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.encoding = %d\n", clientBdData->user_data.encoding);
+#endif
+
+ // is91ep_type
+ // TODO
+
+ // user_data.padding_bits
+ if (getObjectIntField(env, userData, "paddingBits", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->user_data.padding_bits = (unsigned char)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.padding_bits = %d\n", clientBdData->user_data.padding_bits);
+#endif
+
+ // user_data.data
+ if (getObjectByteArrayField(env, userData, "userData", data_buf, &length) != JNI_SUCCESS )
+ return JNI_FAILURE;
+ for (int i = 0; i < length; i++) {
+ clientBdData->user_data.data[i] = data_buf[i];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.data[%d] = 0x%02x\n", i, clientBdData->user_data.data[i]);
+#endif
+ }
+
+ // user_data.data_len
+ // TODO
+
+ // number_of_digits
+ clientBdData->user_data.number_of_digits = (unsigned char)(length);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.number_of_digits = %d\n", clientBdData->user_data.number_of_digits);
+#endif
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserData
+ (JNIEnv * env, jobject obj, jobject userData)
+{
+ jclass UserDataClass;
+ jfieldID field;
+ jbyte *data_buf;
+ int length;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsGetUserData()...\n");
+#endif
+
+ // user_data.num_headers
+// if (setObjectIntField(env, userData, "mNumberOfHeaders", (int)clientBdData->user_data.num_headers) != JNI_SUCCESS)
+// return JNI_FAILURE;
+
+ // user_data.encoding
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.encoding = %d\n", clientBdData->user_data.encoding);
+#endif
+ if (setObjectIntField(env, userData, "userDataEncoding", clientBdData->user_data.encoding) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // is91ep_type
+ // TODO
+
+ // user_data.data_len
+// if (setObjectIntField(env, userData, "mDataLength", (int)clientBdData->user_data.data_len) != JNI_SUCCESS)
+// return JNI_FAILURE;
+
+ // user_data.padding_bits
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.padding_bits = %d\n", clientBdData->user_data.padding_bits);
+#endif
+ if (setObjectIntField(env, userData, "paddingBits", (int)clientBdData->user_data.padding_bits) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // user_data.data
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.data_len = %d\n", clientBdData->user_data.data_len);
+#endif
+ length = clientBdData->user_data.data_len;
+#ifdef DBG_LOG_LEVEL_A
+ for (int i = 0; i < length; i++) {
+ LOGD("clientBdData->user_data.data[%d] = 0x%02x\n", i, clientBdData->user_data.data[i]);
+ }
+#endif
+ data_buf = (jbyte*)clientBdData->user_data.data;
+ if (setObjectByteArrayField(env, userData, "userData", data_buf, length) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // number_of_digits
+ // TODO
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserDataHeader
+ (JNIEnv * env, jobject obj, jint ID, jbyteArray data, jint length, jint index)
+{
+ jbyte data_buf[length];
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsSetUserDataHeader()...\n");
+#endif
+
+ env->GetByteArrayRegion(data, 0, length, data_buf);
+
+ // user_data.headers[index].header_id
+ clientBdData->user_data.headers[index].header_id = (RIL_CDMA_SMS_UdhId)(ID);
+
+ // user_data.headers[index].u
+ // TODO: add support for all udh id's
+ switch(clientBdData->user_data.headers[index].header_id)
+ {
+ case RIL_CDMA_SMS_UDH_CONCAT_8:
+ clientBdData->user_data.headers[index].u.concat_8.msg_ref = data_buf[0];
+ clientBdData->user_data.headers[index].u.concat_8.total_sm = data_buf[1];
+ clientBdData->user_data.headers[index].u.concat_8.seq_num = data_buf[2];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.msg_ref = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.msg_ref);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.total_sm = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.total_sm);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.seq_num = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.seq_num);
+#endif
+ break;
+ case RIL_CDMA_SMS_UDH_SPECIAL_SM:
+ clientBdData->user_data.headers[index].u.special_sm.msg_waiting = (RIL_CDMA_SMS_GWMsgWaiting)(
+ (data_buf[0] << 23) | (data_buf[1] << 15) |
+ (data_buf[2] << 7) | data_buf[3]);
+ clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind = (RIL_CDMA_SMS_GWMsgWaitingKind)(
+ (data_buf[4] << 23) | (data_buf[5] << 15) |
+ (data_buf[6] << 7) | data_buf[7]);
+ clientBdData->user_data.headers[index].u.special_sm.message_count = data_buf[8];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.msg_waiting = 0x%04x\n", index, clientBdData->user_data.headers[index].u.special_sm.msg_waiting);
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.msg_waiting_kind = 0x%04x\n", index, clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind);
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.message_count = 0x%02x\n", index, clientBdData->user_data.headers[index].u.special_sm.message_count);
+#endif
+ break;
+ case RIL_CDMA_SMS_UDH_PORT_8:
+ clientBdData->user_data.headers[index].u.wap_8.dest_port = data_buf[0];
+ clientBdData->user_data.headers[index].u.wap_8.orig_port = data_buf[1];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.wap_8.dest_port = 0x%02x\n", index, clientBdData->user_data.headers[index].u.wap_8.dest_port);
+ LOGD("clientBdData->user_data.headers[%d].u.wap_8.orig_port = 0x%02x\n", index, clientBdData->user_data.headers[index].u.wap_8.orig_port);
+#endif
+ break;
+ case RIL_CDMA_SMS_UDH_PORT_16:
+ clientBdData->user_data.headers[index].u.wap_16.dest_port = (data_buf[0] << 7) | data_buf[1]; // unsigned short
+ clientBdData->user_data.headers[index].u.wap_16.orig_port = (data_buf[2] << 7) | data_buf[3]; // unsigned short
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.wap_16.dest_port = 0x%04x\n", index, clientBdData->user_data.headers[index].u.wap_16.dest_port);
+ LOGD("clientBdData->user_data.headers[%d].u.wap_16.orig_port = 0x%04x\n", index, clientBdData->user_data.headers[index].u.wap_16.orig_port);
+#endif
+ break;
+ case RIL_CDMA_SMS_UDH_CONCAT_16:
+ clientBdData->user_data.headers[index].u.concat_16.msg_ref = (data_buf[0] << 7) | data_buf[1]; // unsigned short
+ clientBdData->user_data.headers[index].u.concat_16.total_sm = data_buf[2];
+ clientBdData->user_data.headers[index].u.concat_16.seq_num = data_buf[3];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.msg_ref = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.msg_ref);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.total_sm = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.total_sm);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.seq_num = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.seq_num);
+#endif
+ break;
+ default:
+ break;
+ }
+
+ // increment num_of_headers
+ clientBdData->user_data.num_headers++;
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jbyteArray JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserDataHeader
+ (JNIEnv * env, jobject obj)
+{
+ jbyteArray arrData = NULL;
+ jbyte data_buf[sizeof(clientBdData->user_data.headers)];
+ int length = 0;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsGetUserDataHeader()...\n");
+#endif
+
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.num_headers = %d, size = %d\n", clientBdData->user_data.num_headers, sizeof(clientBdData->user_data.headers));
+#endif
+
+ for (int index = 0; index < clientBdData->user_data.num_headers; index++) {
+ // user_data.headers[index].header_id
+ data_buf[length++] = (jbyte)clientBdData->user_data.headers[index].header_id;
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].header_id = %d", index, clientBdData->user_data.headers[index].header_id);
+#endif
+
+ // user_data.headers[index].u
+ // TODO: add support for all udh id's
+ switch(clientBdData->user_data.headers[index].header_id)
+ {
+ case RIL_CDMA_SMS_UDH_CONCAT_8:
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.msg_ref = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.msg_ref);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.total_sm = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.total_sm);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_8.seq_num = 0x%02x\n", index, clientBdData->user_data.headers[index].u.concat_8.seq_num);
+#endif
+ data_buf[length++] = 3;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_8.msg_ref;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_8.total_sm;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_8.seq_num;
+ break;
+ case RIL_CDMA_SMS_UDH_SPECIAL_SM:
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.msg_waiting = 0x%04x\n", index, clientBdData->user_data.headers[index].u.special_sm.msg_waiting);
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.msg_waiting_kind = 0x%04x\n", index, clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind);
+ LOGD("clientBdData->user_data.headers[%d].u.special_sm.message_count = 0x%02x\n", index, clientBdData->user_data.headers[index].u.special_sm.message_count);
+#endif
+ data_buf[length++] = 9;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting & 0xFF000000) >> 23; // int
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting & 0x00FF0000) >> 15;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting & 0x0000FF00) >> 7;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.special_sm.msg_waiting & 0x000000FF;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind & 0xFF000000) >> 23; // int
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind & 0x00FF0000) >> 15;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind & 0x0000FF00) >> 7;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.special_sm.msg_waiting_kind & 0x000000FF;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.special_sm.message_count;
+ break;
+ case RIL_CDMA_SMS_UDH_PORT_8:
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.wap_8.dest_port = 0x%02x\n", index, clientBdData->user_data.headers[index].u.wap_8.dest_port);
+ LOGD("clientBdData->user_data.headers[%d].u.wap_8.orig_port = 0x%02x\n", index, clientBdData->user_data.headers[index].u.wap_8.orig_port);
+#endif
+ data_buf[length++] = 2;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.wap_8.dest_port;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.wap_8.orig_port;
+ break;
+ case RIL_CDMA_SMS_UDH_PORT_16:
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.wap_16.dest_port = 0x%04x\n", index, clientBdData->user_data.headers[index].u.wap_16.dest_port);
+ LOGD("clientBdData->user_data.headers[%d].u.wap_16.orig_port = 0x%04x\n", index, clientBdData->user_data.headers[index].u.wap_16.orig_port);
+#endif
+ data_buf[length++] = 4;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.wap_16.dest_port & 0xFF00) >> 7; // unsigned short
+ data_buf[length++] = clientBdData->user_data.headers[index].u.wap_16.dest_port & 0x00FF;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.wap_16.orig_port & 0xFF00) >> 7; // unsigned short
+ data_buf[length++] = clientBdData->user_data.headers[index].u.wap_16.orig_port & 0x00FF;
+ break;
+ case RIL_CDMA_SMS_UDH_CONCAT_16:
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.msg_ref = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.msg_ref);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.total_sm = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.total_sm);
+ LOGD("clientBdData->user_data.headers[%d].u.concat_16.seq_num = 0x%04x\n", index, clientBdData->user_data.headers[index].u.concat_16.seq_num);
+#endif
+ data_buf[length++] = 4;
+ data_buf[length++] = (clientBdData->user_data.headers[index].u.concat_16.msg_ref & 0xFF00) >> 7; // unsigned short
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_16.msg_ref & 0x00FF;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_16.total_sm;
+ data_buf[length++] = clientBdData->user_data.headers[index].u.concat_16.seq_num;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (length != 0) {
+ arrData = env->NewByteArray((jsize)length);
+ env->SetByteArrayRegion(arrData, 0, length, data_buf);
+ }
+
+ return arrData;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetSmsAddress
+ (JNIEnv * env, jobject obj, jobject smsAddress)
+{
+ jclass SmsAddressClass;
+ jfieldID field;
+ jbyteArray arrData = NULL;
+ jbyte byte_buf[RIL_CDMA_SMS_ADDRESS_MAX];
+ int length;
+ jint intData;
+ jbyte byteData;
+ jboolean booleanData;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsSetSmsAddress()...\n");
+#endif
+
+ // callback.digit_mode
+ if (getObjectByteField(env, smsAddress, "digitMode", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->callback.digit_mode = (RIL_CDMA_SMS_DigitMode)(byteData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.digit_mode = 0x%02x\n", clientBdData->callback.digit_mode);
+#endif
+
+ // callback.number_mode
+ if (getObjectByteField(env, smsAddress, "numberMode", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->callback.number_mode = (RIL_CDMA_SMS_NumberMode)(byteData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_mode = 0x%02x\n", clientBdData->callback.number_mode);
+#endif
+
+ // callback.number_type
+ if (getObjectIntField(env, smsAddress, "ton", &intData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->callback.number_type = (RIL_CDMA_SMS_NumberType)(intData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_type = %d\n", clientBdData->callback.number_type);
+#endif
+
+ // callback.number_plan
+ if (getObjectByteField(env, smsAddress, "numberPlan", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->callback.number_plan = (RIL_CDMA_SMS_NumberPlan)(byteData);
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_plan = 0x%02x\n", clientBdData->callback.number_plan);
+#endif
+
+ // callback.number_of_digits
+ if (getObjectByteField(env, smsAddress, "numberOfDigits", &byteData) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ clientBdData->callback.number_of_digits = byteData;
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_of_digits = %d\n",clientBdData->callback.number_of_digits);
+#endif
+
+ // callback.digits
+ if (getObjectByteArrayField(env, smsAddress, "origBytes", byte_buf, &length) != JNI_SUCCESS)
+ return JNI_FAILURE;
+ for (int i = 0; i < clientBdData->callback.number_of_digits; i++) {
+ clientBdData->callback.digits[i] = byte_buf[i];
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.digits[%d] = 0x%02x\n", i, clientBdData->callback.digits[i]);
+#endif
+ }
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetSmsAddress
+ (JNIEnv * env, jobject obj, jobject smsAddress)
+{
+ jclass SmsAddressClass;
+ jfieldID field;
+ jbyteArray arrData = NULL;
+ jbyte *byte_buf;
+ int length;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsGetSmsAddress()...\n");
+#endif
+
+ // callback.digit_mode
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.digit_mode = 0x%02x\n", clientBdData->callback.digit_mode);
+#endif
+ if (setObjectByteField(env, smsAddress, "digitMode", (jbyte)clientBdData->callback.digit_mode) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // callback.number_mode
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_mode = 0x%02x\n", clientBdData->callback.number_mode);
+#endif
+ if (setObjectByteField(env, smsAddress, "numberMode", (jbyte)clientBdData->callback.number_mode) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // callback.number_type
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_type = %d\n", clientBdData->callback.number_type);
+#endif
+ if (setObjectIntField(env, smsAddress, "ton", (jint)clientBdData->callback.number_type) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // callback.number_plan
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_plan = 0x%02x\n", clientBdData->callback.number_plan);
+#endif
+ if (setObjectByteField(env, smsAddress, "numberPlan", (jbyte)clientBdData->callback.number_plan) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // callback.number_of_digits
+#ifdef DBG_LOG_LEVEL_A
+ LOGD("clientBdData->callback.number_of_digits = %d\n", clientBdData->callback.number_of_digits);
+#endif
+ if (setObjectByteField(env, smsAddress, "numberOfDigits", (jbyte)clientBdData->callback.number_of_digits) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ // callback.digits
+ byte_buf = (jbyte*)clientBdData->callback.digits;
+ length = clientBdData->callback.number_of_digits;
+#ifdef DBG_LOG_LEVEL_A
+ for (int i = 0; i < length; i++) {
+ LOGD("clientBdData->callback.digits[%d] = 0x%02x\n", i, clientBdData->callback.digits[i]);
+ }
+#endif
+
+ if (setObjectByteArrayField(env, smsAddress, "origBytes", byte_buf, length) != JNI_SUCCESS)
+ return JNI_FAILURE;
+
+ return JNI_SUCCESS;
+}
+
+
+/* native interface */
+JNIEXPORT jbyteArray JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsEncodeSms
+ (JNIEnv * env, jobject obj)
+{
+ RIL_CDMA_Encoded_SMS *encoded_sms = (RIL_CDMA_Encoded_SMS *)malloc(sizeof(RIL_CDMA_Encoded_SMS));
+ jbyte* data_buf;
+ jint result = JNI_SUCCESS;
+ jbyteArray encodedSMS;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsEncodeSms(): entry\n");
+#endif
+
+ if (NULL == encoded_sms) {
+ jniThrowException(env, "java/lang/NullPointerException", "encoded_sms is null");
+ return NULL;
+ }
+ memset(encoded_sms, 0, sizeof(RIL_CDMA_Encoded_SMS));
+
+ // call CDMA SMS encode function
+ if(wmsts_ril_cdma_encode_sms(clientBdData, encoded_sms) != RIL_E_SUCCESS) {
+ jniThrowException(env, "java/lang/Exception", "CDMA SMS Encoding failed");
+ return NULL;
+ }
+
+#ifdef DBG_LOG_LEVEL_A
+ LOGD(" EncodeSMS: length = %i\n", encoded_sms->length);
+#endif
+ encodedSMS = env->NewByteArray((jsize)encoded_sms->length);
+ env->SetByteArrayRegion(encodedSMS, 0, encoded_sms->length, (jbyte*)encoded_sms->data);
+ free(encoded_sms);
+
+ return encodedSMS;
+}
+
+
+/* native interface */
+JNIEXPORT jint JNICALL
+Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDecodeSms
+ (JNIEnv * env, jobject obj, jbyteArray encodedSMS)
+{
+ RIL_CDMA_Encoded_SMS *encoded_sms = (RIL_CDMA_Encoded_SMS *)malloc(sizeof(RIL_CDMA_Encoded_SMS));
+ jbyte* data_buf;
+ jint result = JNI_SUCCESS;
+ jsize length;
+
+#ifdef DBG_LOG_LEVEL_B
+ LOGD("nativeCdmaSmsDecodeSms(): entry\n");
+#endif
+
+ if (NULL == encoded_sms) {
+ jniThrowException(env, "java/lang/NullPointerException", "encoded_sms is null");
+ return JNI_FAILURE;
+ }
+ memset(encoded_sms, 0, sizeof(RIL_CDMA_Encoded_SMS));
+
+ length = env->GetArrayLength(encodedSMS);
+ if (length < 0 || length > 255) {
+ jniThrowException(env, "java/lang/ArrayIndexOutOfBounds", "wrong encoded SMS data length");
+ return JNI_FAILURE;
+ }
+ encoded_sms->length = length;
+#ifdef DBG_LOG_LEVEL_A
+ LOGD(" DecodeSMS: arrayLength = %d\n", encoded_sms->length);
+#endif
+ data_buf = env->GetByteArrayElements(encodedSMS, NULL);
+ encoded_sms->data = (unsigned char*)data_buf;
+ env->ReleaseByteArrayElements(encodedSMS, data_buf, 0);
+
+ // call CDMA SMS decode function
+ if(wmsts_ril_cdma_decode_sms(encoded_sms, clientBdData) != RIL_E_SUCCESS) {
+ jniThrowException(env, "java/lang/Exception", "CDMA SMS Decoding failed");
+ result = JNI_FAILURE;
+ }
+
+ free(encoded_sms);
+
+ return result;
+}
+
+
+// ---------------------------------------------------------------------------
+
+static const char *classPathName = "com/android/internal/telephony/cdma/sms/SmsDataCoding";
+
+static JNINativeMethod methods[] = {
+ /* name, signature, funcPtr */
+ {"nativeCdmaSmsConstructClientBD", "()I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsConstructClientBD },
+ {"nativeCdmaSmsDestructClientBD", "()I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDestructClientBD },
+ {"nativeCdmaSmsSetBearerDataPrimitives", "(Lcom/android/internal/telephony/cdma/sms/BearerData;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetBearerDataPrimitives },
+ {"nativeCdmaSmsGetBearerDataPrimitives", "(Lcom/android/internal/telephony/cdma/sms/BearerData;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetBearerDataPrimitives },
+ {"nativeCdmaSmsSetUserData", "(Lcom/android/internal/telephony/cdma/sms/UserData;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserData },
+ {"nativeCdmaSmsGetUserData", "(Lcom/android/internal/telephony/cdma/sms/UserData;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserData },
+ {"nativeCdmaSmsSetUserDataHeader", "(I[BII)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserDataHeader },
+ {"nativeCdmaSmsGetUserDataHeader", "()[B",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserDataHeader },
+ {"nativeCdmaSmsSetSmsAddress", "(Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetSmsAddress },
+ {"nativeCdmaSmsGetSmsAddress", "(Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetSmsAddress },
+ {"nativeCdmaSmsEncodeSms", "()[B",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsEncodeSms },
+ {"nativeCdmaSmsDecodeSms", "([B)I",
+ (void*)Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDecodeSms },
+};
+
+int register_android_cdma_sms_methods(JNIEnv *_env)
+{
+ return android::AndroidRuntime::registerNativeMethods(
+ _env, classPathName, methods, NELEM(methods));
+}
+
+// ---------------------------------------------------------------------------
+
+jint JNI_OnLoad(JavaVM* vm, void* reserved)
+{
+ JNIEnv* env = NULL;
+ jint result = -1;
+
+ if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ LOGE("ERROR: GetEnv failed\n");
+ goto bail;
+ }
+ assert(env != NULL);
+
+ if (register_android_cdma_sms_methods(env) < 0) {
+ LOGE("ERROR: CDMA SMS native registration failed\n");
+ goto bail;
+ }
+
+ /* success -- return valid version number */
+ result = JNI_VERSION_1_4;
+
+bail:
+ return result;
+}
diff --git a/telephony/jni/cdmasms/cdma_sms_jni.h b/telephony/jni/cdmasms/cdma_sms_jni.h
new file mode 100644
index 0000000..253c006
--- /dev/null
+++ b/telephony/jni/cdmasms/cdma_sms_jni.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 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.
+ * 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.
+ */
+
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_android_internal_telephony_cdma_sms_SmsDataCoding */
+
+#ifndef _Included_com_android_internal_telephony_cdma_sms_SmsDataCoding
+#define _Included_com_android_internal_telephony_cdma_sms_SmsDataCoding
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_NULL
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_NULL 0L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_MSG_ID
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_MSG_ID 1L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_USER_DATA
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_USER_DATA 2L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_MC_TIME
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_MC_TIME 8L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_NUM_OF_MSGS
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_NUM_OF_MSGS 2048L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_CALLBACK
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_CALLBACK 16384L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_DISPLAY_MODE
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_CDMA_SMS_WMS_MASK_BD_DISPLAY_MODE 32768L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_SUCCESS
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_SUCCESS 0L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_FAILURE
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_FAILURE 1L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_DATA_LEN_OUT_OF_RANGE
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_DATA_LEN_OUT_OF_RANGE 2L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_CLASS_UNKNOWN
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_CLASS_UNKNOWN 3L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_FIELD_ID_UNKNOWN
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_FIELD_ID_UNKNOWN 4L
+#undef com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_OUT_OF_MEMORY
+#define com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_OUT_OF_MEMORY 5L
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsConstructClientBD
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsConstructClientBD
+ (JNIEnv *, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsDestructClientBD
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDestructClientBD
+ (JNIEnv *, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsSetBearerDataPrimitives
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/BearerData;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetBearerDataPrimitives
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsGetBearerDataPrimitives
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/BearerData;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetBearerDataPrimitives
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsSetUserData
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/UserData;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserData
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsGetUserData
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/UserData;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserData
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsSetUserDataHeader
+ * Signature: (I[BII)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetUserDataHeader
+ (JNIEnv *, jobject, jint, jbyteArray, jint, jint);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsGetUserDataHeader
+ * Signature: ()[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetUserDataHeader
+ (JNIEnv *, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsSetSmsAddress
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsSetSmsAddress
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsGetSmsAddress
+ * Signature: (Lcom/android/internal/telephony/cdma/sms/CdmaSmsAddress;)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsGetSmsAddress
+ (JNIEnv *, jobject, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsEncodeSms
+ * Signature: ()[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsEncodeSms
+ (JNIEnv *, jobject);
+
+/*
+ * Class: com_android_internal_telephony_cdma_sms_SmsDataCoding
+ * Method: nativeCdmaSmsDecodeSms
+ * Signature: ([B)I
+ */
+JNIEXPORT jint JNICALL Java_com_android_internal_telephony_cdma_sms_SmsDataCoding_nativeCdmaSmsDecodeSms
+ (JNIEnv *, jobject, jbyteArray);
+
+/**
+ * CDMA SMS return value defines
+ */
+#define JNI_SUCCESS \
+com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_SUCCESS /**< Successful operation */
+#define JNI_FAILURE \
+com_android_internal_telephony_cdma_sms_SmsDataCoding_JNI_CDMA_SMS_FAILURE /**< General failure */
+
+#ifdef __cplusplus
+}
+#endif
+#endif