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 #include "sharing_data.h"
17 #include "common/media_log.h"
18 
19 namespace OHOS {
20 namespace Sharing {
IsInt32()21 bool SharingValue::IsInt32()
22 {
23     SHARING_LOGD("trace.");
24     if (data_.index() == static_cast<std::size_t>(SharingIndex::VALUE_INDEX_INT32)) {
25         return true;
26     }
27 
28     return false;
29 }
30 
IsBool()31 bool SharingValue::IsBool()
32 {
33     SHARING_LOGD("trace.");
34     if (data_.index() == static_cast<std::size_t>(SharingIndex::VALUE_INDEX_BOOL)) {
35         return true;
36     }
37 
38     return false;
39 }
40 
IsString()41 bool SharingValue::IsString()
42 {
43     SHARING_LOGD("trace.");
44     if (data_.index() == static_cast<std::size_t>(SharingIndex::VALUE_INDEX_STRING)) {
45         return true;
46     }
47 
48     return false;
49 }
50 
IsVector()51 bool SharingValue::IsVector()
52 {
53     SHARING_LOGD("trace.");
54     if (data_.index() == static_cast<std::size_t>(SharingIndex::VALUE_INDEX_VECTOR)) {
55         return true;
56     }
57 
58     return false;
59 }
60 
Print()61 void SharingValue::Print()
62 {
63     SHARING_LOGD("trace.");
64     if (IsInt32()) {
65         int32_t value = 0;
66         GetValue(value);
67         SHARING_LOGD("print %{public}d.", value);
68     } else if (IsBool()) {
69         bool value = 0;
70         GetValue(value);
71         SHARING_LOGD("print %{public}d.", value);
72     } else if (IsString()) {
73         std::string value("");
74         GetValue(value);
75         SHARING_LOGD("print %{public}s.", value.c_str());
76     } else if (IsVector()) {
77         std::vector<int32_t> value{};
78         GetValue(value);
79         for (auto &item : value) {
80             SHARING_LOGD("print %{public}d.", item);
81         }
82     }
83 }
84 
PutSharingValue(const std::string &key, const SharingValue::Ptr value)85 int32_t SharingDataGroupByTag::PutSharingValue(const std::string &key, const SharingValue::Ptr value)
86 {
87     SHARING_LOGD("trace.");
88     auto iter = datas_.find(key);
89     if (iter == datas_.end()) {
90         datas_.emplace(key, value);
91     } else {
92         iter->second = value;
93     }
94 
95     return CONFIGURE_ERROR_NONE;
96 }
97 
PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values)98 int32_t SharingDataGroupByTag::PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values)
99 {
100     SHARING_LOGD("trace.");
101     datas_ = values;
102     return CONFIGURE_ERROR_NONE;
103 }
104 
GetSharingValue(const std::string &key)105 SharingValue::Ptr SharingDataGroupByTag::GetSharingValue(const std::string &key)
106 {
107     SHARING_LOGD("trace.");
108     SharingValue::Ptr value = nullptr;
109     auto iter = datas_.find(key);
110     if (iter != datas_.end()) {
111         value = iter->second;
112     }
113 
114     return value;
115 }
116 
GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values)117 int32_t SharingDataGroupByTag::GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values)
118 {
119     SHARING_LOGD("trace.");
120     values = datas_;
121     return CONFIGURE_ERROR_NONE;
122 }
123 
HasKey(const std::string &key)124 bool SharingDataGroupByTag::HasKey(const std::string &key)
125 {
126     SHARING_LOGD("trace.");
127     return datas_.find(key) != datas_.end();
128 }
129 
ForEach(Each each)130 void SharingDataGroupByTag::ForEach(Each each)
131 {
132     SHARING_LOGD("trace.");
133     auto iter = datas_.begin();
134     while (iter != datas_.end()) {
135         std::string key = iter->first;
136         each(key, iter->second);
137         iter++;
138     }
139 }
140 
Print()141 void SharingDataGroupByTag::Print()
142 {
143     SHARING_LOGD("trace.");
144     auto iter = datas_.begin();
145     while (iter != datas_.end()) {
146         std::string key = iter->first;
147         SharingValue::Ptr value = iter->second;
148         value->Print();
149         iter++;
150     }
151 }
152 
PutSharingValue(const std::string &tag, const std::string &key, const SharingValue::Ptr value)153 int32_t SharingDataGroupByModule::PutSharingValue(const std::string &tag, const std::string &key,
154                                                   const SharingValue::Ptr value)
155 {
156     SHARING_LOGD("trace.");
157     auto iter = datass_.find(tag);
158     if (iter == datass_.end()) {
159         auto grpData = std::make_shared<SharingDataGroupByTag>(tag);
160         if (grpData == nullptr) {
161             SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
162             return CONFIGURE_ERROR_NOT_FIND;
163         }
164         grpData->PutSharingValue(key, value);
165         datass_.emplace(std::make_pair(tag, grpData));
166         return CONFIGURE_ERROR_NONE;
167     }
168 
169     return iter->second->PutSharingValue(key, value);
170 }
171 
PutSharingValues(const std::string &tag, const std::unordered_map<std::string, SharingValue::Ptr> &values)172 int32_t SharingDataGroupByModule::PutSharingValues(const std::string &tag,
173                                                    const std::unordered_map<std::string, SharingValue::Ptr> &values)
174 {
175     SHARING_LOGD("trace.");
176     auto iter = datass_.find(tag);
177     if (iter == datass_.end()) {
178         auto grpData = std::make_shared<SharingDataGroupByTag>(tag);
179         if (grpData == nullptr) {
180             SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
181             return CONFIGURE_ERROR_NOT_FIND;
182         }
183         grpData->PutSharingValues(values);
184         datass_.emplace(std::make_pair(tag, grpData));
185         return CONFIGURE_ERROR_NONE;
186     }
187 
188     return iter->second->PutSharingValues(values);
189 }
190 
PutSharingValues(const std::string &tag, const SharingDataGroupByTag::Ptr &value)191 int32_t SharingDataGroupByModule::PutSharingValues(const std::string &tag, const SharingDataGroupByTag::Ptr &value)
192 {
193     SHARING_LOGD("trace.");
194     auto iter = datass_.find(tag);
195     if (iter == datass_.end()) {
196         datass_.emplace(std::make_pair(tag, value));
197         return CONFIGURE_ERROR_NONE;
198     }
199 
200     iter->second = value;
201     return CONFIGURE_ERROR_NONE;
202 }
203 
GetSharingValue(const std::string &tag, const std::string &key)204 SharingValue::Ptr SharingDataGroupByModule::GetSharingValue(const std::string &tag, const std::string &key)
205 {
206     SHARING_LOGD("trace.");
207     auto iter = datass_.find(tag);
208     if (iter == datass_.end()) {
209         SHARING_LOGE("nullptr.");
210         return nullptr;
211     }
212 
213     return iter->second->GetSharingValue(key);
214 }
215 
GetSharingValues(const std::string &tag, std::unordered_map<std::string, SharingValue::Ptr> &values)216 int32_t SharingDataGroupByModule::GetSharingValues(const std::string &tag,
217                                                    std::unordered_map<std::string, SharingValue::Ptr> &values)
218 {
219     SHARING_LOGD("trace.");
220     auto iter = datass_.find(tag);
221     if (iter == datass_.end()) {
222         SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
223         return CONFIGURE_ERROR_NOT_FIND;
224     }
225 
226     return iter->second->GetSharingValues(values);
227 }
228 
GetSharingValues(const std::string &tag, SharingDataGroupByTag::Ptr &value)229 int32_t SharingDataGroupByModule::GetSharingValues(const std::string &tag, SharingDataGroupByTag::Ptr &value)
230 {
231     SHARING_LOGD("trace.");
232     auto iter = datass_.find(tag);
233     if (iter == datass_.end()) {
234         SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
235         return CONFIGURE_ERROR_NOT_FIND;
236     }
237 
238     value = iter->second;
239     return CONFIGURE_ERROR_NONE;
240 }
241 
HasKey(const std::string &tag, const std::string &key)242 bool SharingDataGroupByModule::HasKey(const std::string &tag, const std::string &key)
243 {
244     SHARING_LOGD("trace.");
245     auto iter = datass_.find(tag);
246     if (iter == datass_.end()) {
247         return false;
248     }
249 
250     return iter->second->HasKey(key);
251 }
252 
HasTag(const std::string &tag)253 bool SharingDataGroupByModule::HasTag(const std::string &tag)
254 {
255     SHARING_LOGD("trace.");
256     return datass_.find(tag) != datass_.end();
257 }
258 
ForEach(Each each)259 void SharingDataGroupByModule::ForEach(Each each)
260 {
261     SHARING_LOGD("trace.");
262     auto iter = datass_.begin();
263     while (iter != datass_.end()) {
264         std::string key = iter->first;
265         each(key, iter->second);
266         iter++;
267     }
268 }
269 
Print()270 void SharingDataGroupByModule::Print()
271 {
272     SHARING_LOGD("trace.");
273     auto iter = datass_.begin();
274     while (iter != datass_.end()) {
275         SHARING_LOGD("forEach print %{public}s.", iter->first.c_str());
276         SharingDataGroupByTag::Ptr value = iter->second;
277         value->Print();
278         iter++;
279     }
280 }
281 
PutSharingValue(const std::string &key, const SharingValue::Ptr value, const std::string &module, const std::string &tag)282 int32_t SharingData::PutSharingValue(const std::string &key, const SharingValue::Ptr value, const std::string &module,
283                                      const std::string &tag)
284 {
285     SHARING_LOGD("trace.");
286     auto iter = datass_.find(module);
287     if (iter == datass_.end()) {
288         auto moduleData = std::make_shared<SharingDataGroupByModule>(module);
289         if (moduleData == nullptr) {
290             SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
291             return CONFIGURE_ERROR_NOT_FIND;
292         }
293         moduleData->PutSharingValue(tag, key, value);
294         datass_.emplace(std::make_pair(module, moduleData));
295         return CONFIGURE_ERROR_NONE;
296     }
297 
298     return iter->second->PutSharingValue(tag, key, value);
299 }
PutSharingValues(const SharingDataGroupByModule::Ptr &values, const std::string &module)300 int32_t SharingData::PutSharingValues(const SharingDataGroupByModule::Ptr &values, const std::string &module)
301 {
302     SHARING_LOGD("trace.");
303     auto iter = datass_.find(module);
304     if (iter == datass_.end()) {
305         datass_.emplace(std::make_pair(module, values));
306         return CONFIGURE_ERROR_NONE;
307     }
308 
309     iter->second = values;
310     return CONFIGURE_ERROR_NONE;
311 }
312 
PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values, const std::string &module, const std::string &tag)313 int32_t SharingData::PutSharingValues(const std::unordered_map<std::string, SharingValue::Ptr> &values,
314                                       const std::string &module, const std::string &tag)
315 {
316     SHARING_LOGD("trace.");
317     auto iter = datass_.find(module);
318     if (iter == datass_.end()) {
319         auto moduleData = std::make_shared<SharingDataGroupByModule>(module);
320         if (moduleData == nullptr) {
321             SHARING_LOGE("CONFIGURE_ERROR_NOT_FIND.");
322             return CONFIGURE_ERROR_NOT_FIND;
323         }
324         moduleData->PutSharingValues(tag, values);
325         datass_.emplace(std::make_pair(module, moduleData));
326         return CONFIGURE_ERROR_NONE;
327     }
328 
329     return iter->second->PutSharingValues(tag, values);
330 }
331 
GetSharingValue(const std::string &key, const std::string &module, const std::string &tag)332 SharingValue::Ptr SharingData::GetSharingValue(const std::string &key, const std::string &module,
333                                                const std::string &tag)
334 {
335     SHARING_LOGD("trace.");
336     auto iter = datass_.find(module);
337     if (iter == datass_.end()) {
338         return nullptr;
339     }
340 
341     return iter->second->GetSharingValue(tag, key);
342 }
343 
GetSharingValues(SharingDataGroupByModule::Ptr &values, const std::string &module)344 int32_t SharingData::GetSharingValues(SharingDataGroupByModule::Ptr &values, const std::string &module)
345 {
346     SHARING_LOGD("trace.");
347     auto iter = datass_.find(module);
348     if (iter == datass_.end()) {
349         return CONFIGURE_ERROR_NOT_FIND;
350     }
351 
352     values = iter->second;
353     return CONFIGURE_ERROR_NONE;
354 }
355 
GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values, const std::string &module, const std::string &tag)356 int32_t SharingData::GetSharingValues(std::unordered_map<std::string, SharingValue::Ptr> &values,
357                                       const std::string &module, const std::string &tag)
358 {
359     SHARING_LOGD("trace.");
360     auto iter = datass_.find(module);
361     if (iter == datass_.end()) {
362         return CONFIGURE_ERROR_NOT_FIND;
363     }
364 
365     return iter->second->GetSharingValues(tag, values);
366 }
367 
GetSharingValues(SharingDataGroupByTag::Ptr &value, const std::string &module, const std::string &tag)368 int32_t SharingData::GetSharingValues(SharingDataGroupByTag::Ptr &value, const std::string &module,
369                                       const std::string &tag)
370 {
371     SHARING_LOGD("trace.");
372     auto iter = datass_.find(module);
373     if (iter == datass_.end()) {
374         return CONFIGURE_ERROR_NOT_FIND;
375     }
376 
377     return iter->second->GetSharingValues(tag, value);
378 }
379 
HasKey(const std::string &key, const std::string &module, const std::string &tag)380 bool SharingData::HasKey(const std::string &key, const std::string &module, const std::string &tag)
381 {
382     SHARING_LOGD("trace.");
383     auto iter = datass_.find(module);
384     if (iter == datass_.end()) {
385         return false;
386     }
387 
388     return iter->second->HasKey(tag, key);
389 }
390 
HasModule(const std::string &module)391 bool SharingData::HasModule(const std::string &module)
392 {
393     SHARING_LOGD("trace.");
394     return datass_.find(module) != datass_.end();
395 }
396 
HasTag(const std::string &module, const std::string &tag)397 bool SharingData::HasTag(const std::string &module, const std::string &tag)
398 {
399     SHARING_LOGD("trace.");
400     auto iter = datass_.find(module);
401     if (iter == datass_.end()) {
402         return false;
403     }
404 
405     return iter->second->HasTag(tag);
406 }
407 
ForEach(Each each)408 void SharingData::ForEach(Each each)
409 {
410     SHARING_LOGD("trace.");
411     auto iter = datass_.begin();
412     while (iter != datass_.end()) {
413         std::string key = iter->first;
414         SHARING_LOGD("forEach %{public}s.", key.c_str());
415         each(key, iter->second);
416         iter++;
417     }
418 }
419 
Print()420 void SharingData::Print()
421 {
422     SHARING_LOGD("trace.");
423     auto iter = datass_.begin();
424     while (iter != datass_.end()) {
425         SHARING_LOGD("forEach print %{public}s.", iter->first.c_str());
426         SharingDataGroupByModule::Ptr value = iter->second;
427         value->Print();
428         iter++;
429     }
430 }
431 
432 } // namespace Sharing
433 } // namespace OHOS