18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci#include "connector.h" 168bf80f4bSopenharmony_ci 178bf80f4bSopenharmony_ci#include <meta/ext/serialization/serializer.h> 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_cibool Connector::AttachTo(const META_NS::IAttach::Ptr& target, const META_NS::IObject::Ptr& dataContext) 228bf80f4bSopenharmony_ci{ 238bf80f4bSopenharmony_ci auto source = source_.lock(); 248bf80f4bSopenharmony_ci auto dest = interface_cast<IMetadata>(target); 258bf80f4bSopenharmony_ci if (!source || !dest) { 268bf80f4bSopenharmony_ci CORE_LOG_E("Failed to attach Connector"); 278bf80f4bSopenharmony_ci return false; 288bf80f4bSopenharmony_ci } 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ci auto event = source->GetEventByName(eventName_); 318bf80f4bSopenharmony_ci if (!event) { 328bf80f4bSopenharmony_ci CORE_LOG_E("Failed to attach Connector: No such event"); 338bf80f4bSopenharmony_ci return false; 348bf80f4bSopenharmony_ci } 358bf80f4bSopenharmony_ci 368bf80f4bSopenharmony_ci auto func = dest->GetFunctionByName(funcName_); 378bf80f4bSopenharmony_ci if (!func) { 388bf80f4bSopenharmony_ci CORE_LOG_E("Failed to attach Connector: No such function"); 398bf80f4bSopenharmony_ci return false; 408bf80f4bSopenharmony_ci } 418bf80f4bSopenharmony_ci 428bf80f4bSopenharmony_ci handle_ = event->AddHandler(func); 438bf80f4bSopenharmony_ci return handle_ != IEvent::Token {}; 448bf80f4bSopenharmony_ci} 458bf80f4bSopenharmony_ci 468bf80f4bSopenharmony_cibool Connector::DetachFrom(const META_NS::IAttach::Ptr& target) 478bf80f4bSopenharmony_ci{ 488bf80f4bSopenharmony_ci if (handle_) { 498bf80f4bSopenharmony_ci auto source = source_.lock(); 508bf80f4bSopenharmony_ci if (source) { 518bf80f4bSopenharmony_ci auto event = source->GetEventByName(eventName_); 528bf80f4bSopenharmony_ci if (!event) { 538bf80f4bSopenharmony_ci return false; 548bf80f4bSopenharmony_ci } 558bf80f4bSopenharmony_ci event->RemoveHandler(handle_); 568bf80f4bSopenharmony_ci handle_ = IEvent::Token {}; 578bf80f4bSopenharmony_ci } 588bf80f4bSopenharmony_ci } 598bf80f4bSopenharmony_ci return true; 608bf80f4bSopenharmony_ci} 618bf80f4bSopenharmony_ci 628bf80f4bSopenharmony_cibool Connector::Connect(const IObject::Ptr& source, const BASE_NS::string& event, const BASE_NS::string& func) 638bf80f4bSopenharmony_ci{ 648bf80f4bSopenharmony_ci source_ = interface_pointer_cast<IMetadata>(source); 658bf80f4bSopenharmony_ci eventName_ = event; 668bf80f4bSopenharmony_ci funcName_ = func; 678bf80f4bSopenharmony_ci return !source_.expired() && !eventName_.empty() && !funcName_.empty(); 688bf80f4bSopenharmony_ci} 698bf80f4bSopenharmony_ci 708bf80f4bSopenharmony_ciIObject::Ptr Connector::GetSource() const 718bf80f4bSopenharmony_ci{ 728bf80f4bSopenharmony_ci return interface_pointer_cast<IObject>(source_); 738bf80f4bSopenharmony_ci} 748bf80f4bSopenharmony_ciBASE_NS::string Connector::GetEventName() const 758bf80f4bSopenharmony_ci{ 768bf80f4bSopenharmony_ci return eventName_; 778bf80f4bSopenharmony_ci} 788bf80f4bSopenharmony_ciBASE_NS::string Connector::GetFunctionName() const 798bf80f4bSopenharmony_ci{ 808bf80f4bSopenharmony_ci return funcName_; 818bf80f4bSopenharmony_ci} 828bf80f4bSopenharmony_ci 838bf80f4bSopenharmony_ciReturnError Connector::Export(IExportContext& c) const 848bf80f4bSopenharmony_ci{ 858bf80f4bSopenharmony_ci return Serializer(c) & NamedValue("Source", source_) & NamedValue("Event", eventName_) & 868bf80f4bSopenharmony_ci NamedValue("Function", funcName_); 878bf80f4bSopenharmony_ci} 888bf80f4bSopenharmony_ciReturnError Connector::Import(IImportContext& c) 898bf80f4bSopenharmony_ci{ 908bf80f4bSopenharmony_ci IMetadata::Ptr p; 918bf80f4bSopenharmony_ci Serializer ser(c); 928bf80f4bSopenharmony_ci ser& NamedValue("Source", p) & NamedValue("Event", eventName_) & NamedValue("Function", funcName_); 938bf80f4bSopenharmony_ci if (ser && p) { 948bf80f4bSopenharmony_ci source_ = p; 958bf80f4bSopenharmony_ci } 968bf80f4bSopenharmony_ci return ser; 978bf80f4bSopenharmony_ci} 988bf80f4bSopenharmony_ci 998bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 100