1 /*
2 * Copyright (c) 2023 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 "unified_data_napi.h"
17
18 #include "application_defined_record_napi.h"
19 #include "audio_napi.h"
20 #include "file_napi.h"
21 #include "folder_napi.h"
22 #include "html_napi.h"
23 #include "image_napi.h"
24 #include "link_napi.h"
25 #include "napi_data_utils.h"
26 #include "napi_error_utils.h"
27 #include "napi_queue.h"
28 #include "plain_text_napi.h"
29 #include "system_defined_appitem_napi.h"
30 #include "system_defined_form_napi.h"
31 #include "system_defined_pixelmap_napi.h"
32 #include "system_defined_record_napi.h"
33 #include "text_napi.h"
34 #include "unified_data.h"
35 #include "unified_record_napi.h"
36 #include "video_napi.h"
37
38 namespace OHOS {
39 namespace UDMF {
Constructor(napi_env env)40 napi_value UnifiedDataNapi::Constructor(napi_env env)
41 {
42 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
43 napi_property_descriptor properties[] = {
44 /* UnifiedData properties */
45 DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
46 DECLARE_NAPI_FUNCTION("getRecords", GetRecords),
47 };
48 size_t count = sizeof(properties) / sizeof(properties[0]);
49 return NapiDataUtils::DefineClass(env, "UnifiedData", properties, count, UnifiedDataNapi::New);
50 }
51
New(napi_env env,napi_callback_info info)52 napi_value UnifiedDataNapi::New(napi_env env, napi_callback_info info)
53 {
54 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
55 UnifiedRecordNapi *uRecord = nullptr;
56 auto ctxt = std::make_shared<ContextBase>();
57 auto input = [env, info, ctxt, &uRecord](size_t argc, napi_value *argv) {
58 // required 1 arguments :: <UnifiedRecord*>
59 ASSERT_BUSINESS_ERR(ctxt, argc <= 1, Status::E_INVALID_PARAMETERS, "invalid arguments!");
60 if (argc == 1) {
61 ctxt->status = napi_unwrap(env, *argv, reinterpret_cast<void **>(&uRecord));
62 ASSERT_BUSINESS_ERR(ctxt, (ctxt->status == napi_ok && uRecord != nullptr && uRecord->value_ != nullptr),
63 Status::E_INVALID_PARAMETERS, "invalid object!");
64 ctxt->status = UnifiedDataUtils::IsValidType(uRecord->value_->GetType()) ? napi_ok : napi_invalid_arg;
65 ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok, Status::E_INVALID_PARAMETERS, "invalid type!");
66 }
67 };
68
69 // Parsing input parameters
70 ctxt->GetCbInfoSync(env, info, input);
71 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_INVALID_PARAMETERS, "invalid arguments!");
72 auto *uData = new (std::nothrow) UnifiedDataNapi();
73 ASSERT_ERR(ctxt->env, uData != nullptr, Status::E_UNKNOWN, "no memory for unified data!");
74 uData->value_ = std::make_shared<UnifiedData>();
75 if (uRecord) {
76 uData->value_->AddRecord(uRecord->value_);
77 }
78 ASSERT_CALL(env, napi_wrap(env, ctxt->self, uData, Destructor, nullptr, nullptr), uData);
79 return ctxt->self;
80 }
81
Destructor(napi_env env,void * data,void * hint)82 void UnifiedDataNapi::Destructor(napi_env env, void *data, void *hint)
83 {
84 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi finalize.");
85 auto *uData = static_cast<UnifiedDataNapi *>(data);
86 ASSERT_VOID(uData != nullptr, "finalize null!");
87 delete uData;
88 }
89
NewInstance(napi_env env,std::shared_ptr<UnifiedData> in,napi_value & out)90 void UnifiedDataNapi::NewInstance(napi_env env, std::shared_ptr<UnifiedData> in, napi_value &out)
91 {
92 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
93 ASSERT_CALL_VOID(env, napi_new_instance(env, Constructor(env), 0, nullptr, &out));
94 auto *unifiedData = new (std::nothrow) UnifiedDataNapi();
95 ASSERT_ERR_VOID(env, unifiedData != nullptr, Status::E_UNKNOWN, "no memory for unified data!");
96 unifiedData->value_ = in;
97 ASSERT_CALL_DELETE(env, napi_wrap(env, out, unifiedData, Destructor, nullptr, nullptr), unifiedData);
98 }
99
GetUnifiedData(napi_env env,napi_callback_info info)100 UnifiedDataNapi *UnifiedDataNapi::GetUnifiedData(napi_env env, napi_callback_info info)
101 {
102 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
103 auto ctxt = std::make_shared<ContextBase>();
104 ctxt->GetCbInfoSync(env, info);
105 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_INVALID_PARAMETERS, "invalid arguments!");
106 return static_cast<UnifiedDataNapi *>(ctxt->native);
107 }
108
AddRecord(napi_env env,napi_callback_info info)109 napi_value UnifiedDataNapi::AddRecord(napi_env env, napi_callback_info info)
110 {
111 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
112 UnifiedRecordNapi *uRecord = nullptr;
113 auto ctxt = std::make_shared<ContextBase>();
114 auto input = [env, info, ctxt, &uRecord](size_t argc, napi_value *argv) {
115 ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::E_INVALID_PARAMETERS, "invalid arguments!");
116 ctxt->status = napi_unwrap(env, *argv, reinterpret_cast<void **>(&uRecord));
117 ASSERT_BUSINESS_ERR(ctxt, (ctxt->status == napi_ok && uRecord != nullptr && uRecord->value_ != nullptr),
118 Status::E_INVALID_PARAMETERS, "invalid object!");
119 ctxt->status = UnifiedDataUtils::IsValidType(uRecord->value_->GetType()) ? napi_ok : napi_invalid_arg;
120 ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok, Status::E_INVALID_PARAMETERS, "invalid type!");
121 };
122 ctxt->GetCbInfoSync(env, info, input);
123 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_INVALID_PARAMETERS, "invalid arguments!");
124 auto *uData = static_cast<UnifiedDataNapi *>(ctxt->native);
125 ASSERT_ERR(
126 ctxt->env, (uData != nullptr && uData->value_ != nullptr), Status::E_INVALID_PARAMETERS, "invalid object!");
127 uData->value_->AddRecord(uRecord->value_);
128 return nullptr;
129 }
130
GetRecords(napi_env env,napi_callback_info info)131 napi_value UnifiedDataNapi::GetRecords(napi_env env, napi_callback_info info)
132 {
133 LOG_DEBUG(UDMF_KITS_NAPI, "UnifiedDataNapi");
134 auto ctxt = std::make_shared<ContextBase>();
135 auto uData = GetUnifiedData(env, info);
136 ASSERT_ERR(
137 ctxt->env, (uData != nullptr && uData->value_ != nullptr), Status::E_INVALID_PARAMETERS, "invalid object!");
138 std::vector<std::shared_ptr<UnifiedRecord>> records = uData->value_->GetRecords();
139 napi_status status = napi_create_array_with_length(env, records.size(), &ctxt->output);
140 ASSERT_ERR(ctxt->env, status == napi_ok, Status::E_ERROR, "init array failed!");
141 int index = 0;
142 for (const std::shared_ptr<UnifiedRecord> &recordPtr : records) {
143 napi_value recordNapi = nullptr;
144 GetRecord(env, recordPtr, recordNapi);
145 ctxt->status = napi_set_element(env, ctxt->output, index++, recordNapi);
146 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set element failed!");
147 }
148 return ctxt->output;
149 }
150
GetRecord(napi_env env,std::shared_ptr<UnifiedRecord> in,napi_value & out)151 void UnifiedDataNapi::GetRecord(napi_env env, std::shared_ptr<UnifiedRecord> in, napi_value &out)
152 {
153 switch (in->GetType()) {
154 case TEXT: {
155 TextNapi::NewInstance(env, in, out);
156 break;
157 }
158 case PLAIN_TEXT: {
159 PlainTextNapi::NewInstance(env, in, out);
160 break;
161 }
162 case HTML: {
163 HtmlNapi::NewInstance(env, in, out);
164 break;
165 }
166 case HYPERLINK: {
167 LinkNapi::NewInstance(env, in, out);
168 break;
169 }
170 case FILE: {
171 FileNapi::NewInstance(env, in, out);
172 break;
173 }
174 case IMAGE: {
175 ImageNapi::NewInstance(env, in, out);
176 break;
177 }
178 case VIDEO: {
179 VideoNapi::NewInstance(env, in, out);
180 break;
181 }
182 case AUDIO: {
183 AudioNapi::NewInstance(env, in, out);
184 break;
185 }
186 case FOLDER: {
187 FolderNapi::NewInstance(env, in, out);
188 break;
189 }
190 case SYSTEM_DEFINED_RECORD: {
191 SystemDefinedRecordNapi::NewInstance(env, in, out);
192 break;
193 }
194 case SYSTEM_DEFINED_APP_ITEM: {
195 SystemDefinedAppItemNapi::NewInstance(env, in, out);
196 break;
197 }
198 case SYSTEM_DEFINED_FORM: {
199 SystemDefinedFormNapi::NewInstance(env, in, out);
200 break;
201 }
202 case SYSTEM_DEFINED_PIXEL_MAP: {
203 SystemDefinedPixelMapNapi::NewInstance(env, in, out);
204 break;
205 }
206 case APPLICATION_DEFINED_RECORD: {
207 ApplicationDefinedRecordNapi::NewInstance(env, in, out);
208 break;
209 }
210 default:
211 LOG_INFO(UDMF_KITS_NAPI, "GetRecord default");
212 break;
213 }
214 }
215 } // namespace UDMF
216 } // namespace OHOS