1 /*
2 * Copyright (c) 2020 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 "element_name_utils.h"
17
18 #include <cstring>
19
20 #include "utils.h"
21
22 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
23 namespace {
24 constexpr int VALUE_NULL = 0;
25 constexpr int VALUE_OBJECT = 1;
26 constexpr int MAX_BUNDLE_NAME = 127;
27 constexpr int MAX_ABILITY_NAME = 127;
28 constexpr int MAX_DEVICE_ID = 1024;
29 }
30 #endif
31
ClearElement(ElementName * element)32 void ClearElement(ElementName *element)
33 {
34 if (element == nullptr) {
35 return;
36 }
37
38 AdapterFree(element->deviceId);
39 AdapterFree(element->bundleName);
40 AdapterFree(element->abilityName);
41 }
42
SetElementDeviceID(ElementName * element,const char * deviceId)43 bool SetElementDeviceID(ElementName *element, const char *deviceId)
44 {
45 if (element == nullptr) {
46 return false;
47 }
48
49 AdapterFree(element->deviceId);
50 element->deviceId = OHOS::Utils::Strdup(deviceId);
51 return element->deviceId != nullptr;
52 }
53
SetElementBundleName(ElementName * element,const char * bundleName)54 bool SetElementBundleName(ElementName *element, const char *bundleName)
55 {
56 if (element == nullptr) {
57 return false;
58 }
59
60 AdapterFree(element->bundleName);
61 element->bundleName = OHOS::Utils::Strdup(bundleName);
62 return element->bundleName != nullptr;
63 }
64
SetElementAbilityName(ElementName * element,const char * abilityName)65 bool SetElementAbilityName(ElementName *element, const char *abilityName)
66 {
67 if (element == nullptr) {
68 return false;
69 }
70
71 AdapterFree(element->abilityName);
72 element->abilityName = OHOS::Utils::Strdup(abilityName);
73 return element->abilityName != nullptr;
74 }
75
76 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
SerializeElement(IpcIo * io,const ElementName * element)77 bool SerializeElement(IpcIo *io, const ElementName *element)
78 {
79 if ((io == nullptr) || (element == nullptr)) {
80 return false;
81 }
82
83 if (element->deviceId == nullptr || strlen(element->deviceId) == 0) {
84 IpcIoPushInt32(io, VALUE_NULL);
85 } else if (strlen(element->deviceId) > MAX_DEVICE_ID) {
86 return false;
87 } else {
88 IpcIoPushInt32(io, VALUE_OBJECT);
89 IpcIoPushString(io, element->deviceId);
90 }
91 if (element->bundleName == nullptr || strlen(element->bundleName) == 0) {
92 IpcIoPushInt32(io, VALUE_NULL);
93 } else if (strlen(element->bundleName) > MAX_BUNDLE_NAME) {
94 return false;
95 } else {
96 IpcIoPushInt32(io, VALUE_OBJECT);
97 IpcIoPushString(io, element->bundleName);
98 }
99 if (element->abilityName == nullptr || strlen(element->abilityName) == 0) {
100 IpcIoPushInt32(io, VALUE_NULL);
101 } else if (strlen(element->abilityName) > MAX_ABILITY_NAME) {
102 return false;
103 } else {
104 IpcIoPushInt32(io, VALUE_OBJECT);
105 IpcIoPushString(io, element->abilityName);
106 }
107 return true;
108 }
109
DeserializeElement(ElementName * element,IpcIo * io)110 bool DeserializeElement(ElementName *element, IpcIo *io)
111 {
112 if ((io == nullptr) || (element == nullptr)) {
113 return false;
114 }
115
116 if (IpcIoPopInt32(io) == VALUE_OBJECT &&
117 !SetElementDeviceID(element, reinterpret_cast<char *>(IpcIoPopString(io, nullptr)))) {
118 return false;
119 }
120 if (IpcIoPopInt32(io) == VALUE_OBJECT &&
121 !SetElementBundleName(element, reinterpret_cast<char *>(IpcIoPopString(io, nullptr)))) {
122 ClearElement(element);
123 return false;
124 }
125 if (IpcIoPopInt32(io) == VALUE_OBJECT &&
126 !SetElementAbilityName(element, reinterpret_cast<char *>(IpcIoPopString(io, nullptr)))) {
127 ClearElement(element);
128 return false;
129 }
130 return true;
131 }
132 #endif