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 "kv_operator.h"
17#include "directory_ex.h"
18#include "media_log.h"
19
20namespace {
21    const OHOS::DistributedKv::AppId KVSTORE_APPID = {"com.ohos.sharing.codec"};
22    const OHOS::DistributedKv::StoreId KVSTORE_STOREID = {"media_sharingcodec"};
23}
24
25static constexpr int32_t FILE_PERMISSION = 0777;
26
27namespace OHOS {
28namespace Sharing {
29
30void KvOperator::OpenKvStore()
31{
32    DistributedKv::Options options = {
33        .createIfMissing = true,
34        .encrypt = false,
35        .autoSync = false,
36        .area = DistributedKv::Area::EL1,
37        .kvStoreType = DistributedKv::KvStoreType::SINGLE_VERSION,
38        .baseDir = "/data/service/el1/public/database/sharingcodec"
39    };
40
41    DistributedKv::AppId appId = { KVSTORE_APPID };
42    DistributedKv::StoreId storeId = { KVSTORE_STOREID };
43    mkdir(options.baseDir.c_str(), (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH));
44    DistributedKv::Status status = dataManager_.GetSingleKvStore(options, appId, storeId, kvStorePtr_);
45    if (status != DistributedKv::Status::SUCCESS) {
46        MEDIA_LOGE("KvStore get failed! %{public}d.", status);
47        return;
48    }
49
50    OHOS::ChangeModeDirectory(options.baseDir, FILE_PERMISSION);
51    MEDIA_LOGI("KvStore using for %{public}s init success!", KVSTORE_APPID.appId.c_str());
52}
53
54void KvOperator::CloseKvStore()
55{
56    if (kvStorePtr_ != nullptr) {
57        dataManager_.CloseKvStore({ KVSTORE_APPID }, kvStorePtr_);
58        kvStorePtr_ = nullptr;
59    }
60
61    MEDIA_LOGI("Close KvStore for %{public}s init success!", KVSTORE_APPID.appId.c_str());
62}
63
64bool KvOperator::GetValues(const std::string &key,  std::string &val)
65{
66    if (kvStorePtr_ == nullptr) {
67        MEDIA_LOGE("kvstore is nullptr.");
68        return false;
69    }
70
71    DistributedKv::Key k(key);
72    DistributedKv::Value v;
73    DistributedKv::Status status = kvStorePtr_->Get(k, v);
74    if (status != DistributedKv::Status::SUCCESS) {
75        MEDIA_LOGE("get kvstore failed %{public}d.", status);
76        val = "";
77        return false;
78    }
79
80    val = v.ToString();
81
82    MEDIA_LOGI("get kvstore success!  val %{public}s.", val.c_str());
83    return true;
84}
85
86bool KvOperator::PutValues(const std::string &key, std::string values)
87{
88    if (kvStorePtr_ == nullptr) {
89        MEDIA_LOGE("kvstore is nullptr.");
90        return false;
91    }
92
93    DistributedKv::Key k(key);
94    DistributedKv::Value v(values);
95    DistributedKv::Status status = kvStorePtr_->Put(k, v);
96    if (status != DistributedKv::Status::SUCCESS) {
97        MEDIA_LOGE("put kvstore failed %{public}d.", status);
98        return false;
99    }
100    MEDIA_LOGI("put kvstore success!, val %{public}s.", values.c_str());
101    return true;
102}
103
104
105void KvOperator::SyncKvStore(const std::string &key, const std::string &deviceId)
106{
107    if (kvStorePtr_ == nullptr) {
108        MEDIA_LOGE("kvstore is nullptr.");
109        return;
110    }
111
112    DistributedKv::DataQuery dataQuery;
113    dataQuery.KeyPrefix(key);
114    std::vector<std::string> deviceIds = { deviceId };
115    DistributedKv::Status status = kvStorePtr_->Sync(deviceIds, DistributedKv::SyncMode::PULL,
116        dataQuery, shared_from_this());
117    MEDIA_LOGE("kvstore sync end, status %{public}d.", status);
118}
119
120void KvOperator::SyncCompleted(const std::map<std::string, DistributedKv::Status> &results)
121{
122    MEDIA_LOGI("kvstore sync completed.");
123}
124
125bool KvOperator::StringToJson(const std::string &str, nlohmann::json &jsonObj)
126{
127    jsonObj = nlohmann::json::parse(str);
128    if (jsonObj.is_discarded()) {
129        MEDIA_LOGE("parse json failed.");
130        return false;
131    }
132
133    return true;
134}
135
136bool KvOperator::JsonToString(const nlohmann::json &jsonObj, std::string &str)
137{
138    str = jsonObj.dump();
139    return true;
140}
141
142bool KvOperator::QueryFromJson(const nlohmann::json &jsonObj, const std::string &key, std::string &val)
143{
144    val = jsonObj.at(key.c_str());
145    return true;
146}
147
148} // namespace Media
149} // namespace OHOS
150