• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/resource/intf_resource_consumer.h>
26 #include <meta/interface/serialization/intf_import_context.h>
27 #include <meta/interface/serialization/intf_importer.h>
28 #include <meta/interface/serialization/intf_serializable.h>
29 
30 #include "base_object.h"
31 #include "ser_nodes.h"
32 
META_BEGIN_NAMESPACE()33 META_BEGIN_NAMESPACE()
34 namespace Serialization {
35 
36 class Importer : public IntroduceInterfaces<BaseObject, IImporter, IImportFunctions, IResourceConsumer> {
37     META_OBJECT(Importer, ClassId::Importer, IntroduceInterfaces)
38 public:
39     Importer() : registry_(GetObjectRegistry()), globalData_(registry_.GetGlobalSerializationData()) {}
40     explicit Importer(IObjectRegistry& reg, IGlobalSerializationData& data) : registry_(reg), globalData_(data) {}
41 
42     IObject::Ptr Import(const ISerNode::ConstPtr& tree) override;
43     BASE_NS::unordered_map<InstanceId, InstanceId> GetInstanceIdMapping() const override;
44     void SetResourceManager(CORE_NS::IResourceManager::Ptr p) override;
45     void SetUserContext(IObject::Ptr) override;
46 
47     ReturnError ImportValue(const ISerNode::ConstPtr& n, IAny& entity);
48     IAny::Ptr ImportAny(const ISerNode::ConstPtr& n);
49     IObject::Ptr ImportRef(const RefUri& ref);
50 
51     ReturnError ImportFromNode(const ISerNode::ConstPtr&, IAny& entity) override;
52     ReturnError AutoImportObject(const IMapNode& members, IObject::Ptr object);
53 
54     void MapInstance(const InstanceId& iid, const IObject::ConstPtr& object);
55 
56     CORE_NS::IResourceManager::Ptr GetResourceManager() const override
57     {
58         return resources_;
59     }
60     IObject::Ptr GetUserContext() const
61     {
62         return userContext_;
63     }
64     SerMetadata GetMetadata() const override
65     {
66         return metadata_;
67     }
68 
69 private:
70     InstanceId ConvertInstanceId(const InstanceId& id) const;
71     IObject::Ptr GetReferencedObject(const InstanceId& uid) const;
72 
73     IObject::Ptr ImportObject(const ISerNode::ConstPtr& n);
74     IObject::Ptr ImportObject(const IObjectNode::ConstPtr& node, IObject::Ptr object);
75     ReturnError ImportAny(const IObjectNode::ConstPtr& n, const IAny::Ptr& any);
76     ReturnError ImportBuiltinValue(const ISerNode::ConstPtr& n, IAny& entity);
77     ReturnError ImportPointer(const ISerNode::ConstPtr& n, IAny& entity);
78 
79     ReturnError ImportArray(const ISerNode::ConstPtr& n, IArrayAny& array);
80     ReturnError ImportIAttach(const ISerNode::ConstPtr& node, const IObject::Ptr& owner, IAttach& cont);
81     ReturnError ImportIContainer(const ISerNode::ConstPtr& node, IContainer& cont);
82     ReturnError ImportIObjectFlags(const ISerNode::ConstPtr& node, IObjectFlags& flags);
83 
84     ReturnError AutoImportObject(const ISerNode::ConstPtr& node, IObject::Ptr object);
85     IObject::Ptr ResolveRefUri(const RefUri& uri) override;
86     ReturnError ImportWeakPtrInAny(const ISerNode::ConstPtr& node, const IAny::Ptr& any);
87 
88     bool IsRegisteredObjectType(const ObjectId& oid) const;
89     bool IsRegisteredObjectOrPropertyType(const ObjectId& oid) const;
90 
91 private:
92     IObjectRegistry& registry_;
93     IGlobalSerializationData& globalData_;
94     BASE_NS::unordered_map<InstanceId, InstanceId> mapInstanceIds_;
95     BASE_NS::vector<IImportFinalize::Ptr> finalizes_;
96 
97     struct DeferredUriResolve {
98         IAny::Ptr target;
99         RefUri uri;
100     };
101     BASE_NS::vector<DeferredUriResolve> deferred_;
102     CORE_NS::IResourceManager::Ptr resources_;
103     IObject::Ptr userContext_;
104     SerMetadata metadata_;
105 };
106 
107 class ImportContext : public IntroduceInterfaces<IImportContext> {
108 public:
109     ImportContext(
110         Importer& imp, const BASE_NS::string& name, IObject::Ptr p, const InstanceId& id, IMapNode::ConstPtr node)
111         : importer_(imp), object_(BASE_NS::move(p)), iid_(id), node_(BASE_NS::move(node)), name_(name)
112     {}
113 
114     bool HasMember(BASE_NS::string_view name) const override;
115     ReturnError Import(BASE_NS::string_view name, IAny& entity) override;
116     ReturnError ImportAny(BASE_NS::string_view name, IAny::Ptr& any) override;
117     ReturnError ImportWeakPtr(BASE_NS::string_view name, IObject::WeakPtr& ptr) override;
118     ReturnError AutoImport() override;
119 
120     IObject::Ptr ResolveRefUri(const RefUri& uri) override;
121 
122     ReturnError ImportFromNode(const ISerNode::ConstPtr&, IAny& entity) override;
123 
124     CORE_NS::IInterface* Context() const override;
125     IObject::Ptr UserContext() const override;
126     ReturnError SubstituteThis(IObject::Ptr) override;
127 
128     BASE_NS::string GetName() const override;
129     SerMetadata GetMetadata() const override;
130 
131     IObject::Ptr GetObject() const
132     {
133         return object_;
134     }
135 
136 private:
137     Importer& importer_;
138     IObject::Ptr object_;
139     InstanceId iid_;
140     IMapNode::ConstPtr node_;
141     BASE_NS::string name_;
142 };
143 
144 } // namespace Serialization
145 META_END_NAMESPACE()
146 
147 #endif
148