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
20namespace OHOS {
21namespace AAFwk {
22bool 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    return true;
52}
53
54SenderInfo *SenderInfo::Unmarshalling(Parcel &parcel)
55{
56    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
57
58    SenderInfo *info = new (std::nothrow) SenderInfo();
59    if (info == nullptr) {
60        TAG_LOGE(AAFwkTag::ABILITYMGR, "null senderInfo");
61        return nullptr;
62    }
63
64    if (!info->ReadFromParcel(parcel)) {
65        TAG_LOGE(AAFwkTag::ABILITYMGR, "ReadFromParcel failed");
66        delete info;
67        info = nullptr;
68    }
69    return info;
70}
71
72bool SenderInfo::Marshalling(Parcel &parcel) const
73{
74    TAG_LOGD(AAFwkTag::ABILITYMGR, "call");
75
76    if (!parcel.WriteInt32(code)) {
77        TAG_LOGE(AAFwkTag::ABILITYMGR, "write code failed");
78        return false;
79    }
80    if (!parcel.WriteParcelable(&want)) {
81        TAG_LOGE(AAFwkTag::ABILITYMGR, "write want failed");
82        return false;
83    }
84    if (!parcel.WriteString16(Str8ToStr16(resolvedType))) {
85        TAG_LOGE(AAFwkTag::ABILITYMGR, "write resolvedType failed");
86        return false;
87    }
88    if (!parcel.WriteBool(finishedReceiver != nullptr)) {
89        TAG_LOGE(AAFwkTag::ABILITYMGR, "write flag failed");
90        return false;
91    }
92    if (finishedReceiver) {
93        if (finishedReceiver->AsObject() == nullptr) {
94            TAG_LOGE(AAFwkTag::ABILITYMGR, "null object");
95            return false;
96        }
97        if (!(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(finishedReceiver->AsObject())) {
98            TAG_LOGE(AAFwkTag::ABILITYMGR, "write receiver failed");
99            return false;
100        }
101    }
102    if (!parcel.WriteString16(Str8ToStr16(requiredPermission))) {
103        TAG_LOGE(AAFwkTag::ABILITYMGR, "write requiredPermission failed");
104        return false;
105    }
106    if (!parcel.WriteBool(startOptions != nullptr)) {
107        TAG_LOGE(AAFwkTag::ABILITYMGR, "write flag failed");
108        return false;
109    }
110    if (startOptions) {
111        if (!parcel.WriteParcelable(startOptions)) {
112            TAG_LOGE(AAFwkTag::ABILITYMGR, "write startOptions failed");
113            return false;
114        }
115    }
116    return true;
117}
118}  // namespace AAFwk
119}  // namespace OHOS
120