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  }