blob: 0b78f360e51954d430ed6a411c5e4ef0ec4583d0 [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();
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 Park883a2412016-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;
146 }
147 return exceptionCode;
148 }
keunyoung7d74e6d2015-10-14 15:43:10 -0700149 status = VehiclePropValueBinderUtil::readFromParcel(reply, value);
keunyounge18e25d2015-08-28 15:57:19 -0700150 }
151 return status;
152 }
153
154 virtual status_t subscribe(const sp<IVehicleNetworkListener> &listener, int32_t property,
Keun-young Park0727f952015-12-21 14:30:07 -0800155 float sampleRate, int32_t zones) {
keunyounge18e25d2015-08-28 15:57:19 -0700156 Parcel data, reply;
157 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
158 data.writeStrongBinder(IInterface::asBinder(listener));
159 data.writeInt32(property);
160 data.writeFloat(sampleRate);
Keun-young Park0727f952015-12-21 14:30:07 -0800161 data.writeInt32(zones);
keunyounge18e25d2015-08-28 15:57:19 -0700162 status_t status = remote()->transact(SUBSCRIBE, data, &reply);
163 return status;
164 }
165
166 virtual void unsubscribe(const sp<IVehicleNetworkListener> &listener, int32_t property) {
167 Parcel data, reply;
168 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
169 data.writeStrongBinder(IInterface::asBinder(listener));
170 data.writeInt32(property);
171 status_t status = remote()->transact(UNSUBSCRIBE, data, &reply);
172 if (status != NO_ERROR) {
173 ALOGI("unsubscribing property %d failed %d", property, status);
174 }
175 }
keunyoung1ab8e182015-09-24 09:25:22 -0700176
177 virtual status_t injectEvent(const vehicle_prop_value_t& value) {
178 Parcel data, reply;
179 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
180 data.writeInt32(1); // 0 means no value. For compatibility with aidl based code.
181 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
182 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
183 VehicleNetworkProtoUtil::toVehiclePropValue(value, *v.get());
184 int size = v->ByteSize();
185 WritableBlobHolder blob(new Parcel::WritableBlob());
186 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
187 data.writeInt32(size);
188 data.writeBlob(size, false, blob.blob);
189 v->SerializeToArray(blob.blob->data(), size);
190 status_t status = remote()->transact(INJECT_EVENT, data, &reply);
191 return status;
192 }
193
194 virtual status_t startMocking(const sp<IVehicleNetworkHalMock>& mock) {
195 Parcel data, reply;
196 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
197 data.writeStrongBinder(IInterface::asBinder(mock));
198 status_t status = remote()->transact(START_MOCKING, data, &reply);
199 return status;
200 }
201
202 virtual void stopMocking(const sp<IVehicleNetworkHalMock>& mock) {
203 Parcel data, reply;
204 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
205 data.writeStrongBinder(IInterface::asBinder(mock));
206 status_t status = remote()->transact(STOP_MOCKING, data, &reply);
207 if (status != NO_ERROR) {
208 ALOGI("stop mocking failed %d", status);
209 }
210 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800211
212 status_t injectHalError(int32_t errorCode, int32_t property, int32_t operation) {
213 Parcel data, reply;
214 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
215 data.writeInt32(errorCode);
216 data.writeInt32(property);
217 data.writeInt32(operation);
218 status_t status = remote()->transact(INJECT_HAL_ERROR, data, &reply);
219 return status;
220 }
221
222 virtual status_t startErrorListening(const sp<IVehicleNetworkListener> &listener) {
223 Parcel data, reply;
224 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
225 data.writeStrongBinder(IInterface::asBinder(listener));
226 status_t status = remote()->transact(START_ERROR_LISTENING, data, &reply);
227 return status;
228 }
229
230 virtual void stopErrorListening(const sp<IVehicleNetworkListener> &listener) {
231 Parcel data, reply;
232 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
233 data.writeStrongBinder(IInterface::asBinder(listener));
234 status_t status = remote()->transact(STOP_ERROR_LISTENING, data, &reply);
235 if (status != NO_ERROR) {
236 ALOGI("stopErrorListening %d", status);
237 }
238 }
239
240 virtual status_t startHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
241 Parcel data, reply;
242 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
243 data.writeStrongBinder(IInterface::asBinder(listener));
244 status_t status = remote()->transact(START_HAL_RESTART_MONITORING, data, &reply);
245 return status;
246 }
247
248 virtual void stopHalRestartMonitoring(const sp<IVehicleNetworkListener> &listener) {
249 Parcel data, reply;
250 data.writeInterfaceToken(IVehicleNetwork::getInterfaceDescriptor());
251 data.writeStrongBinder(IInterface::asBinder(listener));
252 status_t status = remote()->transact(STOP_HAL_RESTART_MONITORING, data, &reply);
253 if (status != NO_ERROR) {
254 ALOGI("stopHalRestartMonitoring %d", status);
255 }
256 }
keunyounge18e25d2015-08-28 15:57:19 -0700257};
258
259IMPLEMENT_META_INTERFACE(VehicleNetwork, IVehicleNetwork::SERVICE_NAME);
260
261// ----------------------------------------------------------------------
262
keunyounge18e25d2015-08-28 15:57:19 -0700263status_t BnVehicleNetwork::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
264 uint32_t flags) {
keunyounge18e25d2015-08-28 15:57:19 -0700265 status_t r;
266 switch (code) {
267 case LIST_PROPERTIES: {
268 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park737cdfb2016-02-12 15:11:39 -0800269 if (!isOperationAllowed(0, false)) {
270 return PERMISSION_DENIED;
271 }
keunyounge18e25d2015-08-28 15:57:19 -0700272 int32_t property = data.readInt32();
273 sp<VehiclePropertiesHolder> holder = listProperties(property);
274 if (holder.get() == NULL) { // given property not found
keunyoung15882e52015-09-16 16:57:58 -0700275 BinderUtil::fillObjectResultReply(reply, false /* isValid */);
276 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700277 }
278 std::unique_ptr<VehiclePropConfigs> configs(new VehiclePropConfigs());
279 ASSERT_OR_HANDLE_NO_MEMORY(configs.get(), return NO_MEMORY);
keunyoungd32f4e62015-09-21 11:33:06 -0700280 VehicleNetworkProtoUtil::toVehiclePropConfigs(holder->getList(), *configs.get());
keunyounge18e25d2015-08-28 15:57:19 -0700281 int size = configs->ByteSize();
282 WritableBlobHolder blob(new Parcel::WritableBlob());
283 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
keunyoung15882e52015-09-16 16:57:58 -0700284 BinderUtil::fillObjectResultReply(reply, true);
keunyounge18e25d2015-08-28 15:57:19 -0700285 reply->writeInt32(size);
286 reply->writeBlob(size, false, blob.blob);
287 configs->SerializeToArray(blob.blob->data(), size);
288 return NO_ERROR;
289 } break;
290 case SET_PROPERTY: {
291 CHECK_INTERFACE(IVehicleNetwork, data, reply);
keunyounge18e25d2015-08-28 15:57:19 -0700292 ScopedVehiclePropValue value;
keunyoung7d74e6d2015-10-14 15:43:10 -0700293 r = VehiclePropValueBinderUtil::readFromParcel(data, &value.value,
294 false /* deleteMembers */);
keunyounge18e25d2015-08-28 15:57:19 -0700295 if (r != NO_ERROR) {
keunyounge18e25d2015-08-28 15:57:19 -0700296 return r;
297 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800298 if (!isOperationAllowed(value.value.prop, true)) {
299 return PERMISSION_DENIED;
300 }
keunyounge18e25d2015-08-28 15:57:19 -0700301 r = setProperty(value.value);
Keun-young Park883a2412016-04-25 18:59:22 -0700302 if (r == NO_ERROR) {
303 reply->writeNoException();
304 } else if (r == -EAGAIN) {
305 // this should be handled specially to throw ServiceSpecificException in java.
306 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
307 return NO_ERROR;
308 } else if (r == -ESHUTDOWN) {
309 // this should be handled specially to throw IllegalStateException in java.
310 reply->writeInt32(binder::Status::EX_ILLEGAL_STATE);
311 return NO_ERROR;
312 }
keunyounge18e25d2015-08-28 15:57:19 -0700313 return r;
314 } break;
315 case GET_PROPERTY: {
316 CHECK_INTERFACE(IVehicleNetwork, data, reply);
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800317 vehicle_prop_value_t value;
318 memset(&value, 0, sizeof(value));
319 r = VehiclePropValueBinderUtil::readFromParcel(data, &value,
keunyoung7d74e6d2015-10-14 15:43:10 -0700320 false /* deleteMembers */, true /*canIgnoreNoData*/);
321 if (r != NO_ERROR) {
322 ALOGE("getProperty cannot read %d", r);
323 return r;
324 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800325 if (!isOperationAllowed(value.prop, false)) {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800326 return PERMISSION_DENIED;
327 }
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800328 r = getProperty(&value);
keunyounge18e25d2015-08-28 15:57:19 -0700329 if (r == NO_ERROR) {
keunyoung7d74e6d2015-10-14 15:43:10 -0700330 reply->writeNoException();
Keun-young Park71b2f5c2016-03-10 18:44:40 -0800331 r = VehiclePropValueBinderUtil::writeToParcel(*reply, value);
332 releaseMemoryFromGet(&value);
Keun-young Parkba485482016-03-24 13:24:31 -0700333 } else if (r == -EAGAIN) {
334 // this should be handled specially to throw ServiceSpecificException in java.
335 reply->writeInt32(binder::Status::EX_SERVICE_SPECIFIC);
336 return NO_ERROR;
keunyounge18e25d2015-08-28 15:57:19 -0700337 }
338 return r;
339 } break;
340 case SUBSCRIBE: {
341 CHECK_INTERFACE(IVehicleNetwork, data, reply);
342 sp<IVehicleNetworkListener> listener =
343 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
344 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800345 if (!isOperationAllowed(property, false)) {
346 return PERMISSION_DENIED;
347 }
keunyounge18e25d2015-08-28 15:57:19 -0700348 float sampleRate = data.readFloat();
Keun-young Park0727f952015-12-21 14:30:07 -0800349 int32_t zones = data.readInt32();
350 r = subscribe(listener, property, sampleRate, zones);
keunyoung15882e52015-09-16 16:57:58 -0700351 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700352 return r;
353 } break;
354 case UNSUBSCRIBE: {
355 CHECK_INTERFACE(IVehicleNetwork, data, reply);
356 sp<IVehicleNetworkListener> listener =
357 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
358 int32_t property = data.readInt32();
Keun-young Park737cdfb2016-02-12 15:11:39 -0800359 if (!isOperationAllowed(property, false)) {
360 return PERMISSION_DENIED;
361 }
keunyounge18e25d2015-08-28 15:57:19 -0700362 unsubscribe(listener, property);
keunyoung15882e52015-09-16 16:57:58 -0700363 BinderUtil::fillNoResultReply(reply);
keunyounge18e25d2015-08-28 15:57:19 -0700364 return NO_ERROR;
365 } break;
keunyoung1ab8e182015-09-24 09:25:22 -0700366 case INJECT_EVENT: {
367 CHECK_INTERFACE(IVehicleNetwork, data, reply);
368 if (data.readInt32() == 0) { // java side allows passing null with this.
369 return BAD_VALUE;
370 }
Keun-young Park737cdfb2016-02-12 15:11:39 -0800371 if (!isOperationAllowed(0, true)) {
372 return PERMISSION_DENIED;
373 }
keunyoung1ab8e182015-09-24 09:25:22 -0700374 ScopedVehiclePropValue value;
375 ReadableBlobHolder blob(new Parcel::ReadableBlob());
376 ASSERT_OR_HANDLE_NO_MEMORY(blob.blob, return NO_MEMORY);
377 int32_t size = data.readInt32();
378 r = data.readBlob(size, blob.blob);
379 if (r != NO_ERROR) {
380 ALOGE("injectEvent:service, cannot read blob");
381 return r;
382 }
383 std::unique_ptr<VehiclePropValue> v(new VehiclePropValue());
384 ASSERT_OR_HANDLE_NO_MEMORY(v.get(), return NO_MEMORY);
385 if (!v->ParseFromArray(blob.blob->data(), size)) {
386 ALOGE("injectEvent:service, cannot parse data");
387 return BAD_VALUE;
388 }
389 r = VehicleNetworkProtoUtil::fromVehiclePropValue(*v.get(), value.value);
390 if (r != NO_ERROR) {
391 ALOGE("injectEvent:service, cannot convert data");
392 return BAD_VALUE;
393 }
394 r = injectEvent(value.value);
395 BinderUtil::fillNoResultReply(reply);
396 return r;
397 } break;
398 case START_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800399 if (!isOperationAllowed(0, true)) {
400 return PERMISSION_DENIED;
401 }
keunyoung1ab8e182015-09-24 09:25:22 -0700402 CHECK_INTERFACE(IVehicleNetwork, data, reply);
403 sp<IVehicleNetworkHalMock> mock =
404 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
405 r = startMocking(mock);
406 BinderUtil::fillNoResultReply(reply);
407 return r;
408 } break;
409 case STOP_MOCKING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800410 if (!isOperationAllowed(0, true)) {
411 return PERMISSION_DENIED;
412 }
keunyoung1ab8e182015-09-24 09:25:22 -0700413 CHECK_INTERFACE(IVehicleNetwork, data, reply);
414 sp<IVehicleNetworkHalMock> mock =
415 interface_cast<IVehicleNetworkHalMock>(data.readStrongBinder());
416 stopMocking(mock);
417 BinderUtil::fillNoResultReply(reply);
418 return NO_ERROR;
419 } break;
Keun-young Park28dd4702015-11-19 18:06:04 -0800420 case INJECT_HAL_ERROR: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800421 if (!isOperationAllowed(0, true)) {
422 return PERMISSION_DENIED;
423 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800424 CHECK_INTERFACE(IVehicleNetwork, data, reply);
425 int32_t errorCode = data.readInt32();
426 int32_t property = data.readInt32();
427 int32_t operation = data.readInt32();
428 r = injectHalError(errorCode, property, operation);
429 BinderUtil::fillNoResultReply(reply);
430 return r;
431 } break;
432 case START_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800433 if (!isOperationAllowed(0, false)) {
434 return PERMISSION_DENIED;
435 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800436 CHECK_INTERFACE(IVehicleNetwork, data, reply);
437 sp<IVehicleNetworkListener> listener =
438 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
439 r = startErrorListening(listener);
440 BinderUtil::fillNoResultReply(reply);
441 return r;
442 } break;
443 case STOP_ERROR_LISTENING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800444 if (!isOperationAllowed(0, false)) {
445 return PERMISSION_DENIED;
446 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800447 CHECK_INTERFACE(IVehicleNetwork, data, reply);
448 sp<IVehicleNetworkListener> listener =
449 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
450 stopErrorListening(listener);
451 BinderUtil::fillNoResultReply(reply);
452 return NO_ERROR;
453 } break;
454 case START_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800455 if (!isOperationAllowed(0, false)) {
456 return PERMISSION_DENIED;
457 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800458 CHECK_INTERFACE(IVehicleNetwork, data, reply);
459 sp<IVehicleNetworkListener> listener =
460 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
461 r = startHalRestartMonitoring(listener);
462 BinderUtil::fillNoResultReply(reply);
463 return r;
464 } break;
465 case STOP_HAL_RESTART_MONITORING: {
Keun-young Park737cdfb2016-02-12 15:11:39 -0800466 if (!isOperationAllowed(0, false)) {
467 return PERMISSION_DENIED;
468 }
Keun-young Park28dd4702015-11-19 18:06:04 -0800469 CHECK_INTERFACE(IVehicleNetwork, data, reply);
470 sp<IVehicleNetworkListener> listener =
471 interface_cast<IVehicleNetworkListener>(data.readStrongBinder());
472 stopHalRestartMonitoring(listener);
473 BinderUtil::fillNoResultReply(reply);
474 return NO_ERROR;
475 } break;
keunyounge18e25d2015-08-28 15:57:19 -0700476 default:
477 return BBinder::onTransact(code, data, reply, flags);
478 }
479}
480
481}; // namespace android