• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 "local_pending_want.h"
17 
18 #include "ability_runtime_error_util.h"
19 #include "hilog_tag_wrapper.h"
20 #include "ipc_skeleton.h"
21 #include "want_agent_client.h"
22 #include "want_sender_info.h"
23 
24 namespace OHOS::AbilityRuntime::WantAgent {
LocalPendingWant(const std::string & bundleName,const std::shared_ptr<AAFwk::Want> & want,int32_t operType)25 LocalPendingWant::LocalPendingWant(const std::string &bundleName,
26     const std::shared_ptr<AAFwk::Want> &want, int32_t operType)
27     : bundleName_(bundleName), want_(*want), operType_(operType)
28 {
29     static std::atomic_int id(0);
30     hashCode_ = ++id;
31     uid_ = IPCSkeleton::GetCallingUid();
32     tokenId_ = IPCSkeleton::GetCallingTokenID();
33 }
34 
GetBundleName() const35 std::string LocalPendingWant::GetBundleName() const
36 {
37     return bundleName_;
38 }
39 
SetBundleName(const std::string & bundleName)40 void LocalPendingWant::SetBundleName(const std::string &bundleName)
41 {
42     bundleName_ = bundleName;
43 }
44 
GetUid() const45 int32_t LocalPendingWant::GetUid() const
46 {
47     return uid_;
48 }
49 
SetUid(int32_t uid)50 void LocalPendingWant::SetUid(int32_t uid)
51 {
52     uid_ = uid;
53 }
54 
GetType() const55 int32_t LocalPendingWant::GetType() const
56 {
57     return operType_;
58 }
59 
SetType(int32_t operType)60 void LocalPendingWant::SetType(int32_t operType)
61 {
62     operType_ = operType;
63 }
64 
GetWant() const65 std::shared_ptr<AAFwk::Want> LocalPendingWant::GetWant() const
66 {
67     return std::make_shared<AAFwk::Want>(want_);
68 }
69 
SetWant(const std::shared_ptr<AAFwk::Want> & want)70 void LocalPendingWant::SetWant(const std::shared_ptr<AAFwk::Want> &want)
71 {
72     if (want != nullptr) {
73         want_ = *want;
74     }
75 }
76 
GetHashCode() const77 int32_t LocalPendingWant::GetHashCode() const
78 {
79     return hashCode_;
80 }
81 
SetHashCode(int32_t hashCode)82 void LocalPendingWant::SetHashCode(int32_t hashCode)
83 {
84     hashCode_ = hashCode;
85 }
86 
GetTokenId() const87 uint32_t LocalPendingWant::GetTokenId() const
88 {
89     return tokenId_;
90 }
91 
SetTokenId(uint32_t tokenId)92 void LocalPendingWant::SetTokenId(uint32_t tokenId)
93 {
94     tokenId_ = tokenId;
95 }
96 
Send(const sptr<CompletedDispatcher> & callBack,const TriggerInfo & paramsInfo,sptr<IRemoteObject> callerToken)97 ErrCode LocalPendingWant::Send(const sptr<CompletedDispatcher> &callBack, const TriggerInfo &paramsInfo,
98     sptr<IRemoteObject> callerToken)
99 {
100     TAG_LOGD(AAFwkTag::WANTAGENT, "call");
101     AAFwk::SenderInfo senderInfo;
102     senderInfo.resolvedType = want_.GetType();
103     senderInfo.want = want_;
104     const auto options = paramsInfo.GetExtraInfo();
105     if (options != nullptr) {
106         senderInfo.want.SetParams(*options);
107     }
108     const auto startOptions = paramsInfo.GetStartOptions();
109     if (startOptions != nullptr) {
110         senderInfo.startOptions = new (std::nothrow) AAFwk::StartOptions(*startOptions);
111     }
112     senderInfo.requiredPermission = paramsInfo.GetPermission();
113     senderInfo.code = paramsInfo.GetResultCode();
114     senderInfo.finishedReceiver = callBack;
115     senderInfo.operType = operType_;
116     senderInfo.uid = uid_;
117     senderInfo.tokenId = tokenId_;
118     senderInfo.callerToken = callerToken;
119     const auto result = AAFwk::WantAgentClient::GetInstance().SendLocalWantSender(senderInfo);
120     if (result != 0 && result != ERR_ABILITY_RUNTIME_EXTERNAL_NO_ACCESS_PERMISSION) {
121         return ERR_ABILITY_RUNTIME_EXTERNAL_SERVICE_BUSY;
122     }
123     return result;
124 }
125 
Marshalling(Parcel & parcel) const126 bool LocalPendingWant::Marshalling(Parcel &parcel) const
127 {
128     if (!parcel.WriteString(bundleName_)) {
129         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write bundleName");
130         return false;
131     }
132     if (!parcel.WriteInt32(uid_)) {
133         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write uid");
134         return false;
135     }
136     if (!parcel.WriteInt32(hashCode_)) {
137         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write hashCode");
138         return false;
139     }
140     if (!parcel.WriteParcelable(&want_)) {
141         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write want");
142         return false;
143     }
144     if (!parcel.WriteInt32(operType_)) {
145         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write operType");
146         return false;
147     }
148     if (!parcel.WriteUint32(tokenId_)) {
149         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write tokenId");
150         return false;
151     }
152     return true;
153 }
154 
Unmarshalling(Parcel & parcel)155 LocalPendingWant *LocalPendingWant::Unmarshalling(Parcel &parcel)
156 {
157     std::string bundleName;
158     if (!parcel.ReadString(bundleName)) {
159         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read bundleName");
160         return nullptr;
161     }
162     int32_t uid = 0;
163     if (!parcel.ReadInt32(uid)) {
164         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read uid");
165         return nullptr;
166     }
167     int32_t hashCode = 0;
168     if (!parcel.ReadInt32(hashCode)) {
169         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read hashCode");
170         return nullptr;
171     }
172     std::shared_ptr<AAFwk::Want> want(parcel.ReadParcelable<AAFwk::Want>());
173     if (!want) {
174         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read want");
175         return nullptr;
176     }
177     int32_t operType = 0;
178     if (!parcel.ReadInt32(operType)) {
179         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read operType");
180         return nullptr;
181     }
182     uint32_t tokenId = 0;
183     if (!parcel.ReadUint32(tokenId)) {
184         TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read tokenId");
185         return nullptr;
186     }
187     LocalPendingWant *localPendingWant = new (std::nothrow) LocalPendingWant(
188         bundleName, want, operType);
189     if (localPendingWant == nullptr) {
190         TAG_LOGE(AAFwkTag::WANTAGENT, "Read from parcel failed");
191         return nullptr;
192     }
193     localPendingWant->SetHashCode(hashCode);
194     localPendingWant->SetUid(uid);
195     localPendingWant->SetTokenId(tokenId);
196     return localPendingWant;
197 }
198 
IsEquals(const std::shared_ptr<LocalPendingWant> & localPendingWant,const std::shared_ptr<LocalPendingWant> & otherLocalPendingWant)199 ErrCode LocalPendingWant::IsEquals(
200     const std::shared_ptr<LocalPendingWant> &localPendingWant,
201     const std::shared_ptr<LocalPendingWant> &otherLocalPendingWant)
202 {
203     if ((localPendingWant == nullptr) && (otherLocalPendingWant == nullptr)) {
204         return ERR_OK;
205     }
206     if ((localPendingWant == nullptr) || (otherLocalPendingWant == nullptr)) {
207         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
208     }
209     const auto targetCode = localPendingWant->GetHashCode();
210     const auto otherCode = otherLocalPendingWant->GetHashCode();
211     const int32_t NOTEQ = -1;
212     return targetCode == otherCode ? ERR_OK : NOTEQ;
213 }
214 }