1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci
16020a203aSopenharmony_ci#ifndef OHOS_HIVIEWDFX_ADAPTER_SERVICE_IDL_INCLUDE_COLLECT_RESULT_PARCELABLE_H
17020a203aSopenharmony_ci#define OHOS_HIVIEWDFX_ADAPTER_SERVICE_IDL_INCLUDE_COLLECT_RESULT_PARCELABLE_H
18020a203aSopenharmony_ci
19020a203aSopenharmony_ci#include "parcel.h"
20020a203aSopenharmony_ci
21020a203aSopenharmony_ci#include <vector>
22020a203aSopenharmony_ci
23020a203aSopenharmony_ci#include "collect_result.h"
24020a203aSopenharmony_ci
25020a203aSopenharmony_cinamespace OHOS {
26020a203aSopenharmony_cinamespace HiviewDFX {
27020a203aSopenharmony_citemplate<typename T>
28020a203aSopenharmony_cistruct CollectResultParcelable : public Parcelable {
29020a203aSopenharmony_ci    CollectResultParcelable(CollectResult<T>& result)
30020a203aSopenharmony_ci    {
31020a203aSopenharmony_ci        result_.retCode = result.retCode;
32020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, int32_t>) {
33020a203aSopenharmony_ci            result_.data = result.data;
34020a203aSopenharmony_ci        }
35020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, double>) {
36020a203aSopenharmony_ci            result_.data = result.data;
37020a203aSopenharmony_ci        }
38020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, std::vector<std::string>>) {
39020a203aSopenharmony_ci            result_.data.insert(result_.data.begin(), result.data.begin(), result.data.end());
40020a203aSopenharmony_ci        }
41020a203aSopenharmony_ci    }
42020a203aSopenharmony_ci
43020a203aSopenharmony_ci    bool Marshalling(Parcel& outParcel) const override
44020a203aSopenharmony_ci    {
45020a203aSopenharmony_ci        if (!outParcel.WriteInt32(result_.retCode)) {
46020a203aSopenharmony_ci            return false;
47020a203aSopenharmony_ci        }
48020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, int32_t>) {
49020a203aSopenharmony_ci            return outParcel.WriteInt32(result_.data);
50020a203aSopenharmony_ci        }
51020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, double>) {
52020a203aSopenharmony_ci            return outParcel.WriteDouble(result_.data);
53020a203aSopenharmony_ci        }
54020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, std::vector<std::string>>) {
55020a203aSopenharmony_ci            return outParcel.WriteStringVector(result_.data);
56020a203aSopenharmony_ci        }
57020a203aSopenharmony_ci        return true;
58020a203aSopenharmony_ci    }
59020a203aSopenharmony_ci
60020a203aSopenharmony_ci    static CollectResultParcelable<T>* Unmarshalling(Parcel& inParcel)
61020a203aSopenharmony_ci    {
62020a203aSopenharmony_ci        int32_t retCode;
63020a203aSopenharmony_ci        if (!inParcel.ReadInt32(retCode)) {
64020a203aSopenharmony_ci            return nullptr;
65020a203aSopenharmony_ci        }
66020a203aSopenharmony_ci        T data;
67020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, int32_t>) {
68020a203aSopenharmony_ci            if (!inParcel.ReadInt32(data)) {
69020a203aSopenharmony_ci                return nullptr;
70020a203aSopenharmony_ci            }
71020a203aSopenharmony_ci        }
72020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, double>) {
73020a203aSopenharmony_ci            if (!inParcel.ReadDouble(data)) {
74020a203aSopenharmony_ci                return nullptr;
75020a203aSopenharmony_ci            }
76020a203aSopenharmony_ci        }
77020a203aSopenharmony_ci        if constexpr (std::is_same_v<std::decay_t<T>, std::vector<std::string>>) {
78020a203aSopenharmony_ci            if (!inParcel.ReadStringVector(&data)) {
79020a203aSopenharmony_ci                return nullptr;
80020a203aSopenharmony_ci            }
81020a203aSopenharmony_ci        }
82020a203aSopenharmony_ci        CollectResult<T> result;
83020a203aSopenharmony_ci        result.retCode = UCollect::UcError(retCode);
84020a203aSopenharmony_ci        result.data = data;
85020a203aSopenharmony_ci        return new CollectResultParcelable(result);
86020a203aSopenharmony_ci    }
87020a203aSopenharmony_ci
88020a203aSopenharmony_ci    static CollectResultParcelable<T> Init()
89020a203aSopenharmony_ci    {
90020a203aSopenharmony_ci        CollectResult<T>  ret;
91020a203aSopenharmony_ci        ret.retCode = UCollect::UcError::UNSUPPORT;
92020a203aSopenharmony_ci        CollectResultParcelable traceRet(ret);
93020a203aSopenharmony_ci        return traceRet;
94020a203aSopenharmony_ci    }
95020a203aSopenharmony_ci
96020a203aSopenharmony_ci    CollectResult<T> result_;
97020a203aSopenharmony_ci};
98020a203aSopenharmony_ci} // namespace HiviewDFX
99020a203aSopenharmony_ci} // namespace OHOS
100020a203aSopenharmony_ci
101020a203aSopenharmony_ci#endif // OHOS_HIVIEWDFX_ADAPTER_SERVICE_IDL_INCLUDE_COLLECT_RESULT_PARCELABLE_H
102