1 /*
2 * Copyright (c) 2022 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 "js_static_subscriber_extension.h"
17
18 #include "ability_info.h"
19 #include "hilog_wrapper.h"
20 #include "js_runtime.h"
21 #include "js_runtime_utils.h"
22 #include "js_static_subscriber_extension_context.h"
23 #include "napi_common_want.h"
24 #include "napi/native_api.h"
25 #include "napi/native_node_api.h"
26 #include "napi_remote_object.h"
27 #include "static_subscriber_stub_imp.h"
28
29 namespace OHOS {
30 namespace AbilityRuntime {
31 namespace {
32 constexpr size_t ARGC_ONE = 1;
33 }
34
35 using namespace OHOS::AppExecFwk;
Create(const std::unique_ptr<Runtime> & runtime)36 JsStaticSubscriberExtension* JsStaticSubscriberExtension::Create(const std::unique_ptr<Runtime>& runtime)
37 {
38 return new JsStaticSubscriberExtension(static_cast<JsRuntime&>(*runtime));
39 }
40
JsStaticSubscriberExtension(JsRuntime & jsRuntime)41 JsStaticSubscriberExtension::JsStaticSubscriberExtension(JsRuntime& jsRuntime) : jsRuntime_(jsRuntime) {}
42 JsStaticSubscriberExtension::~JsStaticSubscriberExtension() = default;
43
Init(const std::shared_ptr<AbilityLocalRecord> & record,const std::shared_ptr<OHOSApplication> & application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)44 void JsStaticSubscriberExtension::Init(const std::shared_ptr<AbilityLocalRecord>& record,
45 const std::shared_ptr<OHOSApplication>& application,
46 std::shared_ptr<AbilityHandler>& handler,
47 const sptr<IRemoteObject>& token)
48 {
49 StaticSubscriberExtension::Init(record, application, handler, token);
50 if (Extension::abilityInfo_->srcEntrance.empty()) {
51 HILOG_ERROR("%{public}s abilityInfo srcEntrance is empty", __func__);
52 return;
53 }
54 std::string srcPath(Extension::abilityInfo_->moduleName + "/");
55 srcPath.append(Extension::abilityInfo_->srcEntrance);
56 srcPath.erase(srcPath.rfind('.'));
57 srcPath.append(".abc");
58
59 std::string moduleName(Extension::abilityInfo_->moduleName);
60 moduleName.append("::").append(abilityInfo_->name);
61 HILOG_INFO("JsStaticSubscriberExtension::Init moduleName:%{public}s,srcPath:%{public}s.",
62 moduleName.c_str(), srcPath.c_str());
63 HandleScope handleScope(jsRuntime_);
64 auto& engine = jsRuntime_.GetNativeEngine();
65
66 jsObj_ = jsRuntime_.LoadModule(moduleName, srcPath);
67 if (jsObj_ == nullptr) {
68 HILOG_ERROR("Failed to get jsObj_");
69 return;
70 }
71 HILOG_INFO("JsStaticSubscriberExtension::Init ConvertNativeValueTo.");
72 NativeObject* obj = ConvertNativeValueTo<NativeObject>(jsObj_->Get());
73 if (obj == nullptr) {
74 HILOG_ERROR("Failed to get JsStaticSubscriberExtension object");
75 return;
76 }
77
78 auto context = GetContext();
79 if (context == nullptr) {
80 HILOG_ERROR("Failed to get context");
81 return;
82 }
83 HILOG_INFO("JsStaticSubscriberExtension::Init CreateJsStaticSubscriberExtensionContext.");
84 NativeValue* contextObj = CreateJsStaticSubscriberExtensionContext(engine, context);
85 auto shellContextRef = jsRuntime_.LoadSystemModule("application.StaticSubscriberExtensionContext",
86 &contextObj, ARGC_ONE);
87 contextObj = shellContextRef->Get();
88 HILOG_INFO("JsStaticSubscriberExtension::Init Bind.");
89 context->Bind(jsRuntime_, shellContextRef.release());
90 HILOG_INFO("JsStaticSubscriberExtension::SetProperty.");
91 obj->SetProperty("context", contextObj);
92 HILOG_INFO("JsStaticSubscriberExtension::Init end.");
93 }
94
OnStart(const AAFwk::Want & want)95 void JsStaticSubscriberExtension::OnStart(const AAFwk::Want& want)
96 {
97 Extension::OnStart(want);
98 HILOG_INFO("%{public}s begin.", __func__);
99 HILOG_INFO("%{public}s end.", __func__);
100 }
101
OnStop()102 void JsStaticSubscriberExtension::OnStop()
103 {
104 Extension::OnStop();
105 HILOG_INFO("%{public}s end.", __func__);
106 }
107
OnConnect(const AAFwk::Want & want)108 sptr<IRemoteObject> JsStaticSubscriberExtension::OnConnect(const AAFwk::Want& want)
109 {
110 Extension::OnConnect(want);
111 HILOG_INFO("%{public}s begin.", __func__);
112 sptr<StaticSubscriberStubImp> remoteObject = new (std::nothrow) StaticSubscriberStubImp(
113 std::static_pointer_cast<JsStaticSubscriberExtension>(shared_from_this()));
114 HILOG_INFO("%{public}s end. ", __func__);
115 return remoteObject->AsObject();
116 }
117
OnDisconnect(const AAFwk::Want & want)118 void JsStaticSubscriberExtension::OnDisconnect(const AAFwk::Want& want)
119 {
120 Extension::OnDisconnect(want);
121 HILOG_INFO("%{public}s begin.", __func__);
122 HILOG_INFO("%{public}s end.", __func__);
123 }
124
OnReceiveEvent(EventFwk::CommonEventData * data)125 void JsStaticSubscriberExtension::OnReceiveEvent(EventFwk::CommonEventData* data)
126 {
127 StaticSubscriberExtension::OnReceiveEvent(data);
128 HILOG_INFO("%{public}s begin.", __func__);
129 if (data == nullptr) {
130 HILOG_ERROR("%{public}s common event data == nullptr", __func__);
131 return;
132 }
133
134 HandleScope handleScope(jsRuntime_);
135 NativeEngine& nativeEngine = jsRuntime_.GetNativeEngine();
136
137 NativeValue* jCommonEventData = nativeEngine.CreateObject();
138 NativeObject* commonEventData = ConvertNativeValueTo<NativeObject>(jCommonEventData);
139 Want want = data->GetWant();
140 commonEventData->SetProperty("event", nativeEngine.CreateString(want.GetAction().c_str(), want.GetAction().size()));
141 commonEventData->SetProperty("bundleName", nativeEngine.CreateString(want.GetBundle().c_str(),
142 want.GetBundle().size()));
143 commonEventData->SetProperty("code", nativeEngine.CreateNumber(data->GetCode()));
144 commonEventData->SetProperty("data", nativeEngine.CreateString(data->GetData().c_str(), data->GetData().size()));
145 napi_value napiParams = AppExecFwk::WrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), want.GetParams());
146 NativeValue* nativeParams = reinterpret_cast<NativeValue*>(napiParams);
147 commonEventData->SetProperty("parameters", nativeParams);
148
149 NativeValue* argv[] = {jCommonEventData};
150 if (!jsObj_) {
151 HILOG_WARN("Not found StaticSubscriberExtension.js");
152 return;
153 }
154
155 NativeValue* value = jsObj_->Get();
156 NativeObject* obj = ConvertNativeValueTo<NativeObject>(value);
157 if (obj == nullptr) {
158 HILOG_ERROR("Failed to get StaticSubscriberExtension object");
159 return;
160 }
161
162 NativeValue* method = obj->GetProperty("onReceiveEvent");
163 if (method == nullptr) {
164 HILOG_ERROR("Failed to get onReceiveEvent from StaticSubscriberExtension object");
165 return;
166 }
167 nativeEngine.CallFunction(value, method, argv, ARGC_ONE);
168 HILOG_INFO("%{public}s end.", __func__);
169 }
170 } // namespace AbilityRuntime
171 } // namespace OHOS