/* * Copyright (C) 2021 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. */ #define LOG_TAG "AGnssCbJni" #include "AGnssCallback.h" namespace android::gnss { using binder::Status; using hardware::Return; using hardware::Void; using IAGnssCallback_V1_0 = android::hardware::gnss::V1_0::IAGnssCallback; using IAGnssCallback_V2_0 = android::hardware::gnss::V2_0::IAGnssCallback; namespace { jmethodID method_reportAGpsStatus; } void AGnss_class_init_once(JNIEnv* env, jclass clazz) { method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V"); } Status AGnssCallbackAidl::agnssStatusCb(AGnssType type, AGnssStatusValue status) { AGnssCallbackUtil::agnssStatusCbImpl(type, status); return Status::ok(); } Return AGnssCallback_V1_0::agnssStatusIpV6Cb( const IAGnssCallback_V1_0::AGnssStatusIpV6& agps_status) { JNIEnv* env = getJniEnv(); jbyteArray byteArray = nullptr; byteArray = env->NewByteArray(16); if (byteArray != nullptr) { env->SetByteArrayRegion(byteArray, 0, 16, (const jbyte*)(agps_status.ipV6Addr.data())); } else { ALOGE("Unable to allocate byte array for IPv6 address."); } IF_ALOGD() { // log the IP for reference in case there is a bogus value pushed by HAL char str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, agps_status.ipV6Addr.data(), str, INET6_ADDRSTRLEN); ALOGD("AGPS IP is v6: %s", str); } jsize byteArrayLength = byteArray != nullptr ? env->GetArrayLength(byteArray) : 0; ALOGV("Passing AGPS IP addr: size %d", byteArrayLength); env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, agps_status.type, agps_status.status, byteArray); checkAndClearExceptionFromCallback(env, __FUNCTION__); if (byteArray) { env->DeleteLocalRef(byteArray); } return Void(); } Return AGnssCallback_V1_0::agnssStatusIpV4Cb( const IAGnssCallback_V1_0::AGnssStatusIpV4& agps_status) { JNIEnv* env = getJniEnv(); jbyteArray byteArray = nullptr; uint32_t ipAddr = agps_status.ipV4Addr; byteArray = convertToIpV4(ipAddr); IF_ALOGD() { /* * log the IP for reference in case there is a bogus value pushed by * HAL. */ char str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &ipAddr, str, INET_ADDRSTRLEN); ALOGD("AGPS IP is v4: %s", str); } jsize byteArrayLength = byteArray != nullptr ? env->GetArrayLength(byteArray) : 0; ALOGV("Passing AGPS IP addr: size %d", byteArrayLength); env->CallVoidMethod(mCallbacksObj, method_reportAGpsStatus, agps_status.type, agps_status.status, byteArray); checkAndClearExceptionFromCallback(env, __FUNCTION__); if (byteArray) { env->DeleteLocalRef(byteArray); } return Void(); } jbyteArray AGnssCallback_V1_0::convertToIpV4(uint32_t ip) { if (INADDR_NONE == ip) { return nullptr; } JNIEnv* env = getJniEnv(); jbyteArray byteArray = env->NewByteArray(4); if (byteArray == nullptr) { ALOGE("Unable to allocate byte array for IPv4 address"); return nullptr; } jbyte ipv4[4]; ALOGV("Converting IPv4 address byte array (net_order) %x", ip); memcpy(ipv4, &ip, sizeof(ipv4)); env->SetByteArrayRegion(byteArray, 0, 4, (const jbyte*)ipv4); return byteArray; } Return AGnssCallback_V2_0::agnssStatusCb(IAGnssCallback_V2_0::AGnssType type, IAGnssCallback_V2_0::AGnssStatusValue status) { AGnssCallbackUtil::agnssStatusCbImpl(type, status); return Void(); } } // namespace android::gnss