• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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