/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "functions.h"
#include
META_BEGIN_NAMESPACE()
BASE_NS::string SettableFunction::GetName() const
{
auto p = func_.lock();
return p ? p->GetName() : BASE_NS::string();
}
IObject::ConstPtr SettableFunction::GetDestination() const
{
auto p = func_.lock();
return p ? p->GetDestination() : nullptr;
}
void SettableFunction::Invoke(const ICallContext::Ptr& context) const
{
if (auto p = func_.lock()) {
p->Invoke(context);
}
}
ICallContext::Ptr SettableFunction::CreateCallContext() const
{
auto p = func_.lock();
return p ? p->CreateCallContext() : nullptr;
}
bool SettableFunction::SetTarget(const IObject::Ptr& obj, BASE_NS::string_view name)
{
return ResolveFunction(obj, name);
}
bool SettableFunction::ResolveFunction(const IObject::Ptr& obj, BASE_NS::string_view name)
{
func_ = nullptr;
if (auto metad = interface_cast(obj)) {
func_ = metad->GetFunctionByName(name);
}
return !func_.expired();
}
ReturnError SettableFunction::Export(IExportContext& c) const
{
if (auto func = func_.lock()) {
if (auto dest = func->GetDestination()) {
return Serializer(c) & NamedValue("Destination", dest) & NamedValue("Function", func->GetName());
}
CORE_LOG_E("No destination object with Function");
}
return GenericError::FAIL;
}
ReturnError SettableFunction::Import(IImportContext& c)
{
IObject::Ptr p;
BASE_NS::string func;
Serializer ser(c);
if (ser & NamedValue("Destination", p) & NamedValue("Function", func)) {
if (ResolveFunction(p, func)) {
return GenericError::SUCCESS;
}
}
return GenericError::FAIL;
}
BASE_NS::string PropertyFunction::GetName() const
{
auto p = prop_.lock();
return p ? p->GetName() : BASE_NS::string();
}
IObject::ConstPtr PropertyFunction::GetDestination() const
{
return interface_pointer_cast(prop_.lock());
}
void PropertyFunction::Invoke(const ICallContext::Ptr& context) const
{
if (auto p = prop_.lock()) {
context->SetResult(p->GetValue());
} else {
CORE_LOG_W("Invoked property function without valid property");
}
}
ICallContext::Ptr PropertyFunction::CreateCallContext() const
{
ICallContext::Ptr context;
if (auto i = interface_pointer_cast(prop_)) {
if (auto any = i->GetInternalAny()) {
context = GetObjectRegistry().ConstructDefaultCallContext();
if (context) {
context->DefineResult(any->Clone(false));
}
}
}
return context;
}
bool PropertyFunction::SetTarget(const IProperty::ConstPtr& prop)
{
prop_ = prop;
return false;
}
ReturnError PropertyFunction::Export(IExportContext& c) const
{
return Serializer(c) & NamedValue("source", prop_);
}
ReturnError PropertyFunction::Import(IImportContext& c)
{
return Serializer(c) & NamedValue("source", uri_);
}
ReturnError PropertyFunction::Finalize(IImportFunctions& funcs)
{
if (uri_.IsValid() && uri_.ReferencesProperty()) {
auto objUri = uri_;
objUri.TakeLastNode();
if (auto obj = interface_pointer_cast(funcs.ResolveRefUri(objUri))) {
if (auto prop = obj->GetPropertyByName(uri_.ReferencedName())) {
prop_ = prop;
}
return GenericError::SUCCESS;
}
}
return GenericError::FAIL;
}
META_END_NAMESPACE()