1e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung/*
2e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Copyright (C) 2015 The Android Open Source Project
3e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
4e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Licensed under the Apache License, Version 2.0 (the "License");
5e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * you may not use this file except in compliance with the License.
6e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * You may obtain a copy of the License at
7e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
8e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *      http://www.apache.org/licenses/LICENSE-2.0
9e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung *
10e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * Unless required by applicable law or agreed to in writing, software
11e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * distributed under the License is distributed on an "AS IS" BASIS,
12e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * See the License for the specific language governing permissions and
14e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung * limitations under the License.
15e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung */
16e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
17d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung#define LOG_TAG "VehicleNetwork"
18d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung
19d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung#include <utils/Log.h>
20d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung
21e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include <IVehicleNetwork.h>
22e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung#include "VehicleNetworkProtoUtil.h"
23e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
24e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungnamespace android {
25e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
26e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatic status_t copyString(const std::string& in, uint8_t** out, int32_t* len) {
27e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    *len = in.length();
287d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    if (*len == 0) {
297d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        *out = NULL;
307d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        return NO_ERROR;
317d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    }
32e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    *out = new uint8_t[*len];
33e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    ASSERT_OR_HANDLE_NO_MEMORY(*out, return NO_MEMORY);
34e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    memcpy(*out, in.data(), *len);
35e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
36e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
37e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
38e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::toVehiclePropValue(const vehicle_prop_value_t& in,
39e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        VehiclePropValue& out, bool /*inPlace*/) {
40e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_prop(in.prop);
41e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_value_type(in.value_type);
42e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_timestamp(in.timestamp);
4371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park    out.set_zone(in.zone);
44e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    switch (in.value_type) {
45e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_STRING: {
46e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            //TODO fix ugly copy here for inplace mode
477d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            if (in.value.str_value.len > 0) {
487d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                out.set_string_value((char*)in.value.str_value.data, in.value.str_value.len);
497d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            }
50e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
51e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_BYTES: {
527d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            if (in.value.bytes_value.len > 0) {
537d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                out.set_bytes_value(in.value.bytes_value.data, in.value.bytes_value.len);
547d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            }
55e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
56e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_FLOAT:
57d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
58d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
59d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
60e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_FLOAT + 1;
61d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            for (int i = 0; i < expectedSize; i++) {
62d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                out.add_float_values(in.value.float_array[i]);
63d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
64e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
65e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT64: {
66e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            out.set_int64_value(in.value.int64_value);
67e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
6871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_BOOLEAN:
6971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
70d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            out.add_int32_values(in.value.int32_value);
71d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        } break;
72e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_INT32:
73d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC2:
74d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC3:
75d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC4: {
76e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_INT32 + 1;
77d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            for (int i = 0; i < expectedSize; i++) {
78d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                out.add_int32_values(in.value.int32_array[i]);
79d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
80e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
81e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_ZONED_INT32:
82e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
8371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
8471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
8571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
86e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            for (int i = 0; i < expectedSize; i++) {
8771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.add_int32_values(in.value.int32_array[i]);
88e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            }
89e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
90e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
91e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
9271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
9371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
94e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            int expectedSize = in.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
95e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            for (int i = 0; i < expectedSize; i++) {
9671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.add_float_values(in.value.float_array[i]);
97e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            }
98e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
99e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
100e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
101e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
102e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
103e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::fromVehiclePropValue(const VehiclePropValue& in,
1047d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        vehicle_prop_value_t& out, bool /*inPlace*/, bool canIgnoreNoData) {
105e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.prop = in.prop();
106e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.value_type = in.value_type();
107e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.timestamp = in.timestamp();
10871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park    out.zone = in.zone();
109e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    switch (out.value_type) {
110e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_STRING: {
111e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            if (!in.has_string_value()) {
112e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                // set to NULL so that client can just delete this safely.
113e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.str_value.data = NULL;
114e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.str_value.len = 0;
1157d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1167d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1177d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                } else {
1187d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    ALOGE("fromVehiclePropValue, no string data");
1197d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return BAD_VALUE;
1207d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
121e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
122e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            //TODO fix copy...
123e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            status_t r = copyString(in.string_value(), &(out.value.str_value.data),
124e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                    &(out.value.str_value.len));
125e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            if (r != NO_ERROR) {
126e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.str_value.data = NULL;
127e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.str_value.len = 0;
1287d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                ALOGE("copyString for string failed %d", r);
129e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return r;
130e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
131e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
132e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_BYTES: {
133e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            if (!in.has_bytes_value()) {
134e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.bytes_value.data = NULL;
135e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.bytes_value.len = 0;
1367d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1377d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1387d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                } else {
1397d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    ALOGE("fromVehiclePropValue, no byte data");
1407d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return BAD_VALUE;
1417d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
142e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
143e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            status_t r = copyString(in.bytes_value(), &(out.value.bytes_value.data),
144e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                    &(out.value.bytes_value.len));
145e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            if (r != NO_ERROR) {
146e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.bytes_value.data = NULL;
147e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                out.value.bytes_value.len = 0;
1487d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                ALOGE("copyString for bytes failed %d", r);
149e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return r;
150e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
151e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
15271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_FLOAT:
153d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
154d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
155d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
15671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_FLOAT + 1;
157d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            if (in.float_values_size() != expectedSize) {
1587d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1597d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1607d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
161d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ALOGE("float value, wrong size %d, expecting %d", in.float_values_size(),
162d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                        expectedSize);
163d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                return BAD_VALUE;
164d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
165d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            for (int i = 0; i < expectedSize; i++) {
166d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                out.value.float_array[i] = in.float_values(i);
167d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
168e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
169e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT64: {
170e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            if (!in.has_int64_value()) {
1717d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1727d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1737d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
174d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ALOGE("no int64 value");
175e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return BAD_VALUE;
176e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
177e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            out.value.int64_value = in.int64_value();
178e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
17971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_BOOLEAN:
18071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN: {
181d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            if (in.int32_values_size() != 1) {
1827d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1837d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1847d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
185d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ALOGE("no int32 value");
186e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return BAD_VALUE;
187e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
188d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            out.value.int32_value = in.int32_values(0);
189d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        } break;
190e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_INT32:
191d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC2:
192d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC3:
193d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        case VEHICLE_VALUE_TYPE_INT32_VEC4: {
194e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_INT32 + 1;
195d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            if (in.int32_values_size() != expectedSize) {
1967d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
1977d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
1987d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
199d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                ALOGE("int32 value, wrong size %d, expecting %d", in.int32_values_size(),
200d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                        expectedSize);
201d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                return BAD_VALUE;
202d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
203d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            for (int i = 0; i < expectedSize; i++) {
204d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung                out.value.int32_array[i] = in.int32_values(i);
205d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            }
206e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
20771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park
208e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_ZONED_INT32:
209e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
21071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
21171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
21271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_INT32 + 1;
21371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (in.int32_values_size() != expectedSize) {
2147d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
2157d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
2167d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
21771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ALOGE("int32 value, wrong size %d, expecting %d", in.int32_values_size(),
21871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        expectedSize);
219e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return BAD_VALUE;
220e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
221e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            for (int i = 0; i < expectedSize; i++) {
22271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.value.int32_array[i] = in.int32_values(i);
223e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            }
224e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
225e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
226e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
22771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
22871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:{
229e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            int expectedSize = out.value_type - VEHICLE_VALUE_TYPE_ZONED_FLOAT + 1;
23071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (in.float_values_size() != expectedSize) {
2317d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                if (canIgnoreNoData) {
2327d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                    return NO_ERROR;
2337d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                }
23471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ALOGE("float value, wrong size %d, expecting %d", in.float_values_size(),
23571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        expectedSize);
236e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                return BAD_VALUE;
237e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
238e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            for (int i = 0; i < expectedSize; i++) {
23971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.value.float_array[i] = in.float_values(i);
240e4b186ee15e9e60c702418405468d7e502942d66Keun-young Park            }
241e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
2427d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        default: {
2437d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            if (canIgnoreNoData) {
2447d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung                return NO_ERROR;
2457d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            }
2467d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            ALOGE("fromVehiclePropValue unknown type 0x%x", out.value_type);
247e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            return BAD_VALUE;
2487d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        }
249e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
250e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
251e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
252e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
253e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::toVehiclePropValues(const List<vehicle_prop_value_t*>& in,
254e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            VehiclePropValues& out) {
255e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    status_t r;
256e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    for (auto& v : in) {
257e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        VehiclePropValue* value = out.add_values();
258e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        r = toVehiclePropValue(*v, *value);
259e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (r != NO_ERROR) {
260e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            out.clear_values();
261e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            return r;
262e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
263e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
264e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
265e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
266e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
267e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::fromVehiclePropValues(const VehiclePropValues& in,
268e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            List<vehicle_prop_value_t*>& out) {
269e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    status_t r;
270e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    for (int i = 0; i < in.values_size(); i++) {
271e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        vehicle_prop_value_t* v =  new vehicle_prop_value_t();
272e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        memset(v, 0, sizeof(vehicle_prop_value_t));
273e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        ASSERT_OR_HANDLE_NO_MEMORY(v, r = NO_MEMORY;goto error);
2745af1fda8f73c63f3d54d022357a861524fef4d6cKeun-young Park        r = fromVehiclePropValue(in.values(i), *v);
275e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (r != NO_ERROR) {
276e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            delete v;
277e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            goto error;
278e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
279e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        out.push_back(v);
280e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
281e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
282e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungerror:
283e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    // clean up everything in List
284e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    for (auto pv : out) {
285e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        VehiclePropValueUtil::deleteMembers(pv);
286e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
287e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return r;
288e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
289e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
290e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::toVehiclePropConfig(const vehicle_prop_config_t& in,
291e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        VehiclePropConfig& out) {
292e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_prop(in.prop);
293e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_access(in.access);
294e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_change_mode(in.change_mode);
295e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_value_type(in.value_type);
296e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_permission_model(in.permission_model);
29771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park    out.set_zones(in.vehicle_zone_flags);
2980727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    for (unsigned int i = 0; i < sizeof(in.config_array) / sizeof(int32_t); i++) {
2990727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park        out.add_config_array(in.config_array[i]);
3000727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    }
301e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    if (in.config_string.data != NULL && in.config_string.len != 0) {
302e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        out.set_config_string((char*)in.config_string.data, in.config_string.len);
303e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    } else {
304e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        out.clear_config_string();
305e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
306e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    switch (in.value_type) {
307e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_FLOAT:
308450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
309450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
31071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
31171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_float_maxs(in.float_max_value);
31271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_float_mins(in.float_min_value);
31371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        } break;
314450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
315450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
31671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
31771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
31871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int numZones = VehicleNetworkUtil::countNumberOfZones(in.vehicle_zone_flags);
31971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (in.float_min_values == NULL) {
32071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (in.float_max_values == NULL) {
32171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    // all the same min/max
32271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    for (int i = 0; i < numZones; i++) {
32371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_float_maxs(in.float_max_value);
32471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_float_mins(in.float_min_value);
32571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    }
32671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                } else { // invalid combination
32771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, min_values NULL while max_values not NULL",
32871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                            in.prop);
32971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
33071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
33171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else {
33271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (in.float_max_values != NULL) {
33371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    for (int i = 0; i < numZones; i++) {
33471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_float_maxs(in.float_max_values[i]);
33571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_float_mins(in.float_min_values[i]);
33671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    }
33771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                } else { // invalid combination
33871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, max_values NULL while min_values not NULL",
33971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                            in.prop);
34071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
34171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
34271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
343e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
344e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT64: {
34571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_int64_maxs(in.int64_max_value);
34671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_int64_mins(in.int64_min_value);
347e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
348e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT32:
349450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC2:
350450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC3:
35171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC4:  {
35271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_int32_maxs(in.int32_max_value);
35371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            out.add_int32_mins(in.int32_min_value);
35471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        } break;
355450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32:
356450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
35771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
35871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
35971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int numZones = VehicleNetworkUtil::countNumberOfZones(in.vehicle_zone_flags);
36071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (in.int32_min_values == NULL) {
36171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (in.int32_max_values == NULL) {
36271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    // all the same min/max
36371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    for (int i = 0; i < numZones; i++) {
36471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_int32_maxs(in.int32_max_value);
36571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_int32_mins(in.int32_min_value);
36671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    }
36771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                } else { // invalid combination
36871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, min_values NULL while max_values not NULL",
36971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                            in.prop);
37071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
37171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
37271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else {
37371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (in.int32_max_values != NULL) {
37471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    for (int i = 0; i < numZones; i++) {
37571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_int32_maxs(in.int32_max_values[i]);
37671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        out.add_int32_mins(in.int32_min_values[i]);
37771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    }
37871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                } else { // invalid combination
37971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, max_values NULL while min_values not NULL",
38071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                            in.prop);
38171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
38271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
38371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
384e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
385e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
386e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_sample_rate_max(in.max_sample_rate);
387e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.set_sample_rate_min(in.min_sample_rate);
388e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
389e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
390e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
391e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::fromVehiclePropConfig(const VehiclePropConfig& in,
392e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        vehicle_prop_config_t& out) {
393e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.prop = in.prop();
394e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.access = in.access();
395e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.change_mode = in.change_mode();
396e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.value_type = in.value_type();
397e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.permission_model = in.permission_model();
39871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park    out.vehicle_zone_flags = in.zones();
3990727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    int maxConfigSize = sizeof(out.config_array) / sizeof(int32_t);
4000727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    int configSize = in.config_array_size();
4010727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    if (configSize > maxConfigSize) {
4020727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park        return BAD_VALUE;
4030727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    }
4040727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    int i = 0;
4050727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    for (; i < configSize; i++) {
4060727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park        out.config_array[i] = in.config_array(i);
4070727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    }
4080727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    for (; i < maxConfigSize; i++) {
4090727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park        out.config_array[i] = 0;
4100727f9536803bf13e49ff73bd1ed04489b592c56Keun-young Park    }
411e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    if (in.has_config_string()) {
412e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        status_t r = copyString(in.config_string(), &(out.config_string.data),
413e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung                &(out.config_string.len));
414e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (r != NO_ERROR) {
415e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            return r;
416e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
417e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    } else {
418e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        out.config_string.data = NULL;
419e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        out.config_string.len = 0;
420e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
421e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    switch (out.value_type) {
422e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_FLOAT:
423450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
424450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
42571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_FLOAT_VEC4: {
42671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if ((in.float_maxs_size() == 1) && (in.float_mins_size() == 1)) {
42771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_value = in.float_maxs(0);
42871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_value = in.float_mins(0);
429e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            } else {
4301ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                ALOGW("no float max/min for property 0x%x", out.prop);
4311ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.float_max_value = 0;
4321ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.float_min_value = 0;
433e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
434e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
43571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
43671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
43771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
43871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4: {
43971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int numZones = VehicleNetworkUtil::countNumberOfZones(out.vehicle_zone_flags);
44071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int maxSize = in.float_maxs_size();
44171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int minSize = in.float_mins_size();
44271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (maxSize != minSize) {
44371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ALOGW("Zoned property 0x%x, config maxSize %d minSize %d", out.prop, maxSize,
44471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        minSize);
44571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                return BAD_VALUE;
44671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
44771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (maxSize == 0) {
44871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_value = 0;
44971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_value = 0;
45071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_values = NULL;
45171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_values = NULL;
45271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else if (maxSize == 1) { // one for all
45371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_value = in.float_maxs(0);
45471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_value = in.float_mins(0);
45571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_values = NULL;
45671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_values = NULL;
45771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else if (numZones > 1){
45871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (numZones != maxSize) {
45971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, config maxSize %d num Zones %d", out.prop, maxSize,
46071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                                            numZones);
46171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
46271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
46371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_max_values = new float[numZones];
46471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ASSERT_OR_HANDLE_NO_MEMORY(out.float_max_values, return NO_MEMORY);
46571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.float_min_values = new float[numZones];
46671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ASSERT_OR_HANDLE_NO_MEMORY(out.float_min_values, return NO_MEMORY);
46771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                for (int i = 0; i < numZones; i++) {
46871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    out.float_max_values[i] = in.float_maxs(i);
46971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    out.float_min_values[i] = in.float_mins(i);
47071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
47171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
47271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        } break;
473e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT64: {
47471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if ((in.int64_maxs_size() == 1) && (in.int64_mins_size() == 1)) {
47571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int64_max_value = in.int64_maxs(0);
47671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int64_min_value = in.int64_mins(0);
477e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            } else {
4781ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                ALOGW("no int64 max/min for property 0x%x", out.prop);
4791ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.int64_max_value = 0;
4801ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.int64_min_value = 0;
481e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
482e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
483e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        case VEHICLE_VALUE_TYPE_INT32:
484450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC2:
485450fabaf451f8474bf9ee536427f9dd473e52e8bKeun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC3:
48671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_INT32_VEC4: {
48771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if ((in.int32_maxs_size() == 1) && (in.int32_mins_size() == 1)) {
48871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_value = in.int32_maxs(0);
48971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_value = in.int32_mins(0);
490e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            } else {
4911ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                ALOGW("no int32 max/min for property 0x%x", out.prop);
4921ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.int32_max_value = 0;
4931ab8e18e01d8063821bee0bf641a365224c7e1eekeunyoung                out.int32_min_value = 0;
494e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            }
495e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        } break;
49671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32:
49771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
49871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
49971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4: {
50071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int numZones = VehicleNetworkUtil::countNumberOfZones(out.vehicle_zone_flags);
50171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int maxSize = in.int32_maxs_size();
50271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            int minSize = in.int32_mins_size();
50371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (maxSize != minSize) {
50471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ALOGW("Zoned property 0x%x, config maxSize %d minSize %d", out.prop, maxSize,
50571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                        minSize);
50671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                return BAD_VALUE;
50771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
50871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            if (maxSize == 0) {
50971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_value = 0;
51071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_value = 0;
51171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_values = NULL;
51271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_values = NULL;
51371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else if (maxSize == 1) { // one for all
51471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_value = in.int32_maxs(0);
51571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_value = in.int32_mins(0);
51671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_values = NULL;
51771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_values = NULL;
51871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            } else if (numZones > 1){
51971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                if (numZones != maxSize) {
52071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    ALOGW("Zoned property 0x%x, config maxSize %d num Zones %d", out.prop, maxSize,
52171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                                            numZones);
52271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    return BAD_VALUE;
52371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
52471b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_max_values = new int32_t[numZones];
52571b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ASSERT_OR_HANDLE_NO_MEMORY(out.int32_max_values, return NO_MEMORY);
52671b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                out.int32_min_values = new int32_t[numZones];
52771b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                ASSERT_OR_HANDLE_NO_MEMORY(out.int32_min_values, return NO_MEMORY);
52871b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                for (int i = 0; i < numZones; i++) {
52971b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    out.int32_max_values[i] = in.int32_maxs(i);
53071b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                    out.int32_min_values[i] = in.int32_mins(i);
53171b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park                }
53271b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park            }
53371b2f5cd736f3a9aac8a9356b049d20ea76edb88Keun-young Park        } break;
534e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
535e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.max_sample_rate = in.sample_rate_max();
536e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    out.min_sample_rate = in.sample_rate_min();
537e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
538e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
539e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
540d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoungstatus_t VehicleNetworkProtoUtil::toVehiclePropConfigs(List<vehicle_prop_config_t const*> &in,
541d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        VehiclePropConfigs& out) {
542e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    status_t r;
543d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& inEntry : in) {
544e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        VehiclePropConfig* config = out.add_configs();
545d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        r = toVehiclePropConfig(*inEntry, *config);
546e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (r != NO_ERROR) {
547e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            out.clear_configs();
548e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung            return r;
549e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
550e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
551e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
552e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
553e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
554e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoungstatus_t VehicleNetworkProtoUtil::fromVehiclePropConfigs(const VehiclePropConfigs& in,
555d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        List<vehicle_prop_config_t const*>& out) {
556e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    int32_t n = in.configs_size();
557e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    status_t r;
558e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    for (int32_t i = 0; i < n; i++) {
559d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        vehicle_prop_config_t* entry = new vehicle_prop_config_t();
560d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        ASSERT_OR_HANDLE_NO_MEMORY(entry, r = NO_MEMORY; goto error);
561d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        memset(entry, 0, sizeof(vehicle_prop_config_t));
562d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        r = fromVehiclePropConfig(in.configs(i), *entry);
563e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        if (r != NO_ERROR) {
564d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung            goto error;
565e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung        }
566d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        out.push_back(entry);
567e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    }
568e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung    return NO_ERROR;
569d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoungerror:
570d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    for (auto& e : out) {
571d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        vehicle_prop_config_t* eDelete = const_cast<vehicle_prop_config_t*>(e);
572d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        VehiclePropertiesUtil::deleteMembers(eDelete);
573d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung        delete eDelete;
574d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    }
575d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    out.clear();
576d32f4e69d861d0adc2ae8f18345143f253d6fceckeunyoung    return r;
577e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}
578e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
5797d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoungstatus_t VehiclePropValueBinderUtil::writeToParcel(Parcel& parcel,
5807d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        const vehicle_prop_value_t& value) {
5817d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    parcel.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
5827d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
5837d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
5847d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
5857d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    int size = v->ByteSize();
5867d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    WritableBlobHolder blob(new Parcel::WritableBlob());
5877d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
5887d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    parcel.writeInt32(size);
5897d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    parcel.writeBlob(size, false, blob.blob);
5907d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    v->SerializeToArray(blob.blob->data(), size);
5917d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    return NO_ERROR;
5927d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung}
5937d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung
5947d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoungstatus_t VehiclePropValueBinderUtil::readFromParcel(const Parcel& parcel,
5957d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        vehicle_prop_value_t* value, bool deleteMembers, bool canIgnoreNoData) {
5967d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    if (parcel.readInt32() == 0) { // no result
5977d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        ALOGE("readFromParcel, null data");
5987d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        return BAD_VALUE;
5997d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    }
6007d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    ReadableBlobHolder blob(new Parcel::ReadableBlob());
6017d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
6027d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    int32_t size = parcel.readInt32();
6037d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    status_t status = parcel.readBlob(size, blob.blob);
6047d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    if (status != NO_ERROR) {
6057d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        ALOGE("readFromParcel, cannot read blob");
6067d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        return status;
6077d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    }
6087d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
6097d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
6107d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    if (!v->ParseFromArray(blob.blob->data(), size)) {
6117d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        ALOGE("readFromParcel, cannot parse");
6127d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        return BAD_VALUE;
6137d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    }
6147d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    if (deleteMembers) {
6157d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung        VehiclePropValueUtil::deleteMembers(value);
6167d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    }
6177d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung    return VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), *value, false /*inPlace*/,
6187d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung            canIgnoreNoData);
6197d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung}
6207d74e6d9195f29d0eb50f7bcbe235334b02dba8ekeunyoung
621e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung}; //namespace android
622e18e25d2a79e94a4cea83a94daee5f4cafd419cfkeunyoung
623