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 16 #ifndef META_SRC_SERIALIZATION_IMPORTER_H 17 #define META_SRC_SERIALIZATION_IMPORTER_H 18 19 #include <functional> 20 21 #include <meta/ext/minimal_object.h> 22 #include <meta/interface/intf_attach.h> 23 #include <meta/interface/intf_container.h> 24 #include <meta/interface/intf_metadata.h> 25 #include <meta/interface/serialization/intf_import_context.h> 26 #include <meta/interface/serialization/intf_importer.h> 27 #include <meta/interface/serialization/intf_serializable.h> 28 29 #include "../base_object.h" 30 #include "ser_nodes.h" 31 32 META_BEGIN_NAMESPACE() 33 namespace Serialization { 34 35 class Importer : public Internal::BaseObjectFwd<Importer, META_NS::ClassId::Importer, IImporter, IImportFunctions> { 36 public: Importer()37 Importer() : registry_(GetObjectRegistry()), globalData_(registry_.GetGlobalSerializationData()) {} Importer(IObjectRegistry& reg, IGlobalSerializationData& data)38 explicit Importer(IObjectRegistry& reg, IGlobalSerializationData& data) : registry_(reg), globalData_(data) {} 39 40 IObject::Ptr Import(const ISerNode::ConstPtr& tree) override; 41 ReturnError ImportValue(const ISerNode::ConstPtr& n, IAny& entity); 42 IAny::Ptr ImportAny(const ISerNode::ConstPtr& n); 43 IObject::Ptr ImportRef(const RefUri& ref); 44 45 ReturnError ImportFromNode(const ISerNode::ConstPtr&, IAny& entity) override; 46 ReturnError AutoImportObject(const IMapNode& members, IObject::Ptr object); 47 48 private: 49 InstanceId ConvertInstanceId(const InstanceId& id) const; 50 IObject::Ptr GetReferencedObject(const InstanceId& uid) const; 51 52 IObject::Ptr ImportObject(const ISerNode::ConstPtr& n); 53 IObject::Ptr ImportObject(const IObjectNode::ConstPtr& node, IObject::Ptr object); 54 ReturnError ImportAny(const IObjectNode::ConstPtr& n, const IAny::Ptr& any); 55 ReturnError ImportBuiltinValue(const ISerNode::ConstPtr& n, IAny& entity); 56 ReturnError ImportPointer(const ISerNode::ConstPtr& n, IAny& entity); 57 58 ReturnError ImportArray(const ISerNode::ConstPtr& n, IArrayAny& array); 59 ReturnError ImportIMetadata(const IMapNode& members, const IObject::Ptr& owner, IMetadata& data); 60 ReturnError ImportIAttach(const ISerNode::ConstPtr& node, const IObject::Ptr& owner, IAttach& cont); 61 ReturnError ImportIContainer(const ISerNode::ConstPtr& node, IContainer& cont); 62 ReturnError ImportIObjectFlags(const ISerNode::ConstPtr& node, IObjectFlags& flags); 63 64 ReturnError AutoImportObject(const ISerNode::ConstPtr& node, IObject::Ptr object); 65 IObject::Ptr ResolveRefUri(const RefUri& uri) override; 66 ReturnError ImportWeakPtrInAny(const ISerNode::ConstPtr& node, const IAny::Ptr& any); 67 68 bool IsRegisteredObjectType(const ObjectId& oid) const; 69 70 private: 71 IObjectRegistry& registry_; 72 IGlobalSerializationData& globalData_; 73 Version importVersion_; 74 BASE_NS::unordered_map<InstanceId, InstanceId> mapInstanceIds_; 75 BASE_NS::vector<IImportFinalize::Ptr> finalizes_; 76 size_t tentative_ {}; 77 78 struct DeferredUriResolve { 79 IAny::Ptr target; 80 RefUri uri; 81 }; 82 BASE_NS::vector<DeferredUriResolve> deferred_; 83 }; 84 85 class ImportContext : public IntroduceInterfaces<IImportContext> { 86 public: ImportContext(Importer& imp, IObject::Ptr p, IMapNode::ConstPtr node)87 ImportContext(Importer& imp, IObject::Ptr p, IMapNode::ConstPtr node) : importer_(imp), object_(p), node_(node) {} 88 89 bool HasMember(BASE_NS::string_view name) const override; 90 ReturnError Import(BASE_NS::string_view name, IAny& entity) override; 91 ReturnError ImportAny(BASE_NS::string_view name, IAny::Ptr& any) override; 92 ReturnError ImportWeakPtr(BASE_NS::string_view name, IObject::WeakPtr& ptr) override; 93 ReturnError AutoImport() override; 94 95 IObject::Ptr ResolveRefUri(const RefUri& uri) override; 96 97 ReturnError ImportFromNode(const ISerNode::ConstPtr&, IAny& entity) override; 98 99 private: 100 Importer& importer_; 101 IObject::Ptr object_; 102 IMapNode::ConstPtr node_; 103 }; 104 105 } // namespace Serialization 106 META_END_NAMESPACE() 107 108 #endif 109