1 /*
2  * Copyright (c) 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 <vector>
17 #include <map>
18 #include <cinttypes>
19 
20 #include "preferences_ffi.h"
21 #include "preferences_impl.h"
22 #include "preferences_log.h"
23 #include "cj_lambda.h"
24 
25 using namespace OHOS::FFI;
26 using namespace OHOS::Preferences;
27 
28 namespace OHOS {
29 namespace Preferences {
30 extern "C" {
FfiOHOSPreferencesGetPreferences(OHOS::AbilityRuntime::Context * context,const char * name,const char * dataGroupId,int32_t * errCode)31 int64_t FfiOHOSPreferencesGetPreferences(OHOS::AbilityRuntime::Context* context, const char* name,
32     const char* dataGroupId, int32_t* errCode)
33 {
34     auto nativePreferences = FFIData::Create<PreferencesImpl>(context, name, dataGroupId, errCode);
35     if (!nativePreferences) {
36         return 0;
37     }
38     return nativePreferences->GetID();
39 }
40 
FfiOHOSPreferencesDeletePreferences(OHOS::AbilityRuntime::Context * context,const char * name,const char * dataGroupId)41 int32_t FfiOHOSPreferencesDeletePreferences(OHOS::AbilityRuntime::Context* context, const char* name,
42     const char* dataGroupId)
43 {
44     return PreferencesImpl::DeletePreferences(context, name, dataGroupId);
45 }
46 
FfiOHOSPreferencesRemovePreferencesFromCache(OHOS::AbilityRuntime::Context * context,const char * name,const char * dataGroupId)47 int32_t FfiOHOSPreferencesRemovePreferencesFromCache(OHOS::AbilityRuntime::Context* context, const char* name,
48     const char* dataGroupId)
49 {
50     return PreferencesImpl::RemovePreferencesFromCache(context, name, dataGroupId);
51 }
52 
FfiOHOSPreferencesGet(int64_t id,const char * key,ValueType defValue)53 ValueType FfiOHOSPreferencesGet(int64_t id, const char* key, ValueType defValue)
54 {
55     auto instance = FFIData::GetData<PreferencesImpl>(id);
56     if (!instance) {
57         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
58         return ValueType{0};
59     }
60     return instance->Get(key, defValue);
61 }
62 
FfiOHOSPreferencesPut(int64_t id,const char * key,ValueType value)63 int32_t FfiOHOSPreferencesPut(int64_t id, const char* key, ValueType value)
64 {
65     auto instance = FFIData::GetData<PreferencesImpl>(id);
66     if (!instance) {
67         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
68         return ERR_INVALID_INSTANCE_CODE;
69     }
70     return instance->Put(key, value);
71 }
72 
FfiOHOSPreferencesGetAll(int64_t id)73 ValueTypes FfiOHOSPreferencesGetAll(int64_t id)
74 {
75     auto instance = FFIData::GetData<PreferencesImpl>(id);
76     if (!instance) {
77         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
78         return ValueTypes{0};
79     }
80     return instance->GetAll();
81 }
82 
FfiOHOSPreferencesFlush(int64_t id)83 void FfiOHOSPreferencesFlush(int64_t id)
84 {
85     auto instance = FFIData::GetData<PreferencesImpl>(id);
86     if (!instance) {
87         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
88         return;
89     }
90     instance->Flush();
91     return;
92 }
93 
FfiOHOSPreferencesClear(int64_t id)94 void FfiOHOSPreferencesClear(int64_t id)
95 {
96     auto instance = FFIData::GetData<PreferencesImpl>(id);
97     if (!instance) {
98         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
99         return;
100     }
101     instance->Clear();
102     return;
103 }
104 
FfiOHOSPreferencesHas(int64_t id,const char * key)105 bool FfiOHOSPreferencesHas(int64_t id, const char* key)
106 {
107     auto instance = FFIData::GetData<PreferencesImpl>(id);
108     if (!instance) {
109         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
110         return false;
111     }
112     return instance->HasKey(key);
113 }
114 
FfiOHOSPreferencesDelete(int64_t id,const char * key)115 int32_t FfiOHOSPreferencesDelete(int64_t id, const char* key)
116 {
117     auto instance = FFIData::GetData<PreferencesImpl>(id);
118     if (!instance) {
119         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
120         return ERR_INVALID_INSTANCE_CODE;
121     }
122     return instance->Delete(key);
123 }
124 
FfiOHOSPreferencesOn(int64_t id,const char * mode,void (* callbackRef)(const char * valueRef))125 int32_t FfiOHOSPreferencesOn(int64_t id, const char* mode, void (*callbackRef)(const char* valueRef))
126 {
127     auto instance = FFIData::GetData<PreferencesImpl>(id);
128     if (!instance) {
129         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
130         return ERR_INVALID_INSTANCE_CODE;
131     }
132     auto onChange = [lambda = CJLambda::Create(callbackRef)](const std::string& valueRef) ->
133         void { lambda(valueRef.c_str()); };
134     return instance->RegisterObserver(mode, (std::function<void(std::string)>*)(callbackRef), onChange);
135 }
136 
FfiOHOSPreferencesOff(int64_t id,const char * mode,void (* callbackRef)(const char * value))137 int32_t FfiOHOSPreferencesOff(int64_t id, const char* mode, void (*callbackRef)(const char* value))
138 {
139     auto instance = FFIData::GetData<PreferencesImpl>(id);
140     if (!instance) {
141         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
142         return ERR_INVALID_INSTANCE_CODE;
143     }
144     return instance->UnRegisterObserver(mode, (std::function<void(std::string)>*)(callbackRef));
145 }
146 
FfiOHOSPreferencesOffAll(int64_t id,const char * mode)147 int32_t FfiOHOSPreferencesOffAll(int64_t id, const char* mode)
148 {
149     auto instance = FFIData::GetData<PreferencesImpl>(id);
150     if (!instance) {
151         LOGE("[Preferences] instance not exist. %{public}" PRId64, id);
152         return ERR_INVALID_INSTANCE_CODE;
153     }
154     return instance->UnRegisteredAllObservers(mode);
155 }
156 }
157 }
158 }