1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef META_SRC_META_OBJECT_H 16 #define META_SRC_META_OBJECT_H 17 18 #include <base/containers/array_view.h> 19 #include <base/containers/vector.h> 20 21 #include <meta/base/types.h> 22 #include <meta/ext/implementation_macros.h> 23 #include <meta/ext/metadata_helpers.h> 24 #include <meta/ext/object_factory.h> 25 #include <meta/interface/builtin_objects.h> 26 #include <meta/interface/interface_helpers.h> 27 #include <meta/interface/intf_attachment.h> 28 #include <meta/interface/intf_attachment_container.h> 29 #include <meta/interface/intf_metadata.h> 30 #include <meta/interface/intf_object_context.h> 31 32 #include "base_object.h" 33 34 META_BEGIN_NAMESPACE() 35 36 namespace Internal { 37 38 class MetaObject : public BaseObjectFwd<MetaObject, META_NS::ClassId::MetaObject, IObjectContextProvider, IMetadata, 39 IMetadataInternal> { 40 using Super = BaseObjectFwd; 41 42 public: GetInterfacesVector()43 static BASE_NS::vector<BASE_NS::Uid> GetInterfacesVector() 44 { 45 return Super::GetInterfacesVector(); 46 } 47 48 protected: 49 // ILifecycle 50 bool Build(const IMetadata::Ptr& data) override; 51 void Destroy() override; 52 IObjectRegistry& GetObjectRegistry() const override; 53 IObject::Ptr Resolve(const RefUri& uri) const override; 54 55 // IObjectContextProvider 56 57 IProperty::Ptr PropertyObjectContext() override; 58 IProperty::ConstPtr PropertyObjectContext() const override; 59 void ResetObjectContext() override; 60 61 // IMetadata 62 IMetadata::Ptr CloneMetadata() const override; 63 IContainer::Ptr GetPropertyContainer() override; 64 IContainer::ConstPtr GetPropertyContainer() const override; 65 66 void AddFunction(const IFunction::Ptr&) override; 67 void RemoveFunction(const IFunction::Ptr&) override; 68 69 void AddProperty(const IProperty::Ptr&) override; 70 void RemoveProperty(const IProperty::Ptr&) override; 71 72 void AddEvent(const IEvent::Ptr&) override; 73 void RemoveEvent(const IEvent::Ptr&) override; 74 75 void SetProperties(const BASE_NS::vector<IProperty::Ptr>& vec) override; 76 void Merge(const IMetadata::Ptr& data) override; 77 78 BASE_NS::vector<IProperty::Ptr> GetAllProperties() override; 79 BASE_NS::vector<IProperty::ConstPtr> GetAllProperties() const override; 80 BASE_NS::vector<IFunction::Ptr> GetAllFunctions() override; 81 BASE_NS::vector<IFunction::ConstPtr> GetAllFunctions() const override; 82 BASE_NS::vector<IEvent::Ptr> GetAllEvents() override; 83 BASE_NS::vector<IEvent::ConstPtr> GetAllEvents() const override; 84 85 IProperty::Ptr GetPropertyByName(BASE_NS::string_view name) override; 86 IProperty::ConstPtr GetPropertyByName(BASE_NS::string_view name) const override; 87 IFunction::Ptr GetFunctionByName(BASE_NS::string_view name) override; 88 IFunction::ConstPtr GetFunctionByName(BASE_NS::string_view name) const override; 89 IEvent::ConstPtr GetEventByName(BASE_NS::string_view name) const override; 90 IEvent::Ptr GetEventByName(BASE_NS::string_view name) override; 91 92 // IMetadataInternal 93 IMetadata::Ptr GetMetadata() const override; 94 void SetMetadata(const IMetadata::Ptr& meta) override; 95 const StaticObjectMetadata& GetStaticMetadata() const override; 96 97 private: 98 Property<IObjectContext::Ptr> GetOrConstuctObjectContext() const; 99 100 mutable Property<IObjectContext::Ptr> objectContext_; 101 IMetadata::Ptr meta_; 102 }; 103 104 template<class FinalClass, const META_NS::ClassInfo& ClassInfo, class... Interfaces> 105 class MetaObjectFwd : public ConcreteBaseFwd<FinalClass, ClassInfo, META_NS::Internal::MetaObject, Interfaces...> { 106 using Super = ConcreteBaseFwd<FinalClass, ClassInfo, META_NS::Internal::MetaObject, Interfaces...>; 107 108 public: 109 IObjectRegistry& GetObjectRegistry() const override 110 { 111 return MetaObject::GetObjectRegistry(); 112 } 113 114 void SetMetadata(const META_NS::IMetadata::Ptr& meta) override 115 { 116 Super::SetMetadata(meta); 117 META_NS::ConstructPropertiesFromMetadata(this, this->GetStaticObjectMetadata(), meta); 118 META_NS::ConstructEventsFromMetadata(this, this->GetStaticObjectMetadata(), meta); 119 META_NS::ConstructFunctionsFromMetadata(this, this->GetStaticObjectMetadata(), meta); 120 } 121 122 protected: 123 MetaObjectFwd() = default; 124 ~MetaObjectFwd() override = default; 125 }; 126 127 } // namespace Internal 128 129 class MetaObject : public Internal::MetaObjectFwd<MetaObject, ClassId::MetaObject> {}; 130 131 META_END_NAMESPACE() 132 133 #endif 134