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