• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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