1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "geo_convert_skeleton.h"
17 #include "common_utils.h"
18 #include "ipc_skeleton.h"
19 #include "location_log.h"
20
21 namespace OHOS {
22 namespace Location {
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)23 int GeoConvertServiceStub::OnRemoteRequest(uint32_t code,
24 MessageParcel &data, MessageParcel &reply, MessageOption &option)
25 {
26 pid_t callingPid = IPCSkeleton::GetCallingPid();
27 pid_t callingUid = IPCSkeleton::GetCallingUid();
28 LBSLOGI(GEO_CONVERT, "OnRemoteRequest cmd = %{public}u, flags= %{public}d, pid= %{public}d, uid= %{public}d",
29 code, option.GetFlags(), callingPid, callingUid);
30
31 if (data.ReadInterfaceToken() != GetDescriptor()) {
32 LBSLOGE(GEO_CONVERT, "invalid token.");
33 reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
34 return ERRCODE_SERVICE_UNAVAILABLE;
35 }
36
37 int ret = ERRCODE_SUCCESS;
38 switch (code) {
39 case IS_AVAILABLE: {
40 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
41 return ERRCODE_PERMISSION_DENIED;
42 }
43 IsGeoConvertAvailable(reply);
44 break;
45 }
46 case GET_FROM_COORDINATE: {
47 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
48 return ERRCODE_PERMISSION_DENIED;
49 }
50 GetAddressByCoordinate(data, reply);
51 break;
52 }
53 case GET_FROM_LOCATION_NAME_BY_BOUNDARY: {
54 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
55 return ERRCODE_PERMISSION_DENIED;
56 }
57 GetAddressByLocationName(data, reply);
58 break;
59 }
60 case ENABLE_REVERSE_GEOCODE_MOCK: {
61 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
62 return ERRCODE_PERMISSION_DENIED;
63 }
64 EnableReverseGeocodingMock() ? reply.WriteInt32(ERRCODE_SUCCESS) :
65 reply.WriteInt32(ERRCODE_REVERSE_GEOCODING_FAIL);
66 break;
67 }
68 case DISABLE_REVERSE_GEOCODE_MOCK: {
69 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
70 return ERRCODE_PERMISSION_DENIED;
71 }
72 DisableReverseGeocodingMock() ? reply.WriteInt32(ERRCODE_SUCCESS) :
73 reply.WriteInt32(ERRCODE_REVERSE_GEOCODING_FAIL);
74 break;
75 }
76 case SET_REVERSE_GEOCODE_MOCKINFO: {
77 if (!CommonUtils::CheckCallingPermission(callingUid, callingPid, reply)) {
78 return ERRCODE_PERMISSION_DENIED;
79 }
80 std::vector<std::shared_ptr<GeocodingMockInfo>> mockInfo = ParseGeocodingMockInfos(data);
81 reply.WriteInt32(SetReverseGeocodingMockInfo(mockInfo));
82 break;
83 }
84 default:
85 ret = IPCObjectStub::OnRemoteRequest(code, data, reply, option);
86 }
87 return ret;
88 }
89
ParseGeocodingMockInfos(MessageParcel & data)90 std::vector<std::shared_ptr<GeocodingMockInfo>> GeoConvertServiceStub::ParseGeocodingMockInfos(MessageParcel &data)
91 {
92 std::vector<std::shared_ptr<GeocodingMockInfo>> mockInfo;
93 int arraySize = data.ReadInt32();
94 arraySize = arraySize > INPUT_ARRAY_LEN_MAX ? INPUT_ARRAY_LEN_MAX :
95 arraySize;
96 if (arraySize <= 0) {
97 return std::vector<std::shared_ptr<GeocodingMockInfo>>();
98 }
99 for (int i = 0; i < arraySize; i++) {
100 std::shared_ptr<GeocodingMockInfo> info = std::make_shared<GeocodingMockInfo>();
101 info->ReadFromParcel(data);
102 mockInfo.push_back(info);
103 }
104 return mockInfo;
105 }
106 } // namespace Location
107 } // namespace OHOS
108