blob: eb126cd684e154477d4a7b95ec68741ec99ce256 [file] [log] [blame]
keunyounge18e25d2015-08-28 15:57:19 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "VehicleNetwork"
18
19#include <memory>
Keun-young Park71b2f5c2016-03-10 18:44:40 -080020#include <string.h>
keunyounge18e25d2015-08-28 15:57:19 -070021
22#include <binder/IPCThreadState.h>
Keun-young Parkba485482016-03-24 13:24:31 -070023#include <binder/Status.h>
keunyounge18e25d2015-08-28 15:57:19 -070024
25#include <utils/Log.h>
26
27#include <IVehicleNetwork.h>
28#include <VehicleNetworkProto.pb.h>
29
keunyoung15882e52015-09-16 16:57:58 -070030#include "BinderUtil.h"
keunyounge18e25d2015-08-28 15:57:19 -070031#include "VehicleNetworkProtoUtil.h"
32
33namespace android {
34
35enum {
36 LIST_PROPERTIES = IBinder::FIRST_CALL_TRANSACTION,
37 SET_PROPERTY,
38 GET_PROPERTY,
39 SUBSCRIBE,
40 UNSUBSCRIBE,
keunyoung1ab8e182015-09-24 09:25:22 -070041 INJECT_EVENT,
42 START_MOCKING,
43 STOP_MOCKING,
Keun-young Park28dd4702015-11-19 18:06:04 -080044 INJECT_HAL_ERROR,
45 START_ERROR_LISTENING,
46 STOP_ERROR_LISTENING,
47 START_HAL_RESTART_MONITORING,
48 STOP_HAL_RESTART_MONITORING
keunyounge18e25d2015-08-28 15:57:19 -070049};
50
51// ----------------------------------------------------------------------------
52
keunyoung15882e52015-09-16 16:57:58 -070053const char IVehicleNetwork::SERVICE_NAME[] = "com.android.car.vehiclenetwork.IVehicleNetwork";
keunyounge18e25d2015-08-28 15:57:19 -070054
55// ----------------------------------------------------------------------------
56
57class BpVehicleNetwork : public BpInterface<IVehicleNetwork> {
58public:
59 BpVehicleNetwork(const sp<IBinder> & impl)
60 : BpInterface<IVehicleNetwork>(impl) {
61 }
62
63 virtual sp<VehiclePropertiesHolder> listProperties(int32_t property) {
64 sp<VehiclePropertiesHolder> holder;
65 Parcel data, reply;
66 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
67 data.writeInt32(property);
68 status_t status = remote()->transact(LIST_PROPERTIES, data, &reply);
69 if (status == NO_ERROR) {
keunyoung15882e52015-09-16 16:57:58 -070070 reply.readExceptionCode(); // for compatibility with java
keunyounge18e25d2015-08-28 15:57:19 -070071 if (reply.readInt32() == 0) { // no result
72 return holder;
73 }
74 ReadableBlobHolder blob(new Parcel::ReadableBlob());
75 if (blob.blob == NULL) {
76 ALOGE("listProperties, no memory");
77 return holder;
78 }
79 int32_t size = reply.readInt32();
80 status = reply.readBlob(size, blob.blob);
81 if (status != NO_ERROR) {
82 ALOGE("listProperties, cannot read blob %d", status);
83 return holder;
84 }
85 //TODO make this more memory efficient
86 std::unique_ptr<VehiclePropConfigs> configs(new VehiclePropConfigs());
87 if (configs.get() == NULL) {
88 return holder;
89 }
90 if(!configs->ParseFromArray(blob.blob->data(), size)) {
91 ALOGE("listProperties, cannot parse reply");
92 return holder;
93 }
keunyoungd32f4e62015-09-21 11:33:06 -070094 holder = new VehiclePropertiesHolder();
95 ASSERT_OR_HANDLE_NO_MEMORY(holder.get(), return);
96 status = VehicleNetworkProtoUtil::fromVehiclePropConfigs(*configs.get(),
97 holder->getList());
keunyounge18e25d2015-08-28 15:57:19 -070098 if (status != NO_ERROR) {
99 ALOGE("listProperties, cannot convert VehiclePropConfigs %d", status);
100 return holder;
101 }
keunyoungd32f4e62015-09-21 11:33:06 -0700102
keunyounge18e25d2015-08-28 15:57:19 -0700103 }
104 return holder;
105 }
106
107 virtual status_t setProperty(const vehicle_prop_value_t& value) {
108 Parcel data, reply;
109 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
keunyoung7d74e6d2015-10-14 15:43:10 -0700110 status_t status = VehiclePropValueBinderUtil::writeToParcel(data, value);
111 if (status != NO_ERROR) {
112 return status;
113 }
114 status = remote()->transact(SET_PROPERTY, data, &reply);
Keun-young Parke78bf532016-04-25 18:59:22 -0700115 if (status == NO_ERROR) {
116 int32_t exceptionCode = reply.readExceptionCode();
117 if (exceptionCode != NO_ERROR) {
118 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
119 return -EAGAIN;
120 } else if (exceptionCode == binder::Status::EX_ILLEGAL_STATE) {
121 return -ESHUTDOWN;
122 }
123 return exceptionCode;
124 }
125 }
keunyounge18e25d2015-08-28 15:57:19 -0700126 return status;
127 }
128
129 virtual status_t getProperty(vehicle_prop_value_t* value) {
130 Parcel data, reply;
keunyoung7d74e6d2015-10-14 15:43:10 -0700131 if (value == NULL) {
132 return BAD_VALUE;
133 }
keunyounge18e25d2015-08-28 15:57:19 -0700134 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
keunyoung7d74e6d2015-10-14 15:43:10 -0700135 status_t status = VehiclePropValueBinderUtil::writeToParcel(data, *value);
136 if (status != NO_ERROR) {
137 ALOGE("getProperty, cannot write");
138 return status;
139 }
140 status = remote()->transact(GET_PROPERTY, data, &reply);
keunyounge18e25d2015-08-28 15:57:19 -0700141 if (status == NO_ERROR) {
Keun-young Parkba485482016-03-24 13:24:31 -0700142 int32_t exceptionCode = reply.readExceptionCode();
143 if (exceptionCode != NO_ERROR) {
144 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
145 return -EAGAIN;
Steve Paikb224b852016-07-08 16:11:43 -0700146 } else if (exceptionCode == binder::Status::EX_ILLEGAL_STATE) {
147 return -ESHUTDOWN;
Keun-young Parkba485482016-03-24 13:24:31 -0700148 }
149 return exceptionCode;
150 }
keunyoung7d74e6d2015-10-14 15:43:10 -0700151 status = VehiclePropValueBinderUtil::readFromParcel(reply, value);
keunyounge18e25d2015-08-28 15:57:19 -0700152 }
153 return status;
154 }
155
156 virtual status_t subscribe(const sp<IVehicleNetworkListener> &listener, int32_t property,
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700157 float sampleRate, int32_t zones, int32_t flags) {
keunyounge18e25d2015-08-28 15:57:19 -0700158 Parcel data, reply;
159 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
160 data.writeStrongBinder(IInterface::asBinder(listener));
161 data.writeInt32(property);
162 data.writeFloat(sampleRate);
Keun-young Park0727f952015-12-21 14:30:07 -0800163 data.writeInt32(zones);
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700164 data.writeInt32(flags);
keunyounge18e25d2015-08-28 15:57:19 -0700165 status_t status = remote()->transact(SUBSCRIBE, data, &reply);
166 return status;
167 }
168
169 virtual void unsubscribe(const sp<IVehicleNetworkListener> &listener, int32_t property) {
170 Parcel data, reply;
171 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
172 data.writeStrongBinder(IInterface::asBinder(listener));
173 data.writeInt32(property);
174 status_t status = remote()->transact(UNSUBSCRIBE, data, &reply);
175 if (status != NO_ERROR) {
176 ALOGI("unsubscribing property %d failed %d", property, status);
177 }
178 }
keunyoung1ab8e182015-09-24 09:25:22 -0700179
180 virtual status_t injectEvent(const vehicle_prop_value_t& value) {
181 Parcel data, reply;
182 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
183 data.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
184 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
185 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
186 VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
187 int size = v->ByteSize();
188 WritableBlobHolder blob(new Parcel::WritableBlob());
189 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
190 data.writeInt32(size);
191 data.writeBlob(size, false, blob.blob);
192 v->SerializeToArray(blob.blob->data(), size);
193 status_t status = remote()->transact(INJECT_EVENT, data, &reply);
194 return status;
195 }
196
197 virtual status_t startMocking(const sp<IVehicleNetworkHalMock>& mock) {
198 Parcel data, reply;
199 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
200 data.writeStrongBinder(IInterface::asBinder(mock));
201 status_t status = remote()->transact(START_MOCKING, data, &reply);
202 return status;
203 }
204
205 virtual void stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
206 Parcel data, reply;
207 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
208 data.writeStrongBinder(IInterface::asBinder(mock));
209 status_t status = remote()->transact(STOP_MOCKING, data, &reply);
210 if (status != NO_ERROR) {
211 ALOGI("stop mocking failed %d", status);
212 }
213 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800214
215 status_t injectHalError(int32_t errorCode, int32_t property, int32_t operation) {
216 Parcel data, reply;
217 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
218 data.writeInt32(errorCode);
219 data.writeInt32(property);
220 data.writeInt32(operation);
221 status_t status = remote()->transact(INJECT_HAL_ERROR, data, &reply);
222 return status;
223 }
224
225 virtual status_t startErrorListening(const sp<IVehicleNetworkListener> &listener) {
226 Parcel data, reply;
227 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
228 data.writeStrongBinder(IInterface::asBinder(listener));
229 status_t status = remote()->transact(START_ERROR_LISTENING, data, &reply);
230 return status;
231 }
232
233 virtual void stopErrorListening(const sp<IVehicleNetworkListener> &listener) {
234 Parcel data, reply;
235 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
236 data.writeStrongBinder(IInterface::asBinder(listener));
237 status_t status = remote()->transact(STOP_ERROR_LISTENING, data, &reply);
238 if (status != NO_ERROR) {
239 ALOGI("stopErrorListening %d", status);
240 }
241 }
242
243 virtual status_t startHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
244 Parcel data, reply;
245 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
246 data.writeStrongBinder(IInterface::asBinder(listener));
247 status_t status = remote()->transact(START_HAL_RESTART_MONITORING, data, &reply);
248 return status;
249 }
250
251 virtual void stopHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
252 Parcel data, reply;
253 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
254 data.writeStrongBinder(IInterface::asBinder(listener));
255 status_t status = remote()->transact(STOP_HAL_RESTART_MONITORING, data, &reply);
256 if (status != NO_ERROR) {
257 ALOGI("stopHalRestartMonitoring %d", status);
258 }
259 }
keunyounge18e25d2015-08-28 15:57:19 -0700260};
261
262IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
263
264// ----------------------------------------------------------------------
265
keunyounge18e25d2015-08-28 15:57:19 -0700266status_t BnVehicleNetwork::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
267 uint32_t flags) {
keunyounge18e25d2015-08-28 15:57:19 -0700268 status_t r;
269 switch (code) {
270 case LIST_PROPERTIES: {
271 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park737cdfb2016-02-12 15:11:39 -0800272 if (!isOperationAllowed(0, false)) {
273 return PERMISSION_DENIED;
274 }
keunyounge18e25d2015-08-28 15:57:19 -0700275 int32_t property = data.readInt32();
276 sp<VehiclePropertiesHolder> holder = listProperties(property);
277 if (holder.get() == NULL) { // given property not found
keunyoung15882e52015-09-16 16:57:58 -0700278 BinderUtil::fillObjectResultReply(reply, false /* isValid */);
279 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700280 }
281 std::unique_ptr<VehiclePropConfigs> configs(new VehiclePropConfigs());
282 ASSERT_OR_HANDLE_NO_MEMORY(configs.get(), return NO_MEMORY);
keunyoungd32f4e62015-09-21 11:33:06 -0700283 VehicleNetworkProtoUtil::toVehiclePropConfigs(holder->getList(), *configs.get());
keunyounge18e25d2015-08-28 15:57:19 -0700284 int size = configs->ByteSize();
285 WritableBlobHolder blob(new Parcel::WritableBlob());
286 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
keunyoung15882e52015-09-16 16:57:58 -0700287 BinderUtil::fillObjectResultReply(reply, true);
keunyounge18e25d2015-08-28 15:57:19 -0700288 reply->writeInt32(size);
289 reply->writeBlob(size, false, blob.blob);
290 configs->SerializeToArray(blob.blob->data(), size);
291 return NO_ERROR;
292 } break;
293 case SET_PROPERTY: {
294 CHECK_INTERFACE(IVehicleNetwork, data, reply);
keunyounge18e25d2015-08-28 15:57:19 -0700295 ScopedVehiclePropValue value;
keunyoung7d74e6d2015-10-14 15:43:10 -0700296 r = VehiclePropValueBinderUtil::readFromParcel(data, &value.value,
297 false /* deleteMembers */);
keunyounge18e25d2015-08-28 15:57:19 -0700298 if (r != NO_ERROR) {
keunyounge18e25d2015-08-28 15:57:19 -0700299 return r;
300 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800301 if (!isOperationAllowed(value.value.prop, true)) {
302 return PERMISSION_DENIED;
303 }
keunyounge18e25d2015-08-28 15:57:19 -0700304 r = setProperty(value.value);
Keun-young Parke78bf532016-04-25 18:59:22 -0700305 if (r == NO_ERROR) {
306 reply->writeNoException();
307 } else if (r == -EAGAIN) {
308 // this should be handled specially to throw ServiceSpecificException in java.
309 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
310 return NO_ERROR;
311 } else if (r == -ESHUTDOWN) {
312 // this should be handled specially to throw IllegalStateException in java.
313 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
314 return NO_ERROR;
315 }
keunyounge18e25d2015-08-28 15:57:19 -0700316 return r;
317 } break;
318 case GET_PROPERTY: {
319 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800320 vehicle_prop_value_t value;
321 memset(&value, 0, sizeof(value));
322 r = VehiclePropValueBinderUtil::readFromParcel(data, &value,
keunyoung7d74e6d2015-10-14 15:43:10 -0700323 false /* deleteMembers */, true /*canIgnoreNoData*/);
324 if (r != NO_ERROR) {
325 ALOGE("getProperty cannot read %d", r);
326 return r;
327 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800328 if (!isOperationAllowed(value.prop, false)) {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800329 return PERMISSION_DENIED;
330 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800331 r = getProperty(&value);
keunyounge18e25d2015-08-28 15:57:19 -0700332 if (r == NO_ERROR) {
Steve Paikb224b852016-07-08 16:11:43 -0700333 // If int32 or float value is out of range, throw an exception:
334 switch (value.value_type) {
335 case VEHICLE_VALUE_TYPE_INT32:
336 case VEHICLE_VALUE_TYPE_ZONED_INT32:
337 // TODO: Handle array types as well?
338 if (value.value.int32_value == VEHICLE_INT_OUT_OF_RANGE_OFF) {
339 // this should be handled specially to throw IllegalStateException in java.
340 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
341 return NO_ERROR;
342 }
343 break;
344 case VEHICLE_VALUE_TYPE_FLOAT:
345 case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
346 // TODO: Handle array types as well?
347 if (value.value.float_value == VEHICLE_FLOAT_OUT_OF_RANGE_OFF) {
348 // this should be handled specially to throw IllegalStateException in java.
349 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
350 return NO_ERROR;
351 }
352 break;
353 }
keunyoung7d74e6d2015-10-14 15:43:10 -0700354 reply->writeNoException();
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800355 r = VehiclePropValueBinderUtil::writeToParcel(*reply, value);
356 releaseMemoryFromGet(&value);
Keun-young Parkba485482016-03-24 13:24:31 -0700357 } else if (r == -EAGAIN) {
358 // this should be handled specially to throw ServiceSpecificException in java.
359 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
360 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700361 }
362 return r;
363 } break;
364 case SUBSCRIBE: {
365 CHECK_INTERFACE(IVehicleNetwork, data, reply);
366 sp<IVehicleNetworkListener> listener =
367 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
368 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800369 if (!isOperationAllowed(property, false)) {
370 return PERMISSION_DENIED;
371 }
keunyounge18e25d2015-08-28 15:57:19 -0700372 float sampleRate = data.readFloat();
Keun-young Park0727f952015-12-21 14:30:07 -0800373 int32_t zones = data.readInt32();
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700374 int32_t flags = data.readInt32();
375 r = subscribe(listener, property, sampleRate, zones, flags);
keunyoung15882e52015-09-16 16:57:58 -0700376 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700377 return r;
378 } break;
379 case UNSUBSCRIBE: {
380 CHECK_INTERFACE(IVehicleNetwork, data, reply);
381 sp<IVehicleNetworkListener> listener =
382 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
383 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800384 if (!isOperationAllowed(property, false)) {
385 return PERMISSION_DENIED;
386 }
keunyounge18e25d2015-08-28 15:57:19 -0700387 unsubscribe(listener, property);
keunyoung15882e52015-09-16 16:57:58 -0700388 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700389 return NO_ERROR;
390 } break;
keunyoung1ab8e182015-09-24 09:25:22 -0700391 case INJECT_EVENT: {
392 CHECK_INTERFACE(IVehicleNetwork, data, reply);
393 if (data.readInt32() == 0) { // java side allows passing null with this.
394 return BAD_VALUE;
395 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800396 if (!isOperationAllowed(0, true)) {
397 return PERMISSION_DENIED;
398 }
keunyoung1ab8e182015-09-24 09:25:22 -0700399 ScopedVehiclePropValue value;
400 ReadableBlobHolder blob(new Parcel::ReadableBlob());
401 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
402 int32_t size = data.readInt32();
403 r = data.readBlob(size, blob.blob);
404 if (r != NO_ERROR) {
405 ALOGE("injectEvent:service, cannot read blob");
406 return r;
407 }
408 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
409 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
410 if (!v->ParseFromArray(blob.blob->data(), size)) {
411 ALOGE("injectEvent:service, cannot parse data");
412 return BAD_VALUE;
413 }
414 r = VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), value.value);
415 if (r != NO_ERROR) {
416 ALOGE("injectEvent:service, cannot convert data");
417 return BAD_VALUE;
418 }
419 r = injectEvent(value.value);
420 BinderUtil::fillNoResultReply(reply);
421 return r;
422 } break;
423 case START_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800424 if (!isOperationAllowed(0, true)) {
425 return PERMISSION_DENIED;
426 }
keunyoung1ab8e182015-09-24 09:25:22 -0700427 CHECK_INTERFACE(IVehicleNetwork, data, reply);
428 sp<IVehicleNetworkHalMock> mock =
429 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
430 r = startMocking(mock);
431 BinderUtil::fillNoResultReply(reply);
432 return r;
433 } break;
434 case STOP_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800435 if (!isOperationAllowed(0, true)) {
436 return PERMISSION_DENIED;
437 }
keunyoung1ab8e182015-09-24 09:25:22 -0700438 CHECK_INTERFACE(IVehicleNetwork, data, reply);
439 sp<IVehicleNetworkHalMock> mock =
440 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
441 stopMocking(mock);
442 BinderUtil::fillNoResultReply(reply);
443 return NO_ERROR;
444 } break;
Keun-young Park28dd4702015-11-19 18:06:04 -0800445 case INJECT_HAL_ERROR: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800446 if (!isOperationAllowed(0, true)) {
447 return PERMISSION_DENIED;
448 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800449 CHECK_INTERFACE(IVehicleNetwork, data, reply);
450 int32_t errorCode = data.readInt32();
451 int32_t property = data.readInt32();
452 int32_t operation = data.readInt32();
453 r = injectHalError(errorCode, property, operation);
454 BinderUtil::fillNoResultReply(reply);
455 return r;
456 } break;
457 case START_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800458 if (!isOperationAllowed(0, false)) {
459 return PERMISSION_DENIED;
460 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800461 CHECK_INTERFACE(IVehicleNetwork, data, reply);
462 sp<IVehicleNetworkListener> listener =
463 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
464 r = startErrorListening(listener);
465 BinderUtil::fillNoResultReply(reply);
466 return r;
467 } break;
468 case STOP_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800469 if (!isOperationAllowed(0, false)) {
470 return PERMISSION_DENIED;
471 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800472 CHECK_INTERFACE(IVehicleNetwork, data, reply);
473 sp<IVehicleNetworkListener> listener =
474 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
475 stopErrorListening(listener);
476 BinderUtil::fillNoResultReply(reply);
477 return NO_ERROR;
478 } break;
479 case START_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800480 if (!isOperationAllowed(0, false)) {
481 return PERMISSION_DENIED;
482 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800483 CHECK_INTERFACE(IVehicleNetwork, data, reply);
484 sp<IVehicleNetworkListener> listener =
485 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
486 r = startHalRestartMonitoring(listener);
487 BinderUtil::fillNoResultReply(reply);
488 return r;
489 } break;
490 case STOP_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800491 if (!isOperationAllowed(0, false)) {
492 return PERMISSION_DENIED;
493 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800494 CHECK_INTERFACE(IVehicleNetwork, data, reply);
495 sp<IVehicleNetworkListener> listener =
496 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
497 stopHalRestartMonitoring(listener);
498 BinderUtil::fillNoResultReply(reply);
499 return NO_ERROR;
500 } break;
keunyounge18e25d2015-08-28 15:57:19 -0700501 default:
502 return BBinder::onTransact(code, data, reply, flags);
503 }
504}
505
506}; // namespace android