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 168bf80f4bSopenharmony_ci#ifndef META_SRC_PROXY_OBJECT_H 178bf80f4bSopenharmony_ci#define META_SRC_PROXY_OBJECT_H 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <meta/api/event_handler.h> 228bf80f4bSopenharmony_ci#include <meta/api/property/default_value_bind.h> 238bf80f4bSopenharmony_ci#include <meta/base/interface_macros.h> 248bf80f4bSopenharmony_ci#include <meta/base/namespace.h> 258bf80f4bSopenharmony_ci#include <meta/ext/object.h> 268bf80f4bSopenharmony_ci#include <meta/interface/builtin_objects.h> 278bf80f4bSopenharmony_ci#include <meta/interface/intf_proxy_object.h> 288bf80f4bSopenharmony_ci 298bf80f4bSopenharmony_ci#include "object.h" 308bf80f4bSopenharmony_ci 318bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 328bf80f4bSopenharmony_ci 338bf80f4bSopenharmony_cinamespace Internal { 348bf80f4bSopenharmony_ci 358bf80f4bSopenharmony_ciclass ProxyObject final : public Internal::ObjectFwd<ProxyObject, META_NS::ClassId::ProxyObject, IProxyObject> { 368bf80f4bSopenharmony_ci using Super = Internal::ObjectFwd<ProxyObject, META_NS::ClassId::ProxyObject, IProxyObject>; 378bf80f4bSopenharmony_ci 388bf80f4bSopenharmony_cipublic: 398bf80f4bSopenharmony_ci ProxyObject() = default; 408bf80f4bSopenharmony_ci ~ProxyObject() override; 418bf80f4bSopenharmony_ci META_NO_COPY_MOVE(ProxyObject) 428bf80f4bSopenharmony_ci 438bf80f4bSopenharmony_cipublic: // ILifecycle 448bf80f4bSopenharmony_ci bool Build(const IMetadata::Ptr& data) override; 458bf80f4bSopenharmony_ci 468bf80f4bSopenharmony_cipublic: // IMetadata 478bf80f4bSopenharmony_ci IProperty::Ptr GetPropertyByName(BASE_NS::string_view name) override; 488bf80f4bSopenharmony_ci IProperty::ConstPtr GetPropertyByName(BASE_NS::string_view name) const override; 498bf80f4bSopenharmony_ci void RemoveProperty(const IProperty::Ptr&) override; 508bf80f4bSopenharmony_ci 518bf80f4bSopenharmony_ci BASE_NS::vector<IProperty::Ptr> GetAllProperties() override; 528bf80f4bSopenharmony_ci BASE_NS::vector<IProperty::ConstPtr> GetAllProperties() const override; 538bf80f4bSopenharmony_ci 548bf80f4bSopenharmony_cipublic: // IProxyObject 558bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY(IProxyObject, ProxyModeBitsValue, Mode, ProxyMode::REFLECT_PROXY_HIERARCHY) 568bf80f4bSopenharmony_ci META_IMPLEMENT_INTERFACE_PROPERTY(IProxyObject, bool, Dynamic, true); 578bf80f4bSopenharmony_ci const IObject::Ptr GetTarget() const override; 588bf80f4bSopenharmony_ci bool SetTarget(const IObject::Ptr& target) override; 598bf80f4bSopenharmony_ci BASE_NS::vector<IProperty::ConstPtr> GetOverrides() const override; 608bf80f4bSopenharmony_ci IProperty::ConstPtr GetOverride(BASE_NS::string_view name) const override; 618bf80f4bSopenharmony_ci IProperty::Ptr SetPropertyTarget(const IProperty::Ptr& property) override; 628bf80f4bSopenharmony_ci IProperty::ConstPtr GetProxyProperty(BASE_NS::string_view name) const override; 638bf80f4bSopenharmony_ci 648bf80f4bSopenharmony_ciprivate: 658bf80f4bSopenharmony_ci void ListenTargetChanges(); 668bf80f4bSopenharmony_ci void ResetTargetListener(); 678bf80f4bSopenharmony_ci void RefreshProperties(); 688bf80f4bSopenharmony_ci IProperty::Ptr AddProxyProperty(const IProperty::ConstPtr& tp); 698bf80f4bSopenharmony_ci IProperty::Ptr AddProxyProperty(BASE_NS::string_view name); 708bf80f4bSopenharmony_ci void PopulateAllProperties(); 718bf80f4bSopenharmony_ci bool ShouldSerialise(const IProperty::Ptr& p) const; 728bf80f4bSopenharmony_ci void UpdateSerializeState(); 738bf80f4bSopenharmony_ci void ReflectHierarchy(const IObject::Ptr& target); 748bf80f4bSopenharmony_ci void ReflectTargetForProperty(const IMetadata::Ptr& m, BASE_NS::string_view name, const IProxyObject::Ptr& proxy); 758bf80f4bSopenharmony_ci 768bf80f4bSopenharmony_ci void OnPropertyAdded(const ChildChangedInfo& info); 778bf80f4bSopenharmony_ci void OnPropertyRemoved(const ChildChangedInfo& info); 788bf80f4bSopenharmony_ci void OnPropertyChanged(const IProperty::Ptr& p); 798bf80f4bSopenharmony_ci 808bf80f4bSopenharmony_ciprivate: 818bf80f4bSopenharmony_ci IObject::WeakPtr target_; 828bf80f4bSopenharmony_ci mutable BASE_NS::unordered_map<BASE_NS::string, DefaultValueBind> proxyProperties_; 838bf80f4bSopenharmony_ci EventHandler targetAddedListener_; 848bf80f4bSopenharmony_ci EventHandler targetRemovedListener_; 858bf80f4bSopenharmony_ci EventHandler metaAdded_; 868bf80f4bSopenharmony_ci EventHandler metaRemoved_; 878bf80f4bSopenharmony_ci bool updating_ {}; 888bf80f4bSopenharmony_ci}; 898bf80f4bSopenharmony_ci 908bf80f4bSopenharmony_ci} // namespace Internal 918bf80f4bSopenharmony_ci 928bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 938bf80f4bSopenharmony_ci 948bf80f4bSopenharmony_ci#endif 95