blob: a100b1c52cefd2234f554d3edae0cbc0e19b8792 [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:
Chih-Hung Hsieh239e6402016-05-02 11:53:32 -070059 explicit BpVehicleNetwork(const sp<IBinder> & impl)
keunyounge18e25d2015-08-28 15:57:19 -070060 : 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();
Keun-young Park20539ba2016-10-10 17:57:34 -070080 if (size < 0) {
81 ALOGE("listProperties, bad blob size %d", size);
82 return holder;
83 }
keunyounge18e25d2015-08-28 15:57:19 -070084 status = reply.readBlob(size, blob.blob);
85 if (status != NO_ERROR) {
86 ALOGE("listProperties, cannot read blob %d", status);
87 return holder;
88 }
keunyounge18e25d2015-08-28 15:57:19 -070089 std::unique_ptr<VehiclePropConfigs> configs(new VehiclePropConfigs());
90 if (configs.get() == NULL) {
91 return holder;
92 }
93 if(!configs->ParseFromArray(blob.blob->data(), size)) {
94 ALOGE("listProperties, cannot parse reply");
95 return holder;
96 }
keunyoungd32f4e62015-09-21 11:33:06 -070097 holder = new VehiclePropertiesHolder();
98 ASSERT_OR_HANDLE_NO_MEMORY(holder.get(), return);
99 status = VehicleNetworkProtoUtil::fromVehiclePropConfigs(*configs.get(),
100 holder->getList());
keunyounge18e25d2015-08-28 15:57:19 -0700101 if (status != NO_ERROR) {
102 ALOGE("listProperties, cannot convert VehiclePropConfigs %d", status);
103 return holder;
104 }
keunyoungd32f4e62015-09-21 11:33:06 -0700105
keunyounge18e25d2015-08-28 15:57:19 -0700106 }
107 return holder;
108 }
109
110 virtual status_t setProperty(const vehicle_prop_value_t& value) {
111 Parcel data, reply;
112 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
keunyoung7d74e6d2015-10-14 15:43:10 -0700113 status_t status = VehiclePropValueBinderUtil::writeToParcel(data, value);
114 if (status != NO_ERROR) {
115 return status;
116 }
117 status = remote()->transact(SET_PROPERTY, data, &reply);
Keun-young Park883a2412016-04-25 18:59:22 -0700118 if (status == NO_ERROR) {
119 int32_t exceptionCode = reply.readExceptionCode();
120 if (exceptionCode != NO_ERROR) {
121 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
122 return -EAGAIN;
123 } else if (exceptionCode == binder::Status::EX_ILLEGAL_STATE) {
124 return -ESHUTDOWN;
125 }
126 return exceptionCode;
127 }
128 }
keunyounge18e25d2015-08-28 15:57:19 -0700129 return status;
130 }
131
132 virtual status_t getProperty(vehicle_prop_value_t* value) {
133 Parcel data, reply;
keunyoung7d74e6d2015-10-14 15:43:10 -0700134 if (value == NULL) {
135 return BAD_VALUE;
136 }
keunyounge18e25d2015-08-28 15:57:19 -0700137 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
keunyoung7d74e6d2015-10-14 15:43:10 -0700138 status_t status = VehiclePropValueBinderUtil::writeToParcel(data, *value);
139 if (status != NO_ERROR) {
140 ALOGE("getProperty, cannot write");
141 return status;
142 }
143 status = remote()->transact(GET_PROPERTY, data, &reply);
keunyounge18e25d2015-08-28 15:57:19 -0700144 if (status == NO_ERROR) {
Keun-young Parkba485482016-03-24 13:24:31 -0700145 int32_t exceptionCode = reply.readExceptionCode();
146 if (exceptionCode != NO_ERROR) {
147 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
148 return -EAGAIN;
Steve Paikb224b852016-07-08 16:11:43 -0700149 } else if (exceptionCode == binder::Status::EX_ILLEGAL_STATE) {
150 return -ESHUTDOWN;
Keun-young Parkba485482016-03-24 13:24:31 -0700151 }
152 return exceptionCode;
153 }
keunyoung7d74e6d2015-10-14 15:43:10 -0700154 status = VehiclePropValueBinderUtil::readFromParcel(reply, value);
keunyounge18e25d2015-08-28 15:57:19 -0700155 }
156 return status;
157 }
158
159 virtual status_t subscribe(const sp<IVehicleNetworkListener> &listener, int32_t property,
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700160 float sampleRate, int32_t zones, int32_t flags) {
keunyounge18e25d2015-08-28 15:57:19 -0700161 Parcel data, reply;
162 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
163 data.writeStrongBinder(IInterface::asBinder(listener));
164 data.writeInt32(property);
165 data.writeFloat(sampleRate);
Keun-young Park0727f952015-12-21 14:30:07 -0800166 data.writeInt32(zones);
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700167 data.writeInt32(flags);
keunyounge18e25d2015-08-28 15:57:19 -0700168 status_t status = remote()->transact(SUBSCRIBE, data, &reply);
169 return status;
170 }
171
172 virtual void unsubscribe(const sp<IVehicleNetworkListener> &listener, int32_t property) {
173 Parcel data, reply;
174 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
175 data.writeStrongBinder(IInterface::asBinder(listener));
176 data.writeInt32(property);
177 status_t status = remote()->transact(UNSUBSCRIBE, data, &reply);
178 if (status != NO_ERROR) {
179 ALOGI("unsubscribing property %d failed %d", property, status);
180 }
181 }
keunyoung1ab8e182015-09-24 09:25:22 -0700182
183 virtual status_t injectEvent(const vehicle_prop_value_t& value) {
184 Parcel data, reply;
185 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
186 data.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
187 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
188 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
189 VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
190 int size = v->ByteSize();
191 WritableBlobHolder blob(new Parcel::WritableBlob());
192 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
193 data.writeInt32(size);
194 data.writeBlob(size, false, blob.blob);
195 v->SerializeToArray(blob.blob->data(), size);
196 status_t status = remote()->transact(INJECT_EVENT, data, &reply);
197 return status;
198 }
199
200 virtual status_t startMocking(const sp<IVehicleNetworkHalMock>& mock) {
201 Parcel data, reply;
202 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
203 data.writeStrongBinder(IInterface::asBinder(mock));
204 status_t status = remote()->transact(START_MOCKING, data, &reply);
205 return status;
206 }
207
208 virtual void stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
209 Parcel data, reply;
210 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
211 data.writeStrongBinder(IInterface::asBinder(mock));
212 status_t status = remote()->transact(STOP_MOCKING, data, &reply);
213 if (status != NO_ERROR) {
214 ALOGI("stop mocking failed %d", status);
215 }
216 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800217
218 status_t injectHalError(int32_t errorCode, int32_t property, int32_t operation) {
219 Parcel data, reply;
220 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
221 data.writeInt32(errorCode);
222 data.writeInt32(property);
223 data.writeInt32(operation);
224 status_t status = remote()->transact(INJECT_HAL_ERROR, data, &reply);
225 return status;
226 }
227
228 virtual status_t startErrorListening(const sp<IVehicleNetworkListener> &listener) {
229 Parcel data, reply;
230 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
231 data.writeStrongBinder(IInterface::asBinder(listener));
232 status_t status = remote()->transact(START_ERROR_LISTENING, data, &reply);
233 return status;
234 }
235
236 virtual void stopErrorListening(const sp<IVehicleNetworkListener> &listener) {
237 Parcel data, reply;
238 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
239 data.writeStrongBinder(IInterface::asBinder(listener));
240 status_t status = remote()->transact(STOP_ERROR_LISTENING, data, &reply);
241 if (status != NO_ERROR) {
242 ALOGI("stopErrorListening %d", status);
243 }
244 }
245
246 virtual status_t startHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
247 Parcel data, reply;
248 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
249 data.writeStrongBinder(IInterface::asBinder(listener));
250 status_t status = remote()->transact(START_HAL_RESTART_MONITORING, data, &reply);
251 return status;
252 }
253
254 virtual void stopHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
255 Parcel data, reply;
256 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
257 data.writeStrongBinder(IInterface::asBinder(listener));
258 status_t status = remote()->transact(STOP_HAL_RESTART_MONITORING, data, &reply);
259 if (status != NO_ERROR) {
260 ALOGI("stopHalRestartMonitoring %d", status);
261 }
262 }
keunyounge18e25d2015-08-28 15:57:19 -0700263};
264
265IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
266
267// ----------------------------------------------------------------------
268
keunyounge18e25d2015-08-28 15:57:19 -0700269status_t BnVehicleNetwork::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
270 uint32_t flags) {
keunyounge18e25d2015-08-28 15:57:19 -0700271 status_t r;
272 switch (code) {
273 case LIST_PROPERTIES: {
274 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park737cdfb2016-02-12 15:11:39 -0800275 if (!isOperationAllowed(0, false)) {
276 return PERMISSION_DENIED;
277 }
keunyounge18e25d2015-08-28 15:57:19 -0700278 int32_t property = data.readInt32();
279 sp<VehiclePropertiesHolder> holder = listProperties(property);
280 if (holder.get() == NULL) { // given property not found
keunyoung15882e52015-09-16 16:57:58 -0700281 BinderUtil::fillObjectResultReply(reply, false /* isValid */);
282 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700283 }
284 std::unique_ptr<VehiclePropConfigs> configs(new VehiclePropConfigs());
285 ASSERT_OR_HANDLE_NO_MEMORY(configs.get(), return NO_MEMORY);
keunyoungd32f4e62015-09-21 11:33:06 -0700286 VehicleNetworkProtoUtil::toVehiclePropConfigs(holder->getList(), *configs.get());
keunyounge18e25d2015-08-28 15:57:19 -0700287 int size = configs->ByteSize();
288 WritableBlobHolder blob(new Parcel::WritableBlob());
289 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
keunyoung15882e52015-09-16 16:57:58 -0700290 BinderUtil::fillObjectResultReply(reply, true);
keunyounge18e25d2015-08-28 15:57:19 -0700291 reply->writeInt32(size);
292 reply->writeBlob(size, false, blob.blob);
293 configs->SerializeToArray(blob.blob->data(), size);
294 return NO_ERROR;
295 } break;
296 case SET_PROPERTY: {
297 CHECK_INTERFACE(IVehicleNetwork, data, reply);
keunyounge18e25d2015-08-28 15:57:19 -0700298 ScopedVehiclePropValue value;
keunyoung7d74e6d2015-10-14 15:43:10 -0700299 r = VehiclePropValueBinderUtil::readFromParcel(data, &value.value,
300 false /* deleteMembers */);
keunyounge18e25d2015-08-28 15:57:19 -0700301 if (r != NO_ERROR) {
keunyounge18e25d2015-08-28 15:57:19 -0700302 return r;
303 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800304 if (!isOperationAllowed(value.value.prop, true)) {
305 return PERMISSION_DENIED;
306 }
keunyounge18e25d2015-08-28 15:57:19 -0700307 r = setProperty(value.value);
Keun-young Park883a2412016-04-25 18:59:22 -0700308 if (r == NO_ERROR) {
309 reply->writeNoException();
310 } else if (r == -EAGAIN) {
311 // this should be handled specially to throw ServiceSpecificException in java.
312 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
313 return NO_ERROR;
314 } else if (r == -ESHUTDOWN) {
315 // this should be handled specially to throw IllegalStateException in java.
316 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
317 return NO_ERROR;
318 }
keunyounge18e25d2015-08-28 15:57:19 -0700319 return r;
320 } break;
321 case GET_PROPERTY: {
322 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800323 vehicle_prop_value_t value;
324 memset(&value, 0, sizeof(value));
325 r = VehiclePropValueBinderUtil::readFromParcel(data, &value,
keunyoung7d74e6d2015-10-14 15:43:10 -0700326 false /* deleteMembers */, true /*canIgnoreNoData*/);
327 if (r != NO_ERROR) {
328 ALOGE("getProperty cannot read %d", r);
329 return r;
330 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800331 if (!isOperationAllowed(value.prop, false)) {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800332 return PERMISSION_DENIED;
333 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800334 r = getProperty(&value);
keunyounge18e25d2015-08-28 15:57:19 -0700335 if (r == NO_ERROR) {
Steve Paikb224b852016-07-08 16:11:43 -0700336 // If int32 or float value is out of range, throw an exception:
337 switch (value.value_type) {
338 case VEHICLE_VALUE_TYPE_INT32:
339 case VEHICLE_VALUE_TYPE_ZONED_INT32:
Steve Paikb224b852016-07-08 16:11:43 -0700340 if (value.value.int32_value == VEHICLE_INT_OUT_OF_RANGE_OFF) {
341 // this should be handled specially to throw IllegalStateException in java.
342 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
343 return NO_ERROR;
344 }
345 break;
346 case VEHICLE_VALUE_TYPE_FLOAT:
347 case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
Steve Paikb224b852016-07-08 16:11:43 -0700348 if (value.value.float_value == VEHICLE_FLOAT_OUT_OF_RANGE_OFF) {
349 // this should be handled specially to throw IllegalStateException in java.
350 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
351 return NO_ERROR;
352 }
353 break;
354 }
keunyoung7d74e6d2015-10-14 15:43:10 -0700355 reply->writeNoException();
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800356 r = VehiclePropValueBinderUtil::writeToParcel(*reply, value);
357 releaseMemoryFromGet(&value);
Keun-young Parkba485482016-03-24 13:24:31 -0700358 } else if (r == -EAGAIN) {
359 // this should be handled specially to throw ServiceSpecificException in java.
360 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
361 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700362 }
363 return r;
364 } break;
365 case SUBSCRIBE: {
366 CHECK_INTERFACE(IVehicleNetwork, data, reply);
367 sp<IVehicleNetworkListener> listener =
368 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
369 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800370 if (!isOperationAllowed(property, false)) {
371 return PERMISSION_DENIED;
372 }
keunyounge18e25d2015-08-28 15:57:19 -0700373 float sampleRate = data.readFloat();
Keun-young Park0727f952015-12-21 14:30:07 -0800374 int32_t zones = data.readInt32();
Pavel Maltsevb0324b42016-09-27 21:00:41 -0700375 int32_t flags = data.readInt32();
376 r = subscribe(listener, property, sampleRate, zones, flags);
keunyoung15882e52015-09-16 16:57:58 -0700377 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700378 return r;
379 } break;
380 case UNSUBSCRIBE: {
381 CHECK_INTERFACE(IVehicleNetwork, data, reply);
382 sp<IVehicleNetworkListener> listener =
383 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
384 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800385 if (!isOperationAllowed(property, false)) {
386 return PERMISSION_DENIED;
387 }
keunyounge18e25d2015-08-28 15:57:19 -0700388 unsubscribe(listener, property);
keunyoung15882e52015-09-16 16:57:58 -0700389 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700390 return NO_ERROR;
391 } break;
keunyoung1ab8e182015-09-24 09:25:22 -0700392 case INJECT_EVENT: {
393 CHECK_INTERFACE(IVehicleNetwork, data, reply);
394 if (data.readInt32() == 0) { // java side allows passing null with this.
395 return BAD_VALUE;
396 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800397 if (!isOperationAllowed(0, true)) {
398 return PERMISSION_DENIED;
399 }
keunyoung1ab8e182015-09-24 09:25:22 -0700400 ScopedVehiclePropValue value;
401 ReadableBlobHolder blob(new Parcel::ReadableBlob());
402 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
403 int32_t size = data.readInt32();
Keun-young Park20539ba2016-10-10 17:57:34 -0700404 if (size < 0) {
405 ALOGE("injectEvent:service, bad blob size %d", size);
406 return BAD_VALUE;
407 }
keunyoung1ab8e182015-09-24 09:25:22 -0700408 r = data.readBlob(size, blob.blob);
409 if (r != NO_ERROR) {
410 ALOGE("injectEvent:service, cannot read blob");
411 return r;
412 }
413 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
414 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
415 if (!v->ParseFromArray(blob.blob->data(), size)) {
416 ALOGE("injectEvent:service, cannot parse data");
417 return BAD_VALUE;
418 }
419 r = VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), value.value);
420 if (r != NO_ERROR) {
421 ALOGE("injectEvent:service, cannot convert data");
422 return BAD_VALUE;
423 }
424 r = injectEvent(value.value);
425 BinderUtil::fillNoResultReply(reply);
426 return r;
427 } break;
428 case START_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800429 if (!isOperationAllowed(0, true)) {
430 return PERMISSION_DENIED;
431 }
keunyoung1ab8e182015-09-24 09:25:22 -0700432 CHECK_INTERFACE(IVehicleNetwork, data, reply);
433 sp<IVehicleNetworkHalMock> mock =
434 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
435 r = startMocking(mock);
436 BinderUtil::fillNoResultReply(reply);
437 return r;
438 } break;
439 case STOP_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800440 if (!isOperationAllowed(0, true)) {
441 return PERMISSION_DENIED;
442 }
keunyoung1ab8e182015-09-24 09:25:22 -0700443 CHECK_INTERFACE(IVehicleNetwork, data, reply);
444 sp<IVehicleNetworkHalMock> mock =
445 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
446 stopMocking(mock);
447 BinderUtil::fillNoResultReply(reply);
448 return NO_ERROR;
449 } break;
Keun-young Park28dd4702015-11-19 18:06:04 -0800450 case INJECT_HAL_ERROR: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800451 if (!isOperationAllowed(0, true)) {
452 return PERMISSION_DENIED;
453 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800454 CHECK_INTERFACE(IVehicleNetwork, data, reply);
455 int32_t errorCode = data.readInt32();
456 int32_t property = data.readInt32();
457 int32_t operation = data.readInt32();
458 r = injectHalError(errorCode, property, operation);
459 BinderUtil::fillNoResultReply(reply);
460 return r;
461 } break;
462 case START_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800463 if (!isOperationAllowed(0, false)) {
464 return PERMISSION_DENIED;
465 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800466 CHECK_INTERFACE(IVehicleNetwork, data, reply);
467 sp<IVehicleNetworkListener> listener =
468 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
469 r = startErrorListening(listener);
470 BinderUtil::fillNoResultReply(reply);
471 return r;
472 } break;
473 case STOP_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800474 if (!isOperationAllowed(0, false)) {
475 return PERMISSION_DENIED;
476 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800477 CHECK_INTERFACE(IVehicleNetwork, data, reply);
478 sp<IVehicleNetworkListener> listener =
479 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
480 stopErrorListening(listener);
481 BinderUtil::fillNoResultReply(reply);
482 return NO_ERROR;
483 } break;
484 case START_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800485 if (!isOperationAllowed(0, false)) {
486 return PERMISSION_DENIED;
487 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800488 CHECK_INTERFACE(IVehicleNetwork, data, reply);
489 sp<IVehicleNetworkListener> listener =
490 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
491 r = startHalRestartMonitoring(listener);
492 BinderUtil::fillNoResultReply(reply);
493 return r;
494 } break;
495 case STOP_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800496 if (!isOperationAllowed(0, false)) {
497 return PERMISSION_DENIED;
498 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800499 CHECK_INTERFACE(IVehicleNetwork, data, reply);
500 sp<IVehicleNetworkListener> listener =
501 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
502 stopHalRestartMonitoring(listener);
503 BinderUtil::fillNoResultReply(reply);
504 return NO_ERROR;
505 } break;
keunyounge18e25d2015-08-28 15:57:19 -0700506 default:
507 return BBinder::onTransact(code, data, reply, flags);
508 }
509}
510
511}; // namespace android