1fc223305Sopenharmony_ci/*
2fc223305Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3fc223305Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fc223305Sopenharmony_ci * you may not use this file except in compliance with the License.
5fc223305Sopenharmony_ci * You may obtain a copy of the License at
6fc223305Sopenharmony_ci *
7fc223305Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fc223305Sopenharmony_ci *
9fc223305Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fc223305Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fc223305Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fc223305Sopenharmony_ci * See the License for the specific language governing permissions and
13fc223305Sopenharmony_ci * limitations under the License.
14fc223305Sopenharmony_ci */
15fc223305Sopenharmony_ci
16fc223305Sopenharmony_ci#ifndef PREFERENCES_BASE_H
17fc223305Sopenharmony_ci#define PREFERENCES_BASE_H
18fc223305Sopenharmony_ci
19fc223305Sopenharmony_ci#include <any>
20fc223305Sopenharmony_ci#include <condition_variable>
21fc223305Sopenharmony_ci#include <list>
22fc223305Sopenharmony_ci#include <map>
23fc223305Sopenharmony_ci#include <memory>
24fc223305Sopenharmony_ci#include <mutex>
25fc223305Sopenharmony_ci#include <set>
26fc223305Sopenharmony_ci#include <string>
27fc223305Sopenharmony_ci#include <vector>
28fc223305Sopenharmony_ci#include <shared_mutex>
29fc223305Sopenharmony_ci
30fc223305Sopenharmony_ci#include "preferences.h"
31fc223305Sopenharmony_ci#include "preferences_observer.h"
32fc223305Sopenharmony_ci#include "preferences_utils.h"
33fc223305Sopenharmony_ci
34fc223305Sopenharmony_cinamespace OHOS {
35fc223305Sopenharmony_citemplate <typename T> class sptr;
36fc223305Sopenharmony_ciclass Uri;
37fc223305Sopenharmony_cinamespace NativePreferences {
38fc223305Sopenharmony_ciclass ExecutorPool;
39fc223305Sopenharmony_ciclass DataPreferencesObserverStub;
40fc223305Sopenharmony_ci/**
41fc223305Sopenharmony_ci * The function class of the preference. Various operations on preferences instances are provided in this class.
42fc223305Sopenharmony_ci */
43fc223305Sopenharmony_ciclass PreferencesBase : public Preferences {
44fc223305Sopenharmony_cipublic:
45fc223305Sopenharmony_ci    PreferencesBase(const Options &options);
46fc223305Sopenharmony_ci    ~PreferencesBase();
47fc223305Sopenharmony_ci
48fc223305Sopenharmony_ci    PreferencesValue Get(const std::string &key, const PreferencesValue &defValue) override;
49fc223305Sopenharmony_ci
50fc223305Sopenharmony_ci    int Put(const std::string &key, const PreferencesValue &value) override;
51fc223305Sopenharmony_ci
52fc223305Sopenharmony_ci    int GetInt(const std::string &key, const int &defValue) override;
53fc223305Sopenharmony_ci
54fc223305Sopenharmony_ci    std::string GetString(const std::string &key, const std::string &defValue) override;
55fc223305Sopenharmony_ci
56fc223305Sopenharmony_ci    bool GetBool(const std::string &key, const bool &defValue) override;
57fc223305Sopenharmony_ci
58fc223305Sopenharmony_ci    float GetFloat(const std::string &key, const float &defValue) override;
59fc223305Sopenharmony_ci
60fc223305Sopenharmony_ci    double GetDouble(const std::string &key, const double &defValue) override;
61fc223305Sopenharmony_ci
62fc223305Sopenharmony_ci    int64_t GetLong(const std::string &key, const int64_t &defValue) override;
63fc223305Sopenharmony_ci
64fc223305Sopenharmony_ci    std::map<std::string, PreferencesValue> GetAll() override;
65fc223305Sopenharmony_ci
66fc223305Sopenharmony_ci    bool HasKey(const std::string &key) override;
67fc223305Sopenharmony_ci
68fc223305Sopenharmony_ci    int PutInt(const std::string &key, int value) override;
69fc223305Sopenharmony_ci
70fc223305Sopenharmony_ci    int PutString(const std::string &key, const std::string &value) override;
71fc223305Sopenharmony_ci
72fc223305Sopenharmony_ci    int PutBool(const std::string &key, bool value) override;
73fc223305Sopenharmony_ci
74fc223305Sopenharmony_ci    int PutLong(const std::string &key, int64_t value) override;
75fc223305Sopenharmony_ci
76fc223305Sopenharmony_ci    int PutFloat(const std::string &key, float value) override;
77fc223305Sopenharmony_ci
78fc223305Sopenharmony_ci    int PutDouble(const std::string &key, double value) override;
79fc223305Sopenharmony_ci
80fc223305Sopenharmony_ci    int Delete(const std::string &key) override;
81fc223305Sopenharmony_ci
82fc223305Sopenharmony_ci    int Clear() override;
83fc223305Sopenharmony_ci
84fc223305Sopenharmony_ci    void Flush() override;
85fc223305Sopenharmony_ci
86fc223305Sopenharmony_ci    int FlushSync() override;
87fc223305Sopenharmony_ci
88fc223305Sopenharmony_ci    int RegisterObserver(std::shared_ptr<PreferencesObserver> preferencesObserver,
89fc223305Sopenharmony_ci        RegisterMode mode = RegisterMode::LOCAL_CHANGE) override;
90fc223305Sopenharmony_ci
91fc223305Sopenharmony_ci    int UnRegisterObserver(std::shared_ptr<PreferencesObserver> preferencesObserver,
92fc223305Sopenharmony_ci        RegisterMode mode = RegisterMode::LOCAL_CHANGE) override;
93fc223305Sopenharmony_ci
94fc223305Sopenharmony_ci    int RegisterDataObserver(std::shared_ptr<PreferencesObserver> preferencesObserver,
95fc223305Sopenharmony_ci        const std::vector<std::string> &keys = {}) override;
96fc223305Sopenharmony_ci
97fc223305Sopenharmony_ci    int UnRegisterDataObserver(std::shared_ptr<PreferencesObserver> preferencesObserver,
98fc223305Sopenharmony_ci        const std::vector<std::string> &keys = {}) override;
99fc223305Sopenharmony_ci
100fc223305Sopenharmony_ci    std::string GetGroupId() const override;
101fc223305Sopenharmony_ci
102fc223305Sopenharmony_ci    int CloseDb() override;
103fc223305Sopenharmony_ci
104fc223305Sopenharmony_ci    std::pair<int, PreferencesValue> GetValue(const std::string &key, const PreferencesValue &defValue) override;
105fc223305Sopenharmony_ci
106fc223305Sopenharmony_ci    std::pair<int, std::map<std::string, PreferencesValue>> GetAllData() override;
107fc223305Sopenharmony_ci
108fc223305Sopenharmony_ciprotected:
109fc223305Sopenharmony_ci    Uri MakeUri(const std::string &key = "");
110fc223305Sopenharmony_ci    struct WeakPtrCompare {
111fc223305Sopenharmony_ci        bool operator()(const std::weak_ptr<PreferencesObserver> &a, const std::weak_ptr<PreferencesObserver> &b) const
112fc223305Sopenharmony_ci        {
113fc223305Sopenharmony_ci            return a.owner_before(b);
114fc223305Sopenharmony_ci        }
115fc223305Sopenharmony_ci    };
116fc223305Sopenharmony_ci    using DataObserverMap = std::map<std::weak_ptr<PreferencesObserver>, std::set<std::string>, WeakPtrCompare>;
117fc223305Sopenharmony_ci    std::mutex mutex_;
118fc223305Sopenharmony_ci    std::shared_mutex obseverMetux_;
119fc223305Sopenharmony_ci    std::condition_variable cond_;
120fc223305Sopenharmony_ci
121fc223305Sopenharmony_ci    std::vector<std::weak_ptr<PreferencesObserver>> localObservers_;
122fc223305Sopenharmony_ci    std::vector<sptr<DataPreferencesObserverStub>> multiProcessObservers_;
123fc223305Sopenharmony_ci    DataObserverMap dataObserversMap_;
124fc223305Sopenharmony_ci
125fc223305Sopenharmony_ci    const Options options_;
126fc223305Sopenharmony_ci
127fc223305Sopenharmony_ci    static ExecutorPool executorPool_;
128fc223305Sopenharmony_ci};
129fc223305Sopenharmony_ci} // End of namespace NativePreferences
130fc223305Sopenharmony_ci} // End of namespace OHOS
131fc223305Sopenharmony_ci#endif // End of #ifndef PREFERENCES_H