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#define LOG_TAG "FileNapi" 16#include "file_napi.h" 17 18#include "file.h" 19#include "unified_record_napi.h" 20 21namespace OHOS { 22namespace UDMF { 23napi_value FileNapi::Constructor(napi_env env) 24{ 25 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 26 napi_property_descriptor properties[] = { 27 /* File extends UnifiedRecord */ 28 DECLARE_NAPI_FUNCTION("getType", UnifiedRecordNapi::GetType), 29 DECLARE_NAPI_FUNCTION("getValue", UnifiedRecordNapi::GetValue), 30 /* File properties */ 31 DECLARE_NAPI_GETTER_SETTER("details", GetDetails, SetDetails), 32 DECLARE_NAPI_GETTER_SETTER("uri", GetUri, SetUri), 33 }; 34 size_t count = sizeof(properties) / sizeof(properties[0]); 35 return NapiDataUtils::DefineClass(env, "File", properties, count, FileNapi::New); 36} 37 38napi_value FileNapi::New(napi_env env, napi_callback_info info) 39{ 40 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 41 auto ctxt = std::make_shared<ContextBase>(); 42 ctxt->GetCbInfoSync(env, info); 43 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error); 44 45 auto *file = new (std::nothrow) FileNapi(); 46 ASSERT_ERR(ctxt->env, file != nullptr, Status::E_ERROR, "no memory for file!"); 47 file->value_ = std::make_shared<File>(); 48 ASSERT_CALL(env, napi_wrap(env, ctxt->self, file, Destructor, nullptr, nullptr), file); 49 return ctxt->self; 50} 51 52void FileNapi::NewInstance(napi_env env, std::shared_ptr<UnifiedRecord> in, napi_value &out) 53{ 54 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 55 ASSERT_CALL_VOID(env, napi_new_instance(env, Constructor(env), 0, nullptr, &out)); 56 auto *file = new (std::nothrow) FileNapi(); 57 ASSERT_ERR_VOID(env, file != nullptr, Status::E_ERROR, "no memory for file!"); 58 file->value_ = std::static_pointer_cast<File>(in); 59 ASSERT_CALL_DELETE(env, napi_wrap(env, out, file, Destructor, nullptr, nullptr), file); 60} 61 62void FileNapi::Destructor(napi_env env, void *data, void *hint) 63{ 64 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi finalize."); 65 auto *file = static_cast<FileNapi *>(data); 66 ASSERT_VOID(file != nullptr, "finalize null!"); 67 delete file; 68} 69 70FileNapi *FileNapi::GetFile(napi_env env, napi_callback_info info, std::shared_ptr<ContextBase> ctxt) 71{ 72 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 73 ctxt->GetCbInfoSync(env, info); 74 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error); 75 return static_cast<FileNapi *>(ctxt->native); 76} 77 78napi_value FileNapi::GetDetails(napi_env env, napi_callback_info info) 79{ 80 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 81 auto ctxt = std::make_shared<ContextBase>(); 82 auto file = GetFile(env, info, ctxt); 83 ASSERT_ERR( 84 ctxt->env, (file != nullptr && file->value_ != nullptr), Status::E_ERROR, "invalid object!"); 85 ctxt->status = NapiDataUtils::SetValue(env, file->value_->GetDetails(), ctxt->output); 86 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set details failed!"); 87 return ctxt->output; 88} 89 90napi_value FileNapi::SetDetails(napi_env env, napi_callback_info info) 91{ 92 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 93 auto ctxt = std::make_shared<ContextBase>(); 94 UDDetails details; 95 auto input = [env, ctxt, &details](size_t argc, napi_value *argv) { 96 ASSERT_BUSINESS_ERR(ctxt, argc >= 1, 97 Status::E_INVALID_PARAMETERS, "Parameter error: Mandatory parameters are left unspecified"); 98 ctxt->status = NapiDataUtils::GetValue(env, argv[0], details); 99 ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok, 100 Status::E_INVALID_PARAMETERS, "Parameter error: parameter details type must be Record<string, string>"); 101 }; 102 ctxt->GetCbInfoSync(env, info, input); 103 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error); 104 auto file = static_cast<FileNapi *>(ctxt->native); 105 ASSERT_ERR( 106 ctxt->env, (file != nullptr && file->value_ != nullptr), Status::E_ERROR, "invalid object!"); 107 file->value_->SetDetails(details); 108 return nullptr; 109} 110 111napi_value FileNapi::GetUri(napi_env env, napi_callback_info info) 112{ 113 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 114 auto ctxt = std::make_shared<ContextBase>(); 115 auto file = GetFile(env, info, ctxt); 116 ASSERT_ERR( 117 ctxt->env, (file != nullptr && file->value_ != nullptr), Status::E_ERROR, "invalid object!"); 118 ctxt->status = NapiDataUtils::SetValue(env, file->value_->GetUri(), ctxt->output); 119 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, "set uri failed!"); 120 return ctxt->output; 121} 122 123napi_value FileNapi::SetUri(napi_env env, napi_callback_info info) 124{ 125 LOG_DEBUG(UDMF_KITS_NAPI, "FileNapi"); 126 auto ctxt = std::make_shared<ContextBase>(); 127 std::string uri; 128 auto input = [env, ctxt, &uri](size_t argc, napi_value *argv) { 129 ASSERT_BUSINESS_ERR(ctxt, argc >= 1, 130 Status::E_INVALID_PARAMETERS, "Parameter error: Mandatory parameters are left unspecified"); 131 ctxt->status = NapiDataUtils::GetValue(env, argv[0], uri); 132 ASSERT_BUSINESS_ERR(ctxt, ctxt->status == napi_ok, 133 Status::E_INVALID_PARAMETERS, "Parameter error: parameter uri type must be string"); 134 }; 135 ctxt->GetCbInfoSync(env, info, input); 136 ASSERT_ERR(ctxt->env, ctxt->status == napi_ok, Status::E_ERROR, ctxt->error); 137 auto file = static_cast<FileNapi *>(ctxt->native); 138 ASSERT_ERR( 139 ctxt->env, (file != nullptr && file->value_ != nullptr), Status::E_ERROR, "invalid object!"); 140 file->value_->SetUri(uri); 141 return nullptr; 142} 143} // namespace UDMF 144} // namespace OHOS