1 /*
2 * Copyright (c) 2021-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 "sender_info.h"
17
18 #include "hilog_tag_wrapper.h"
19
20 namespace OHOS {
21 namespace AAFwk {
ReadFromParcel(Parcel & parcel)22 bool SenderInfo::ReadFromParcel(Parcel &parcel)
23 {
24 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
25
26 code = parcel.ReadInt32();
27 std::unique_ptr<Want> wantResquest(parcel.ReadParcelable<Want>());
28 if (wantResquest == nullptr) {
29 TAG_LOGE(AAFwkTag::ABILITYMGR, "null wantResquest");
30 return false;
31 }
32 want = *wantResquest;
33 resolvedType = Str16ToStr8(parcel.ReadString16());
34
35 if (parcel.ReadBool()) {
36 sptr<IRemoteObject> finishedReceiverResquest = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject();
37 if (finishedReceiverResquest == nullptr) {
38 TAG_LOGE(AAFwkTag::ABILITYMGR, "null remote object");
39 return false;
40 }
41 finishedReceiver = iface_cast<IWantReceiver>(finishedReceiverResquest);
42 if (!finishedReceiver) {
43 TAG_LOGE(AAFwkTag::ABILITYMGR, "null receiver");
44 return false;
45 }
46 }
47 requiredPermission = Str16ToStr8(parcel.ReadString16());
48 if (parcel.ReadBool()) {
49 startOptions = parcel.ReadParcelable<StartOptions>();
50 }
51 if (parcel.ReadBool()) {
52 callerToken = (static_cast<MessageParcel*>(&parcel))->ReadRemoteObject();
53 if (callerToken == nullptr) {
54 TAG_LOGE(AAFwkTag::ABILITYMGR, "null remote object");
55 return false;
56 }
57 }
58 operType = parcel.ReadInt32();
59 uid = parcel.ReadInt32();
60 tokenId = parcel.ReadUint32();
61 return true;
62 }
63
Unmarshalling(Parcel & parcel)64 SenderInfo *SenderInfo::Unmarshalling(Parcel &parcel)
65 {
66 TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
67
68 SenderInfo *info = new (std::nothrow) SenderInfo();
69 if (info == nullptr) {
70 TAG_LOGE(AAFwkTag::ABILITYMGR, "null senderInfo");
71 return nullptr;
72 }
73
74 if (!info->ReadFromParcel(parcel)) {
75 TAG_LOGE(AAFwkTag::ABILITYMGR, "ReadFromParcel failed");
76 delete info;
77 info = nullptr;
78 }
79 return info;
80 }
81
Marshalling(Parcel & parcel) const82 bool SenderInfo::Marshalling(Parcel &parcel) const
83 {
84 if (!parcel.WriteInt32(code)) {
85 TAG_LOGE(AAFwkTag::ABILITYMGR, "write code failed");
86 return false;
87 }
88 if (!parcel.WriteParcelable(&want)) {
89 TAG_LOGE(AAFwkTag::ABILITYMGR, "write want failed");
90 return false;
91 }
92 if (!parcel.WriteString16(Str8ToStr16(resolvedType))) {
93 TAG_LOGE(AAFwkTag::ABILITYMGR, "write resolvedType failed");
94 return false;
95 }
96 if (!parcel.WriteBool(finishedReceiver != nullptr)) {
97 TAG_LOGE(AAFwkTag::ABILITYMGR, "write flag failed");
98 return false;
99 }
100 if (finishedReceiver) {
101 if (finishedReceiver->AsObject() == nullptr) {
102 TAG_LOGE(AAFwkTag::ABILITYMGR, "null object");
103 return false;
104 }
105 if (!(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(finishedReceiver->AsObject())) {
106 TAG_LOGE(AAFwkTag::ABILITYMGR, "write receiver failed");
107 return false;
108 }
109 }
110 return MarshallingInner(parcel);
111 }
112
MarshallingInner(Parcel & parcel) const113 bool SenderInfo::MarshallingInner(Parcel &parcel) const
114 {
115 if (!parcel.WriteString16(Str8ToStr16(requiredPermission))) {
116 TAG_LOGE(AAFwkTag::ABILITYMGR, "write requiredPermission failed");
117 return false;
118 }
119 if (!parcel.WriteBool(startOptions != nullptr)) {
120 TAG_LOGE(AAFwkTag::ABILITYMGR, "write flag failed");
121 return false;
122 }
123 if (startOptions) {
124 if (!parcel.WriteParcelable(startOptions)) {
125 TAG_LOGE(AAFwkTag::ABILITYMGR, "write startOptions failed");
126 return false;
127 }
128 }
129 if (!parcel.WriteBool(callerToken != nullptr)) {
130 TAG_LOGE(AAFwkTag::ABILITYMGR, "write flag failed");
131 return false;
132 }
133 if (callerToken) {
134 if (!(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(callerToken)) {
135 TAG_LOGE(AAFwkTag::ABILITYMGR, "write callerToken failed");
136 return false;
137 }
138 }
139 if (!parcel.WriteInt32(operType)) {
140 TAG_LOGE(AAFwkTag::ABILITYMGR, "write operType failed");
141 return false;
142 }
143 if (!parcel.WriteInt32(uid)) {
144 TAG_LOGE(AAFwkTag::ABILITYMGR, "write uid failed");
145 return false;
146 }
147 if (!parcel.WriteUint32(tokenId)) {
148 TAG_LOGE(AAFwkTag::ABILITYMGR, "write tokenId failed");
149 return false;
150 }
151 return true;
152 }
153 } // namespace AAFwk
154 } // namespace OHOS
155