• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "frameworks/bridge/js_frontend/engine/v8/v8_clock_bridge.h"
17 
18 #include "base/utils/linear_map.h"
19 #include "frameworks/bridge/common/utils/utils.h"
20 
21 namespace OHOS::Ace::Framework {
22 
ParseClockConfig(v8::Local<v8::Context> ctx,v8::Local<v8::Value> valObject)23 void V8ClockBridge::ParseClockConfig(v8::Local<v8::Context> ctx, v8::Local<v8::Value> valObject)
24 {
25     v8::Isolate* isolate = ctx->GetIsolate();
26     ACE_DCHECK(isolate);
27     v8::HandleScope handleScope(isolate);
28 
29     if (!valObject->IsObject()) {
30         LOGE("none found attrs");
31         return;
32     }
33     v8::Local<v8::Object> v8ValObj;
34     if (!valObject->ToObject(ctx).ToLocal(&v8ValObj)) {
35         LOGE("Value to Object fail");
36         return;
37     }
38     v8::Local<v8::Array> properties = v8ValObj->GetOwnPropertyNames(ctx).ToLocalChecked();
39     int32_t len = properties->Length();
40     for (int32_t i = 0; i < len; i++) {
41         v8::Local<v8::Value> key;
42         if (!properties->Get(ctx, i).ToLocal(&key)) {
43             LOGW("key is null. Ignoring!");
44             continue;
45         }
46         v8::String::Utf8Value keyV8Str(isolate, key);
47         const char* keyStr = *keyV8Str;
48         if (keyStr == nullptr) {
49             continue;
50         }
51         v8::Local<v8::Value> val = v8ValObj->Get(ctx, key).ToLocalChecked();
52         if (val->IsString() || val->IsNumber()) {
53             v8::String::Utf8Value valV8Str(ctx->GetIsolate(), val);
54             const char* valStr = *valV8Str;
55             if (valStr == nullptr) {
56                 continue;
57             }
58             // static linear map must be sorted by key.
59             static const LinearMapNode<void (*)(const char*, V8ClockBridge&)> clockConfigOperators[] = {
60                 { DOM_DIGIT_COLOR,
61                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
62                         v8ClockBridge.clockConfig_.digitColor_ = valStr;
63                     } },
64                 { DOM_DIGIT_COLOR_NIGHT,
65                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
66                         v8ClockBridge.clockConfig_.digitColorNight_ = valStr;
67                     } },
68                 { DOM_DIGIT_RADIUS_RATIO,
69                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
70                         v8ClockBridge.clockConfig_.digitRadiusRatio_ = StringToDouble(valStr);
71                     } },
72                 { DOM_DIGIT_SIZE_RATIO,
73                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
74                         v8ClockBridge.clockConfig_.digitSizeRatio_ = StringToDouble(valStr);
75                     } },
76                 { DOM_CLOCK_FACE_SOURCE,
77                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
78                         v8ClockBridge.clockConfig_.clockFaceSrc_ = valStr;
79                     } },
80                 { DOM_CLOCK_FACE_SOURCE_NIGHT,
81                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
82                         v8ClockBridge.clockConfig_.clockFaceNightSrc_ = valStr;
83                     } },
84                 { DOM_HOUR_HAND_SOURCE,
85                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
86                         v8ClockBridge.clockConfig_.hourHandSrc_ = valStr;
87                     } },
88                 { DOM_HOUR_HAND_SOURCE_NIGHT,
89                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
90                         v8ClockBridge.clockConfig_.hourHandNightSrc_ = valStr;
91                     } },
92                 { DOM_MINUTE_HAND_SOURCE,
93                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
94                         v8ClockBridge.clockConfig_.minuteHandSrc_ = valStr;
95                     } },
96                 { DOM_MINUTE_HAND_SOURCE_NIGHT,
97                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
98                         v8ClockBridge.clockConfig_.minuteHandNightSrc_ = valStr;
99                     } },
100                 { DOM_SECOND_HAND_SOURCE,
101                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
102                         v8ClockBridge.clockConfig_.secondHandSrc_ = valStr;
103                     } },
104                 { DOM_SECOND_HAND_SOURCE_NIGHT,
105                     [](const char* valStr, V8ClockBridge& v8ClockBridge) {
106                         v8ClockBridge.clockConfig_.secondHandNightSrc_ = valStr;
107                     } },
108             };
109             auto operatorIter = BinarySearchFindIndex(clockConfigOperators, ArraySize(clockConfigOperators), keyStr);
110             if (operatorIter != -1) {
111                 clockConfigOperators[operatorIter].value(valStr, *this);
112             } else {
113                 LOGD("key : %{public}s unsupported. Ignoring!", keyStr);
114             }
115         } else {
116             LOGD("value of unsupported type. Ignoring!");
117         }
118     }
119 }
120 
121 } // namespace OHOS::Ace::Framework
122