133eb0b6dSopenharmony_ci/* 233eb0b6dSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 333eb0b6dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 433eb0b6dSopenharmony_ci * you may not use this file except in compliance with the License. 533eb0b6dSopenharmony_ci * You may obtain a copy of the License at 633eb0b6dSopenharmony_ci * 733eb0b6dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 833eb0b6dSopenharmony_ci * 933eb0b6dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1033eb0b6dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1133eb0b6dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1233eb0b6dSopenharmony_ci * See the License for the specific language governing permissions and 1333eb0b6dSopenharmony_ci * limitations under the License. 1433eb0b6dSopenharmony_ci */ 1533eb0b6dSopenharmony_ci 1633eb0b6dSopenharmony_ci#include "demo_javascript_class.h" 1733eb0b6dSopenharmony_ci 1833eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassConstructor(napi_env env, napi_callback_info info); 1933eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassAdd(napi_env env, napi_callback_info info); 2033eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassSub(napi_env env, napi_callback_info info); 2133eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassMul(napi_env env, napi_callback_info info); 2233eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassDiv(napi_env env, napi_callback_info info); 2333eb0b6dSopenharmony_ci 2433eb0b6dSopenharmony_cienum TestEnum { 2533eb0b6dSopenharmony_ci ONE = 0, 2633eb0b6dSopenharmony_ci TWO, 2733eb0b6dSopenharmony_ci THREE, 2833eb0b6dSopenharmony_ci FOUR 2933eb0b6dSopenharmony_ci}; 3033eb0b6dSopenharmony_ci 3133eb0b6dSopenharmony_ci/* 3233eb0b6dSopenharmony_ci * Class Init 3333eb0b6dSopenharmony_ci */ 3433eb0b6dSopenharmony_civoid DemoJavascriptClassInit(napi_env env, napi_value exports) 3533eb0b6dSopenharmony_ci{ 3633eb0b6dSopenharmony_ci napi_value one = nullptr; 3733eb0b6dSopenharmony_ci napi_value two = nullptr; 3833eb0b6dSopenharmony_ci napi_value three = nullptr; 3933eb0b6dSopenharmony_ci napi_value four = nullptr; 4033eb0b6dSopenharmony_ci 4133eb0b6dSopenharmony_ci napi_create_int32(env, TestEnum::ONE, &one); 4233eb0b6dSopenharmony_ci napi_create_int32(env, TestEnum::TWO, &two); 4333eb0b6dSopenharmony_ci napi_create_int32(env, TestEnum::THREE, &three); 4433eb0b6dSopenharmony_ci napi_create_int32(env, TestEnum::FOUR, &four); 4533eb0b6dSopenharmony_ci 4633eb0b6dSopenharmony_ci napi_property_descriptor descriptors[] = { 4733eb0b6dSopenharmony_ci DECLARE_NAPI_FUNCTION("add", DemoJavascriptClassAdd), 4833eb0b6dSopenharmony_ci DECLARE_NAPI_FUNCTION("sub", DemoJavascriptClassSub), 4933eb0b6dSopenharmony_ci DECLARE_NAPI_FUNCTION("mul", DemoJavascriptClassMul), 5033eb0b6dSopenharmony_ci DECLARE_NAPI_FUNCTION("div", DemoJavascriptClassDiv), 5133eb0b6dSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("ONE", one), 5233eb0b6dSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("TWO", two), 5333eb0b6dSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("THREE", three), 5433eb0b6dSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("FOUR", four), 5533eb0b6dSopenharmony_ci }; 5633eb0b6dSopenharmony_ci 5733eb0b6dSopenharmony_ci napi_value result = nullptr; 5833eb0b6dSopenharmony_ci napi_define_class(env, "DemoClass", NAPI_AUTO_LENGTH, DemoJavascriptClassConstructor, nullptr, 5933eb0b6dSopenharmony_ci sizeof(descriptors) / sizeof(*descriptors), descriptors, &result); 6033eb0b6dSopenharmony_ci 6133eb0b6dSopenharmony_ci napi_set_named_property(env, exports, "DemoClass", result); 6233eb0b6dSopenharmony_ci} 6333eb0b6dSopenharmony_ci 6433eb0b6dSopenharmony_ci/* 6533eb0b6dSopenharmony_ci * Constructor 6633eb0b6dSopenharmony_ci */ 6733eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassConstructor(napi_env env, napi_callback_info info) 6833eb0b6dSopenharmony_ci{ 6933eb0b6dSopenharmony_ci napi_value thisArg = nullptr; 7033eb0b6dSopenharmony_ci void* data = nullptr; 7133eb0b6dSopenharmony_ci 7233eb0b6dSopenharmony_ci napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data); 7333eb0b6dSopenharmony_ci 7433eb0b6dSopenharmony_ci napi_value global = nullptr; 7533eb0b6dSopenharmony_ci napi_get_global(env, &global); 7633eb0b6dSopenharmony_ci 7733eb0b6dSopenharmony_ci return thisArg; 7833eb0b6dSopenharmony_ci} 7933eb0b6dSopenharmony_ci 8033eb0b6dSopenharmony_ci/* 8133eb0b6dSopenharmony_ci * Add Method 8233eb0b6dSopenharmony_ci */ 8333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassAdd(napi_env env, napi_callback_info info) 8433eb0b6dSopenharmony_ci{ 8533eb0b6dSopenharmony_ci size_t requireArgc = 2; 8633eb0b6dSopenharmony_ci size_t argc = 2; 8733eb0b6dSopenharmony_ci napi_value argv[2] = { 0 }; 8833eb0b6dSopenharmony_ci napi_value thisArg = nullptr; 8933eb0b6dSopenharmony_ci void* data = nullptr; 9033eb0b6dSopenharmony_ci napi_get_cb_info(env, info, &argc, argv, &thisArg, &data); 9133eb0b6dSopenharmony_ci 9233eb0b6dSopenharmony_ci napi_value result = nullptr; 9333eb0b6dSopenharmony_ci 9433eb0b6dSopenharmony_ci NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type"); 9533eb0b6dSopenharmony_ci 9633eb0b6dSopenharmony_ci napi_valuetype valueType = napi_undefined; 9733eb0b6dSopenharmony_ci double param1 = 0; 9833eb0b6dSopenharmony_ci double param2 = 0; 9933eb0b6dSopenharmony_ci 10033eb0b6dSopenharmony_ci napi_typeof(env, argv[0], &valueType); 10133eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 10233eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 1"); 10333eb0b6dSopenharmony_ci return nullptr; 10433eb0b6dSopenharmony_ci } 10533eb0b6dSopenharmony_ci 10633eb0b6dSopenharmony_ci napi_typeof(env, argv[1], &valueType); 10733eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 10833eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 2"); 10933eb0b6dSopenharmony_ci return nullptr; 11033eb0b6dSopenharmony_ci } 11133eb0b6dSopenharmony_ci 11233eb0b6dSopenharmony_ci napi_get_value_double(env, argv[0], ¶m1); 11333eb0b6dSopenharmony_ci napi_get_value_double(env, argv[1], ¶m2); 11433eb0b6dSopenharmony_ci 11533eb0b6dSopenharmony_ci napi_create_double(env, param1 + param2, &result); 11633eb0b6dSopenharmony_ci 11733eb0b6dSopenharmony_ci return result; 11833eb0b6dSopenharmony_ci} 11933eb0b6dSopenharmony_ci 12033eb0b6dSopenharmony_ci/* 12133eb0b6dSopenharmony_ci * Sub Method 12233eb0b6dSopenharmony_ci */ 12333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassSub(napi_env env, napi_callback_info info) 12433eb0b6dSopenharmony_ci{ 12533eb0b6dSopenharmony_ci size_t requireArgc = 2; 12633eb0b6dSopenharmony_ci size_t argc = 2; 12733eb0b6dSopenharmony_ci napi_value argv[2] = { 0 }; 12833eb0b6dSopenharmony_ci napi_value thisArg = nullptr; 12933eb0b6dSopenharmony_ci void* data = nullptr; 13033eb0b6dSopenharmony_ci napi_get_cb_info(env, info, &argc, argv, &thisArg, &data); 13133eb0b6dSopenharmony_ci 13233eb0b6dSopenharmony_ci napi_value result = nullptr; 13333eb0b6dSopenharmony_ci 13433eb0b6dSopenharmony_ci NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type"); 13533eb0b6dSopenharmony_ci 13633eb0b6dSopenharmony_ci napi_valuetype valueType = napi_undefined; 13733eb0b6dSopenharmony_ci double param1 = 0; 13833eb0b6dSopenharmony_ci double param2 = 0; 13933eb0b6dSopenharmony_ci 14033eb0b6dSopenharmony_ci napi_typeof(env, argv[0], &valueType); 14133eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 14233eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 1"); 14333eb0b6dSopenharmony_ci return nullptr; 14433eb0b6dSopenharmony_ci } 14533eb0b6dSopenharmony_ci 14633eb0b6dSopenharmony_ci napi_typeof(env, argv[1], &valueType); 14733eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 14833eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 2"); 14933eb0b6dSopenharmony_ci return nullptr; 15033eb0b6dSopenharmony_ci } 15133eb0b6dSopenharmony_ci 15233eb0b6dSopenharmony_ci napi_get_value_double(env, argv[0], ¶m1); 15333eb0b6dSopenharmony_ci napi_get_value_double(env, argv[1], ¶m2); 15433eb0b6dSopenharmony_ci 15533eb0b6dSopenharmony_ci napi_create_double(env, param1 - param2, &result); 15633eb0b6dSopenharmony_ci 15733eb0b6dSopenharmony_ci return result; 15833eb0b6dSopenharmony_ci} 15933eb0b6dSopenharmony_ci 16033eb0b6dSopenharmony_ci/* 16133eb0b6dSopenharmony_ci * Mul Method 16233eb0b6dSopenharmony_ci */ 16333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassMul(napi_env env, napi_callback_info info) 16433eb0b6dSopenharmony_ci{ 16533eb0b6dSopenharmony_ci size_t requireArgc = 2; 16633eb0b6dSopenharmony_ci size_t argc = 2; 16733eb0b6dSopenharmony_ci napi_value argv[2] = { 0 }; 16833eb0b6dSopenharmony_ci napi_value thisArg = nullptr; 16933eb0b6dSopenharmony_ci void* data = nullptr; 17033eb0b6dSopenharmony_ci napi_get_cb_info(env, info, &argc, argv, &thisArg, &data); 17133eb0b6dSopenharmony_ci 17233eb0b6dSopenharmony_ci napi_value result = nullptr; 17333eb0b6dSopenharmony_ci 17433eb0b6dSopenharmony_ci NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type"); 17533eb0b6dSopenharmony_ci 17633eb0b6dSopenharmony_ci napi_valuetype valueType = napi_undefined; 17733eb0b6dSopenharmony_ci double param1 = 0; 17833eb0b6dSopenharmony_ci double param2 = 0; 17933eb0b6dSopenharmony_ci 18033eb0b6dSopenharmony_ci napi_typeof(env, argv[0], &valueType); 18133eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 18233eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 1"); 18333eb0b6dSopenharmony_ci return nullptr; 18433eb0b6dSopenharmony_ci } 18533eb0b6dSopenharmony_ci 18633eb0b6dSopenharmony_ci napi_typeof(env, argv[1], &valueType); 18733eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 18833eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 2"); 18933eb0b6dSopenharmony_ci return nullptr; 19033eb0b6dSopenharmony_ci } 19133eb0b6dSopenharmony_ci 19233eb0b6dSopenharmony_ci napi_get_value_double(env, argv[0], ¶m1); 19333eb0b6dSopenharmony_ci napi_get_value_double(env, argv[1], ¶m2); 19433eb0b6dSopenharmony_ci 19533eb0b6dSopenharmony_ci napi_create_double(env, param1 * param2, &result); 19633eb0b6dSopenharmony_ci 19733eb0b6dSopenharmony_ci return result; 19833eb0b6dSopenharmony_ci} 19933eb0b6dSopenharmony_ci 20033eb0b6dSopenharmony_ci/* 20133eb0b6dSopenharmony_ci * Div Method 20233eb0b6dSopenharmony_ci */ 20333eb0b6dSopenharmony_cistatic napi_value DemoJavascriptClassDiv(napi_env env, napi_callback_info info) 20433eb0b6dSopenharmony_ci{ 20533eb0b6dSopenharmony_ci size_t requireArgc = 2; 20633eb0b6dSopenharmony_ci size_t argc = 2; 20733eb0b6dSopenharmony_ci napi_value argv[2] = { 0 }; 20833eb0b6dSopenharmony_ci napi_value thisArg = nullptr; 20933eb0b6dSopenharmony_ci void* data = nullptr; 21033eb0b6dSopenharmony_ci napi_get_cb_info(env, info, &argc, argv, &thisArg, &data); 21133eb0b6dSopenharmony_ci 21233eb0b6dSopenharmony_ci napi_value result = nullptr; 21333eb0b6dSopenharmony_ci 21433eb0b6dSopenharmony_ci NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameters of number type"); 21533eb0b6dSopenharmony_ci 21633eb0b6dSopenharmony_ci napi_valuetype valueType = napi_undefined; 21733eb0b6dSopenharmony_ci double param1 = 0; 21833eb0b6dSopenharmony_ci double param2 = 0; 21933eb0b6dSopenharmony_ci 22033eb0b6dSopenharmony_ci napi_typeof(env, argv[0], &valueType); 22133eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 22233eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 1"); 22333eb0b6dSopenharmony_ci return nullptr; 22433eb0b6dSopenharmony_ci } 22533eb0b6dSopenharmony_ci 22633eb0b6dSopenharmony_ci napi_typeof(env, argv[1], &valueType); 22733eb0b6dSopenharmony_ci if (valueType != napi_valuetype::napi_number) { 22833eb0b6dSopenharmony_ci napi_throw_type_error(env, nullptr, "type mismatch for parameter 2"); 22933eb0b6dSopenharmony_ci return nullptr; 23033eb0b6dSopenharmony_ci } 23133eb0b6dSopenharmony_ci 23233eb0b6dSopenharmony_ci napi_get_value_double(env, argv[0], ¶m1); 23333eb0b6dSopenharmony_ci napi_get_value_double(env, argv[1], ¶m2); 23433eb0b6dSopenharmony_ci 23533eb0b6dSopenharmony_ci NAPI_ASSERT(env, param2 == 0, "parameter 2 cannot be zero"); 23633eb0b6dSopenharmony_ci 23733eb0b6dSopenharmony_ci napi_create_double(env, param1 / param2, &result); 23833eb0b6dSopenharmony_ci 23933eb0b6dSopenharmony_ci return result; 24033eb0b6dSopenharmony_ci} 241