1/*
2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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#ifndef OHOS_SHARING_DATA_H
17#define OHOS_SHARING_DATA_H
18
19#include <inttypes.h>
20#include <memory>
21#include <string>
22#include <unordered_map>
23#include <variant>
24#include <vector>
25
26namespace OHOS {
27namespace Sharing {
28
29enum ConfigureError { CONFIGURE_ERROR_NONE, CONFIGURE_ERROR_NOT_FIND };
30
31class SharingValue {
32public:
33    using Ptr = std::shared_ptr<SharingValue>;
34
35    SharingValue(bool data) : data_(data) {}
36    SharingValue(int32_t data) : data_(data) {}
37    SharingValue(std::string &data) : data_(data) {}
38    SharingValue(std::vector<int32_t> &data) : data_(data) {}
39    ~SharingValue() = default;
40
41    template <class T>
42    bool GetValue(T &value)
43    {
44        value = std::get<T>(data_);
45        return true;
46    }
47
48    template <class T>
49    void SetValue(T &value)
50    {
51        data_ = value;
52    }
53
54    enum class SharingIndex : uint32_t {
55        VALUE_INDEX_INT32 = 0,
56        VALUE_INDEX_BOOL,
57        VALUE_INDEX_STRING,
58        VALUE_INDEX_VECTOR
59    };
60
61public:
62    void Print();
63
64    bool IsBool();
65    bool IsInt32();
66    bool IsString();
67    bool IsVector();
68
69private:
70    std::variant<int32_t, bool, std::string, std::vector<int32_t>> data_;
71};
72
73class SharingDataGroupByTag {
74public:
75    using Ptr = std::shared_ptr<SharingDataGroupByTag>;
76    using Each = std::function<void(const std::string &key, const SharingValue::Ptr &value)>;
77
78    explicit SharingDataGroupByTag(const std::string &tag) : tag_(tag) {}
79
80    bool IsTag(const std::string &tag)
81    {
82        return tag_ == tag;
83    }
84
85public:
86    int32_t PutSharingValue(const std::string &key, const SharingValue::Ptr value);
87    int32_t PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values);
88
89    int32_t GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values);
90    SharingValue::Ptr GetSharingValue(const std::string &key);
91
92    void Print();
93    void ForEach(Each each);
94    bool HasKey(const std::string &key);
95
96private:
97    std::string tag_;
98    std::unordered_map<std::string, SharingValue::Ptr> datas_;
99};
100
101class SharingDataGroupByModule {
102public:
103    using Ptr = std::shared_ptr<SharingDataGroupByModule>;
104    using Each = std::function<void(const std::string &tag, const SharingDataGroupByTag::Ptr &value)>;
105
106    explicit SharingDataGroupByModule(const std::string &mudule) : mudule_(mudule) {}
107
108    bool IsModule(const std::string &mudule)
109    {
110        return mudule_ == mudule;
111    }
112
113public:
114    int32_t PutSharingValues(const std::string &tag, const SharingDataGroupByTag::Ptr &value);
115    int32_t PutSharingValue(const std::string &tag, const std::string &key, const SharingValue::Ptr value);
116    int32_t PutSharingValues(const std::string &tag, const std::unordered_map<std::string, SharingValue::Ptr> &values);
117
118    int32_t GetSharingValues(const std::string &tag, SharingDataGroupByTag::Ptr &value);
119    int32_t GetSharingValues(const std::string &tag, std::unordered_map<std::string, SharingValue::Ptr> &values);
120    SharingValue::Ptr GetSharingValue(const std::string &tag, const std::string &key);
121
122    void Print();
123    void ForEach(Each each);
124    bool HasTag(const std::string &tag);
125    bool HasKey(const std::string &tag, const std::string &key);
126
127private:
128    std::string mudule_;
129    std::unordered_map<std::string, SharingDataGroupByTag::Ptr> datass_;
130};
131
132class SharingData {
133public:
134    using Ptr = std::shared_ptr<SharingData>;
135    using Each = std::function<void(const std::string &module, const SharingDataGroupByModule::Ptr &value)>;
136
137    SharingData() = default;
138    ~SharingData() = default;
139
140    int32_t PutSharingValues(const SharingDataGroupByModule::Ptr &values, const std::string &module);
141    int32_t PutSharingValue(const std::string &key, const SharingValue::Ptr value, const std::string &module,
142                            const std::string &tag);
143    int32_t PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values,
144                             const std::string &module, const std::string &tag);
145
146    int32_t GetSharingValues(SharingDataGroupByModule::Ptr &values, const std::string &module);
147    int32_t GetSharingValues(SharingDataGroupByTag::Ptr &value, const std::string &module, const std::string &tag);
148    int32_t GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values, const std::string &module,
149                             const std::string &tag);
150    SharingValue::Ptr GetSharingValue(const std::string &key, const std::string &module, const std::string &tag);
151
152    void Print();
153    void ForEach(Each each);
154    bool HasModule(const std::string &module);
155    bool HasTag(const std::string &module, const std::string &tag);
156    bool HasKey(const std::string &key, const std::string &module, const std::string &tag);
157
158private:
159    std::unordered_map<std::string, SharingDataGroupByModule::Ptr> datass_;
160};
161
162} // namespace Sharing
163} // namespace OHOS
164#endif