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 32META_BEGIN_NAMESPACE() 33namespace Serialization { 34 35class Importer : public Internal::BaseObjectFwd<Importer, META_NS::ClassId::Importer, IImporter, IImportFunctions> { 36public: 37 Importer() : registry_(GetObjectRegistry()), globalData_(registry_.GetGlobalSerializationData()) {} 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 48private: 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 70private: 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 85class ImportContext : public IntroduceInterfaces<IImportContext> { 86public: 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 99private: 100 Importer& importer_; 101 IObject::Ptr object_; 102 IMapNode::ConstPtr node_; 103}; 104 105} // namespace Serialization 106META_END_NAMESPACE() 107 108#endif 109