1 /*
2  * Copyright (c) 2024 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 "running_form_info.h"
17 #include "accesstoken_log.h"
18 #include "string_ex.h"
19 
20 namespace OHOS {
21 namespace Security {
22 namespace AccessToken {
23 namespace {
24 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {
25     LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "RunningFormInfo"
26 };
27 }
ReadFromParcel(Parcel & parcel)28 bool RunningFormInfo::ReadFromParcel(Parcel &parcel)
29 {
30     if (!parcel.ReadInt64(formId_)) {
31         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
32         return false;
33     }
34     std::u16string u16FormName;
35     std::u16string u16BundleName;
36     std::u16string u16ModuleName;
37     std::u16string u16AbilityName;
38     if ((!parcel.ReadString16(u16FormName)) || (!parcel.ReadString16(u16BundleName)) ||
39         (!parcel.ReadString16(u16ModuleName)) || (!parcel.ReadString16(u16AbilityName))) {
40         ACCESSTOKEN_LOG_ERROR(LABEL, "ReadString16 failed.");
41         return false;
42     }
43     formName_ = Str16ToStr8(u16FormName);
44     bundleName_ = Str16ToStr8(u16BundleName);
45     moduleName_ = Str16ToStr8(u16ModuleName);
46     abilityName_ = Str16ToStr8(u16AbilityName);
47 
48     if (!parcel.ReadString(description_)) {
49         ACCESSTOKEN_LOG_ERROR(LABEL, "ReadString failed.");
50         return false;
51     }
52 
53     if (!parcel.ReadInt32(dimension_)) {
54         ACCESSTOKEN_LOG_ERROR(LABEL, "ReadInt32 failed.");
55         return false;
56     }
57 
58     std::u16string u16HostBundleName;
59     if (!parcel.ReadString16(u16HostBundleName)) {
60         ACCESSTOKEN_LOG_ERROR(LABEL, "ReadString16 failed.");
61         return false;
62     }
63     hostBundleName_ = Str16ToStr8(u16HostBundleName);
64 
65     int32_t formVisiblity;
66     int32_t formUsageState;
67     int32_t formLocation;
68     if ((!parcel.ReadInt32(formVisiblity)) || (!parcel.ReadInt32(formUsageState)) ||
69         (!parcel.ReadInt32(formLocation))) {
70         ACCESSTOKEN_LOG_ERROR(LABEL, "ReadInt32 failed.");
71         return false;
72     }
73     formVisiblity_ = static_cast<FormVisibilityType>(formVisiblity);
74     formUsageState_ = static_cast<FormUsageState>(formUsageState);
75     formLocation_ = static_cast<FormLocation>(formLocation);
76     return true;
77 }
78 
Marshalling(Parcel & parcel) const79 bool RunningFormInfo::Marshalling(Parcel &parcel) const
80 {
81     if (!parcel.WriteInt64(formId_)) {
82         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteInt64 failed.");
83         return false;
84     }
85 
86     if (!parcel.WriteString16(Str8ToStr16(formName_))) {
87         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
88         return false;
89     }
90 
91     if (!parcel.WriteString16(Str8ToStr16(bundleName_))) {
92         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
93         return false;
94     }
95 
96     if (!parcel.WriteString16(Str8ToStr16(moduleName_))) {
97         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
98         return false;
99     }
100 
101     if (!parcel.WriteString16(Str8ToStr16(abilityName_))) {
102         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
103         return false;
104     }
105 
106     if (!parcel.WriteString(description_)) {
107         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString failed.");
108         return false;
109     }
110 
111     if (!parcel.WriteInt32(dimension_)) {
112         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteInt32 failed.");
113         return false;
114     }
115 
116     if (!parcel.WriteString16(Str8ToStr16(hostBundleName_))) {
117         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteString16 failed.");
118         return false;
119     }
120 
121     if (!parcel.WriteInt32((int32_t)formVisiblity_)) {
122         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteInt32 failed.");
123         return false;
124     }
125 
126     if (!parcel.WriteInt32(static_cast<int32_t>(formUsageState_))) {
127         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteInt32 failed.");
128         return false;
129     }
130 
131     if (!parcel.WriteInt32(static_cast<int32_t>(formLocation_))) {
132         ACCESSTOKEN_LOG_ERROR(LABEL, "WriteInt32 failed.");
133         return false;
134     }
135     return true;
136 }
137 
Unmarshalling(Parcel & parcel)138 RunningFormInfo* RunningFormInfo::Unmarshalling(Parcel &parcel)
139 {
140     std::unique_ptr<RunningFormInfo> object = std::make_unique<RunningFormInfo>();
141     if (object && !object->ReadFromParcel(parcel)) {
142         object = nullptr;
143         return nullptr;
144     }
145     return object.release();
146 }
147 } // namespace AccessToken
148 } // namespace Security
149 } // namespace OHOS