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