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