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 "engine_value.h"
168bf80f4bSopenharmony_ci
178bf80f4bSopenharmony_ci#include <core/property/intf_property_api.h>
188bf80f4bSopenharmony_ci
198bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
208bf80f4bSopenharmony_ci
218bf80f4bSopenharmony_cinamespace Internal {
228bf80f4bSopenharmony_ci
238bf80f4bSopenharmony_ciEngineValue::EngineValue(
248bf80f4bSopenharmony_ci    BASE_NS::string name, IEngineInternalValueAccess::ConstPtr access, const EnginePropertyParams& p)
258bf80f4bSopenharmony_ci    : params_(p), access_(BASE_NS::move(access)), name_(BASE_NS::move(name)), value_(access_->CreateAny())
268bf80f4bSopenharmony_ci{}
278bf80f4bSopenharmony_ci
288bf80f4bSopenharmony_ciAnyReturnValue EngineValue::Sync(EngineSyncDirection dir)
298bf80f4bSopenharmony_ci{
308bf80f4bSopenharmony_ci    if (!params_.handle) {
318bf80f4bSopenharmony_ci        return AnyReturn::INVALID_ARGUMENT;
328bf80f4bSopenharmony_ci    }
338bf80f4bSopenharmony_ci    if (dir == EngineSyncDirection::TO_ENGINE || (dir == EngineSyncDirection::AUTO && valueChanged_)) {
348bf80f4bSopenharmony_ci        if (valueChanged_) {
358bf80f4bSopenharmony_ci        valueChanged_ = false;
368bf80f4bSopenharmony_ci        return access_->SyncToEngine(*value_, params_) ? AnyReturn::NOTHING_TO_DO : AnyReturn::FAIL;
378bf80f4bSopenharmony_ci        }
388bf80f4bSopenharmony_ci        return AnyReturn::NOTHING_TO_DO;
398bf80f4bSopenharmony_ci    }
408bf80f4bSopenharmony_ci    return access_->SyncFromEngine(params_, *value_);
418bf80f4bSopenharmony_ci}
428bf80f4bSopenharmony_ciAnyReturnValue EngineValue::SetValue(const IAny& value)
438bf80f4bSopenharmony_ci{
448bf80f4bSopenharmony_ci    AnyReturnValue res = value_->CopyFrom(value);
458bf80f4bSopenharmony_ci    valueChanged_ |= static_cast<bool>(res);
468bf80f4bSopenharmony_ci    if (params_.pushValueToEngineDirectly) {
478bf80f4bSopenharmony_ci        if (valueChanged_) {
488bf80f4bSopenharmony_ci            if (!params_.handle) {
498bf80f4bSopenharmony_ci                return AnyReturn::INVALID_ARGUMENT;
508bf80f4bSopenharmony_ci            }
518bf80f4bSopenharmony_ci            valueChanged_ = false;
528bf80f4bSopenharmony_ci            res = access_->SyncToEngine(*value_, params_) ? AnyReturn::NOTHING_TO_DO : AnyReturn::FAIL;
538bf80f4bSopenharmony_ci        }
548bf80f4bSopenharmony_ci    }
558bf80f4bSopenharmony_ci    return res;
568bf80f4bSopenharmony_ci}
578bf80f4bSopenharmony_ciconst IAny& EngineValue::GetValue() const
588bf80f4bSopenharmony_ci{
598bf80f4bSopenharmony_ci    return *value_;
608bf80f4bSopenharmony_ci}
618bf80f4bSopenharmony_cibool EngineValue::IsCompatible(const TypeId& id) const
628bf80f4bSopenharmony_ci{
638bf80f4bSopenharmony_ci    return META_NS::IsCompatible(*value_, id);
648bf80f4bSopenharmony_ci}
658bf80f4bSopenharmony_ciBASE_NS::string EngineValue::GetName() const
668bf80f4bSopenharmony_ci{
678bf80f4bSopenharmony_ci    return name_;
688bf80f4bSopenharmony_ci}
698bf80f4bSopenharmony_civoid EngineValue::Lock() const
708bf80f4bSopenharmony_ci{
718bf80f4bSopenharmony_ci    mutex_.lock();
728bf80f4bSopenharmony_ci}
738bf80f4bSopenharmony_civoid EngineValue::Unlock() const
748bf80f4bSopenharmony_ci{
758bf80f4bSopenharmony_ci    mutex_.unlock();
768bf80f4bSopenharmony_ci}
778bf80f4bSopenharmony_civoid EngineValue::LockShared() const
788bf80f4bSopenharmony_ci{
798bf80f4bSopenharmony_ci    mutex_.lock_shared();
808bf80f4bSopenharmony_ci}
818bf80f4bSopenharmony_civoid EngineValue::UnlockShared() const
828bf80f4bSopenharmony_ci{
838bf80f4bSopenharmony_ci    mutex_.unlock_shared();
848bf80f4bSopenharmony_ci}
858bf80f4bSopenharmony_ciResetResult EngineValue::ProcessOnReset(const IAny&)
868bf80f4bSopenharmony_ci{
878bf80f4bSopenharmony_ci    return RESET_CONTINUE;
888bf80f4bSopenharmony_ci}
898bf80f4bSopenharmony_ciBASE_NS::shared_ptr<IEvent> EngineValue::EventOnChanged() const
908bf80f4bSopenharmony_ci{
918bf80f4bSopenharmony_ci    return event_;
928bf80f4bSopenharmony_ci}
938bf80f4bSopenharmony_ciEnginePropertyParams EngineValue::GetPropertyParams() const
948bf80f4bSopenharmony_ci{
958bf80f4bSopenharmony_ci    return params_;
968bf80f4bSopenharmony_ci}
978bf80f4bSopenharmony_cibool EngineValue::SetPropertyParams(const EnginePropertyParams& p)
988bf80f4bSopenharmony_ci{
998bf80f4bSopenharmony_ci    params_ = p;
1008bf80f4bSopenharmony_ci    return true;
1018bf80f4bSopenharmony_ci}
1028bf80f4bSopenharmony_ci
1038bf80f4bSopenharmony_ci} // namespace Internal
1048bf80f4bSopenharmony_ci
1058bf80f4bSopenharmony_ciMETA_END_NAMESPACE()
106