|  | /* | 
|  | * Copyright (C) 2020 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. | 
|  | */ | 
|  |  | 
|  | // This file was automatically generated by chre_api_to_chpp.py | 
|  | // Date: 2021-05-24 15:46:25 UTC | 
|  | // Source: chre_api/include/chre_api/chre/wwan.h @ commit 833a6241 | 
|  |  | 
|  | // DO NOT modify this file directly, as those changes will be lost the next | 
|  | // time the script is executed | 
|  |  | 
|  | #include "chpp/common/wwan_types.h" | 
|  | #include "chpp/macros.h" | 
|  | #include "chpp/memory.h" | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  | #include <string.h> | 
|  |  | 
|  | // Encoding (CHRE --> CHPP) size functions | 
|  |  | 
|  | //! @return number of bytes required to represent the given | 
|  | //! chreWwanCellInfoResult along with the CHPP header as | 
|  | //! struct ChppWwanCellInfoResultWithHeader | 
|  | static size_t chppWwanSizeOfCellInfoResultFromChre( | 
|  | const struct chreWwanCellInfoResult *cellInfoResult) { | 
|  | size_t encodedSize = sizeof(struct ChppWwanCellInfoResultWithHeader); | 
|  | encodedSize += | 
|  | cellInfoResult->cellInfoCount * sizeof(struct ChppWwanCellInfo); | 
|  | return encodedSize; | 
|  | } | 
|  |  | 
|  | // Encoding (CHRE --> CHPP) conversion functions | 
|  |  | 
|  | static void chppWwanConvertCellIdentityCdmaFromChre( | 
|  | const struct chreWwanCellIdentityCdma *in, | 
|  | struct ChppWwanCellIdentityCdma *out) { | 
|  | out->networkId = in->networkId; | 
|  | out->systemId = in->systemId; | 
|  | out->basestationId = in->basestationId; | 
|  | out->longitude = in->longitude; | 
|  | out->latitude = in->latitude; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthCdmaFromChre( | 
|  | const struct chreWwanSignalStrengthCdma *in, | 
|  | struct ChppWwanSignalStrengthCdma *out) { | 
|  | out->dbm = in->dbm; | 
|  | out->ecio = in->ecio; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthEvdoFromChre( | 
|  | const struct chreWwanSignalStrengthEvdo *in, | 
|  | struct ChppWwanSignalStrengthEvdo *out) { | 
|  | out->dbm = in->dbm; | 
|  | out->ecio = in->ecio; | 
|  | out->signalNoiseRatio = in->signalNoiseRatio; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoCdmaFromChre( | 
|  | const struct chreWwanCellInfoCdma *in, struct ChppWwanCellInfoCdma *out) { | 
|  | chppWwanConvertCellIdentityCdmaFromChre(&in->cellIdentityCdma, | 
|  | &out->cellIdentityCdma); | 
|  | chppWwanConvertSignalStrengthCdmaFromChre(&in->signalStrengthCdma, | 
|  | &out->signalStrengthCdma); | 
|  | chppWwanConvertSignalStrengthEvdoFromChre(&in->signalStrengthEvdo, | 
|  | &out->signalStrengthEvdo); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellIdentityGsmFromChre( | 
|  | const struct chreWwanCellIdentityGsm *in, | 
|  | struct ChppWwanCellIdentityGsm *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->arfcn = in->arfcn; | 
|  | out->bsic = in->bsic; | 
|  | memset(&out->reserved, 0, sizeof(out->reserved)); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthGsmFromChre( | 
|  | const struct chreWwanSignalStrengthGsm *in, | 
|  | struct ChppWwanSignalStrengthGsm *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->bitErrorRate = in->bitErrorRate; | 
|  | out->timingAdvance = in->timingAdvance; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoGsmFromChre( | 
|  | const struct chreWwanCellInfoGsm *in, struct ChppWwanCellInfoGsm *out) { | 
|  | chppWwanConvertCellIdentityGsmFromChre(&in->cellIdentityGsm, | 
|  | &out->cellIdentityGsm); | 
|  | chppWwanConvertSignalStrengthGsmFromChre(&in->signalStrengthGsm, | 
|  | &out->signalStrengthGsm); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellIdentityLteFromChre( | 
|  | const struct chreWwanCellIdentityLte *in, | 
|  | struct ChppWwanCellIdentityLte *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->ci = in->ci; | 
|  | out->pci = in->pci; | 
|  | out->tac = in->tac; | 
|  | out->earfcn = in->earfcn; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthLteFromChre( | 
|  | const struct chreWwanSignalStrengthLte *in, | 
|  | struct ChppWwanSignalStrengthLte *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->rsrp = in->rsrp; | 
|  | out->rsrq = in->rsrq; | 
|  | out->rssnr = in->rssnr; | 
|  | out->cqi = in->cqi; | 
|  | out->timingAdvance = in->timingAdvance; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoLteFromChre( | 
|  | const struct chreWwanCellInfoLte *in, struct ChppWwanCellInfoLte *out) { | 
|  | chppWwanConvertCellIdentityLteFromChre(&in->cellIdentityLte, | 
|  | &out->cellIdentityLte); | 
|  | chppWwanConvertSignalStrengthLteFromChre(&in->signalStrengthLte, | 
|  | &out->signalStrengthLte); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellIdentityNrFromChre( | 
|  | const struct chreWwanCellIdentityNr *in, | 
|  | struct ChppWwanCellIdentityNr *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->nci0 = in->nci0; | 
|  | out->nci1 = in->nci1; | 
|  | out->pci = in->pci; | 
|  | out->tac = in->tac; | 
|  | out->nrarfcn = in->nrarfcn; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthNrFromChre( | 
|  | const struct chreWwanSignalStrengthNr *in, | 
|  | struct ChppWwanSignalStrengthNr *out) { | 
|  | out->ssRsrp = in->ssRsrp; | 
|  | out->ssRsrq = in->ssRsrq; | 
|  | out->ssSinr = in->ssSinr; | 
|  | out->csiRsrp = in->csiRsrp; | 
|  | out->csiRsrq = in->csiRsrq; | 
|  | out->csiSinr = in->csiSinr; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoNrFromChre( | 
|  | const struct chreWwanCellInfoNr *in, struct ChppWwanCellInfoNr *out) { | 
|  | chppWwanConvertCellIdentityNrFromChre(&in->cellIdentityNr, | 
|  | &out->cellIdentityNr); | 
|  | chppWwanConvertSignalStrengthNrFromChre(&in->signalStrengthNr, | 
|  | &out->signalStrengthNr); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellIdentityTdscdmaFromChre( | 
|  | const struct chreWwanCellIdentityTdscdma *in, | 
|  | struct ChppWwanCellIdentityTdscdma *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->cpid = in->cpid; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthTdscdmaFromChre( | 
|  | const struct chreWwanSignalStrengthTdscdma *in, | 
|  | struct ChppWwanSignalStrengthTdscdma *out) { | 
|  | out->rscp = in->rscp; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoTdscdmaFromChre( | 
|  | const struct chreWwanCellInfoTdscdma *in, | 
|  | struct ChppWwanCellInfoTdscdma *out) { | 
|  | chppWwanConvertCellIdentityTdscdmaFromChre(&in->cellIdentityTdscdma, | 
|  | &out->cellIdentityTdscdma); | 
|  | chppWwanConvertSignalStrengthTdscdmaFromChre(&in->signalStrengthTdscdma, | 
|  | &out->signalStrengthTdscdma); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellIdentityWcdmaFromChre( | 
|  | const struct chreWwanCellIdentityWcdma *in, | 
|  | struct ChppWwanCellIdentityWcdma *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->psc = in->psc; | 
|  | out->uarfcn = in->uarfcn; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertSignalStrengthWcdmaFromChre( | 
|  | const struct chreWwanSignalStrengthWcdma *in, | 
|  | struct ChppWwanSignalStrengthWcdma *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->bitErrorRate = in->bitErrorRate; | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoWcdmaFromChre( | 
|  | const struct chreWwanCellInfoWcdma *in, struct ChppWwanCellInfoWcdma *out) { | 
|  | chppWwanConvertCellIdentityWcdmaFromChre(&in->cellIdentityWcdma, | 
|  | &out->cellIdentityWcdma); | 
|  | chppWwanConvertSignalStrengthWcdmaFromChre(&in->signalStrengthWcdma, | 
|  | &out->signalStrengthWcdma); | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoFromChre(const struct chreWwanCellInfo *in, | 
|  | struct ChppWwanCellInfo *out) { | 
|  | out->timeStamp = in->timeStamp; | 
|  | out->cellInfoType = in->cellInfoType; | 
|  | out->timeStampType = in->timeStampType; | 
|  | out->registered = in->registered; | 
|  | out->reserved = 0; | 
|  | memset(&out->CellInfo, 0, sizeof(out->CellInfo)); | 
|  | switch (in->cellInfoType) { | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_GSM: | 
|  | chppWwanConvertCellInfoGsmFromChre(&in->CellInfo.gsm, &out->CellInfo.gsm); | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_CDMA: | 
|  | chppWwanConvertCellInfoCdmaFromChre(&in->CellInfo.cdma, | 
|  | &out->CellInfo.cdma); | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_LTE: | 
|  | chppWwanConvertCellInfoLteFromChre(&in->CellInfo.lte, &out->CellInfo.lte); | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_WCDMA: | 
|  | chppWwanConvertCellInfoWcdmaFromChre(&in->CellInfo.wcdma, | 
|  | &out->CellInfo.wcdma); | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_TD_SCDMA: | 
|  | chppWwanConvertCellInfoTdscdmaFromChre(&in->CellInfo.tdscdma, | 
|  | &out->CellInfo.tdscdma); | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_NR: | 
|  | chppWwanConvertCellInfoNrFromChre(&in->CellInfo.nr, &out->CellInfo.nr); | 
|  | break; | 
|  | default: | 
|  | CHPP_ASSERT(false); | 
|  | } | 
|  | } | 
|  |  | 
|  | static void chppWwanConvertCellInfoResultFromChre( | 
|  | const struct chreWwanCellInfoResult *in, struct ChppWwanCellInfoResult *out, | 
|  | uint8_t *payload, size_t payloadSize, uint16_t *vlaOffset) { | 
|  | out->version = CHRE_WWAN_CELL_INFO_RESULT_VERSION; | 
|  | out->errorCode = in->errorCode; | 
|  | out->cellInfoCount = in->cellInfoCount; | 
|  | out->reserved = 0; | 
|  | out->cookie = 0; | 
|  |  | 
|  | struct ChppWwanCellInfo *cells = | 
|  | (struct ChppWwanCellInfo *)&payload[*vlaOffset]; | 
|  | out->cells.length = in->cellInfoCount * sizeof(struct ChppWwanCellInfo); | 
|  | CHPP_ASSERT((size_t)(*vlaOffset + out->cells.length) <= payloadSize); | 
|  | if (out->cells.length > 0 && *vlaOffset + out->cells.length <= payloadSize) { | 
|  | for (size_t i = 0; i < in->cellInfoCount; i++) { | 
|  | chppWwanConvertCellInfoFromChre(&in->cells[i], &cells[i]); | 
|  | } | 
|  | out->cells.offset = *vlaOffset; | 
|  | *vlaOffset += out->cells.length; | 
|  | } else { | 
|  | out->cells.offset = 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Encoding (CHRE --> CHPP) top-level functions | 
|  |  | 
|  | bool chppWwanCellInfoResultFromChre( | 
|  | const struct chreWwanCellInfoResult *in, | 
|  | struct ChppWwanCellInfoResultWithHeader **out, size_t *outSize) { | 
|  | CHPP_NOT_NULL(out); | 
|  | CHPP_NOT_NULL(outSize); | 
|  |  | 
|  | size_t payloadSize = chppWwanSizeOfCellInfoResultFromChre(in); | 
|  | *out = chppMalloc(payloadSize); | 
|  | if (*out != NULL) { | 
|  | uint8_t *payload = (uint8_t *)&(*out)->payload; | 
|  | uint16_t vlaOffset = sizeof(struct ChppWwanCellInfoResult); | 
|  | chppWwanConvertCellInfoResultFromChre(in, &(*out)->payload, payload, | 
|  | payloadSize, &vlaOffset); | 
|  | *outSize = payloadSize; | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | // Decoding (CHPP --> CHRE) conversion functions | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityCdmaToChre( | 
|  | const struct ChppWwanCellIdentityCdma *in, | 
|  | struct chreWwanCellIdentityCdma *out) { | 
|  | out->networkId = in->networkId; | 
|  | out->systemId = in->systemId; | 
|  | out->basestationId = in->basestationId; | 
|  | out->longitude = in->longitude; | 
|  | out->latitude = in->latitude; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthCdmaToChre( | 
|  | const struct ChppWwanSignalStrengthCdma *in, | 
|  | struct chreWwanSignalStrengthCdma *out) { | 
|  | out->dbm = in->dbm; | 
|  | out->ecio = in->ecio; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthEvdoToChre( | 
|  | const struct ChppWwanSignalStrengthEvdo *in, | 
|  | struct chreWwanSignalStrengthEvdo *out) { | 
|  | out->dbm = in->dbm; | 
|  | out->ecio = in->ecio; | 
|  | out->signalNoiseRatio = in->signalNoiseRatio; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoCdmaToChre( | 
|  | const struct ChppWwanCellInfoCdma *in, struct chreWwanCellInfoCdma *out) { | 
|  | if (!chppWwanConvertCellIdentityCdmaToChre(&in->cellIdentityCdma, | 
|  | &out->cellIdentityCdma)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthCdmaToChre(&in->signalStrengthCdma, | 
|  | &out->signalStrengthCdma)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthEvdoToChre(&in->signalStrengthEvdo, | 
|  | &out->signalStrengthEvdo)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityGsmToChre( | 
|  | const struct ChppWwanCellIdentityGsm *in, | 
|  | struct chreWwanCellIdentityGsm *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->arfcn = in->arfcn; | 
|  | out->bsic = in->bsic; | 
|  | memset(&out->reserved, 0, sizeof(out->reserved)); | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthGsmToChre( | 
|  | const struct ChppWwanSignalStrengthGsm *in, | 
|  | struct chreWwanSignalStrengthGsm *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->bitErrorRate = in->bitErrorRate; | 
|  | out->timingAdvance = in->timingAdvance; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoGsmToChre( | 
|  | const struct ChppWwanCellInfoGsm *in, struct chreWwanCellInfoGsm *out) { | 
|  | if (!chppWwanConvertCellIdentityGsmToChre(&in->cellIdentityGsm, | 
|  | &out->cellIdentityGsm)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthGsmToChre(&in->signalStrengthGsm, | 
|  | &out->signalStrengthGsm)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityLteToChre( | 
|  | const struct ChppWwanCellIdentityLte *in, | 
|  | struct chreWwanCellIdentityLte *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->ci = in->ci; | 
|  | out->pci = in->pci; | 
|  | out->tac = in->tac; | 
|  | out->earfcn = in->earfcn; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthLteToChre( | 
|  | const struct ChppWwanSignalStrengthLte *in, | 
|  | struct chreWwanSignalStrengthLte *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->rsrp = in->rsrp; | 
|  | out->rsrq = in->rsrq; | 
|  | out->rssnr = in->rssnr; | 
|  | out->cqi = in->cqi; | 
|  | out->timingAdvance = in->timingAdvance; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoLteToChre( | 
|  | const struct ChppWwanCellInfoLte *in, struct chreWwanCellInfoLte *out) { | 
|  | if (!chppWwanConvertCellIdentityLteToChre(&in->cellIdentityLte, | 
|  | &out->cellIdentityLte)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthLteToChre(&in->signalStrengthLte, | 
|  | &out->signalStrengthLte)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityNrToChre( | 
|  | const struct ChppWwanCellIdentityNr *in, | 
|  | struct chreWwanCellIdentityNr *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->nci0 = in->nci0; | 
|  | out->nci1 = in->nci1; | 
|  | out->pci = in->pci; | 
|  | out->tac = in->tac; | 
|  | out->nrarfcn = in->nrarfcn; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthNrToChre( | 
|  | const struct ChppWwanSignalStrengthNr *in, | 
|  | struct chreWwanSignalStrengthNr *out) { | 
|  | out->ssRsrp = in->ssRsrp; | 
|  | out->ssRsrq = in->ssRsrq; | 
|  | out->ssSinr = in->ssSinr; | 
|  | out->csiRsrp = in->csiRsrp; | 
|  | out->csiRsrq = in->csiRsrq; | 
|  | out->csiSinr = in->csiSinr; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoNrToChre(const struct ChppWwanCellInfoNr *in, | 
|  | struct chreWwanCellInfoNr *out) { | 
|  | if (!chppWwanConvertCellIdentityNrToChre(&in->cellIdentityNr, | 
|  | &out->cellIdentityNr)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthNrToChre(&in->signalStrengthNr, | 
|  | &out->signalStrengthNr)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityTdscdmaToChre( | 
|  | const struct ChppWwanCellIdentityTdscdma *in, | 
|  | struct chreWwanCellIdentityTdscdma *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->cpid = in->cpid; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthTdscdmaToChre( | 
|  | const struct ChppWwanSignalStrengthTdscdma *in, | 
|  | struct chreWwanSignalStrengthTdscdma *out) { | 
|  | out->rscp = in->rscp; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoTdscdmaToChre( | 
|  | const struct ChppWwanCellInfoTdscdma *in, | 
|  | struct chreWwanCellInfoTdscdma *out) { | 
|  | if (!chppWwanConvertCellIdentityTdscdmaToChre(&in->cellIdentityTdscdma, | 
|  | &out->cellIdentityTdscdma)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthTdscdmaToChre( | 
|  | &in->signalStrengthTdscdma, &out->signalStrengthTdscdma)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellIdentityWcdmaToChre( | 
|  | const struct ChppWwanCellIdentityWcdma *in, | 
|  | struct chreWwanCellIdentityWcdma *out) { | 
|  | out->mcc = in->mcc; | 
|  | out->mnc = in->mnc; | 
|  | out->lac = in->lac; | 
|  | out->cid = in->cid; | 
|  | out->psc = in->psc; | 
|  | out->uarfcn = in->uarfcn; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertSignalStrengthWcdmaToChre( | 
|  | const struct ChppWwanSignalStrengthWcdma *in, | 
|  | struct chreWwanSignalStrengthWcdma *out) { | 
|  | out->signalStrength = in->signalStrength; | 
|  | out->bitErrorRate = in->bitErrorRate; | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoWcdmaToChre( | 
|  | const struct ChppWwanCellInfoWcdma *in, struct chreWwanCellInfoWcdma *out) { | 
|  | if (!chppWwanConvertCellIdentityWcdmaToChre(&in->cellIdentityWcdma, | 
|  | &out->cellIdentityWcdma)) { | 
|  | return false; | 
|  | } | 
|  | if (!chppWwanConvertSignalStrengthWcdmaToChre(&in->signalStrengthWcdma, | 
|  | &out->signalStrengthWcdma)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoToChre(const struct ChppWwanCellInfo *in, | 
|  | struct chreWwanCellInfo *out) { | 
|  | out->timeStamp = in->timeStamp; | 
|  | out->cellInfoType = in->cellInfoType; | 
|  | out->timeStampType = in->timeStampType; | 
|  | out->registered = in->registered; | 
|  | out->reserved = 0; | 
|  | memset(&out->CellInfo, 0, sizeof(out->CellInfo)); | 
|  | switch (in->cellInfoType) { | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_GSM: | 
|  | if (!chppWwanConvertCellInfoGsmToChre(&in->CellInfo.gsm, | 
|  | &out->CellInfo.gsm)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_CDMA: | 
|  | if (!chppWwanConvertCellInfoCdmaToChre(&in->CellInfo.cdma, | 
|  | &out->CellInfo.cdma)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_LTE: | 
|  | if (!chppWwanConvertCellInfoLteToChre(&in->CellInfo.lte, | 
|  | &out->CellInfo.lte)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_WCDMA: | 
|  | if (!chppWwanConvertCellInfoWcdmaToChre(&in->CellInfo.wcdma, | 
|  | &out->CellInfo.wcdma)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_TD_SCDMA: | 
|  | if (!chppWwanConvertCellInfoTdscdmaToChre(&in->CellInfo.tdscdma, | 
|  | &out->CellInfo.tdscdma)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | case CHRE_WWAN_CELL_INFO_TYPE_NR: | 
|  | if (!chppWwanConvertCellInfoNrToChre(&in->CellInfo.nr, | 
|  | &out->CellInfo.nr)) { | 
|  | return false; | 
|  | } | 
|  | break; | 
|  | default: | 
|  | CHPP_ASSERT(false); | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | static bool chppWwanConvertCellInfoResultToChre( | 
|  | const struct ChppWwanCellInfoResult *in, struct chreWwanCellInfoResult *out, | 
|  | size_t inSize) { | 
|  | out->version = CHRE_WWAN_CELL_INFO_RESULT_VERSION; | 
|  | out->errorCode = in->errorCode; | 
|  | out->cellInfoCount = in->cellInfoCount; | 
|  | out->reserved = 0; | 
|  | out->cookie = 0; | 
|  |  | 
|  | if (in->cells.length == 0) { | 
|  | out->cells = NULL; | 
|  | } else { | 
|  | if (in->cells.offset + in->cells.length > inSize || | 
|  | in->cells.length != | 
|  | in->cellInfoCount * sizeof(struct ChppWwanCellInfo)) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | const struct ChppWwanCellInfo *cellsIn = (const struct ChppWwanCellInfo *)&( | 
|  | (const uint8_t *)in)[in->cells.offset]; | 
|  |  | 
|  | struct chreWwanCellInfo *cellsOut = | 
|  | chppMalloc(in->cellInfoCount * sizeof(struct chreWwanCellInfo)); | 
|  | if (cellsOut == NULL) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | for (size_t i = 0; i < in->cellInfoCount; i++) { | 
|  | if (!chppWwanConvertCellInfoToChre(&cellsIn[i], &cellsOut[i])) { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | out->cells = cellsOut; | 
|  | } | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | // Decoding (CHPP --> CHRE) top-level functions | 
|  |  | 
|  | struct chreWwanCellInfoResult *chppWwanCellInfoResultToChre( | 
|  | const struct ChppWwanCellInfoResult *in, size_t inSize) { | 
|  | struct chreWwanCellInfoResult *out = NULL; | 
|  |  | 
|  | if (inSize >= sizeof(struct ChppWwanCellInfoResult)) { | 
|  | out = chppMalloc(sizeof(struct chreWwanCellInfoResult)); | 
|  | if (out != NULL) { | 
|  | if (!chppWwanConvertCellInfoResultToChre(in, out, inSize)) { | 
|  | CHPP_FREE_AND_NULLIFY(out); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return out; | 
|  | } |