18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#ifndef META_SRC_SERIALIZATION_EXPORTER_H 178bf80f4bSopenharmony_ci#define META_SRC_SERIALIZATION_EXPORTER_H 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <base/containers/unordered_map.h> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <meta/ext/minimal_object.h> 228bf80f4bSopenharmony_ci#include <meta/interface/intf_container.h> 238bf80f4bSopenharmony_ci#include <meta/interface/intf_metadata.h> 248bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h> 258bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_export_context.h> 268bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_exporter.h> 278bf80f4bSopenharmony_ci#include <meta/interface/serialization/intf_global_serialization_data.h> 288bf80f4bSopenharmony_ci 298bf80f4bSopenharmony_ci#include "../base_object.h" 308bf80f4bSopenharmony_ci#include "ser_nodes.h" 318bf80f4bSopenharmony_ci 328bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 338bf80f4bSopenharmony_cinamespace Serialization { 348bf80f4bSopenharmony_ci 358bf80f4bSopenharmony_ciconstexpr Version EXPORTER_VERSION { 1, 0 }; 368bf80f4bSopenharmony_ci 378bf80f4bSopenharmony_ciclass Exporter : public Internal::BaseObjectFwd<Exporter, ClassId::Exporter, IExporter, IExportFunctions> { 388bf80f4bSopenharmony_cipublic: 398bf80f4bSopenharmony_ci Exporter() : registry_(GetObjectRegistry()), globalData_(registry_.GetGlobalSerializationData()) {} 408bf80f4bSopenharmony_ci explicit Exporter(IObjectRegistry& reg, IGlobalSerializationData& data) : registry_(reg), globalData_(data) {} 418bf80f4bSopenharmony_ci 428bf80f4bSopenharmony_ci ISerNode::Ptr Export(const IObject::ConstPtr& object) override; 438bf80f4bSopenharmony_ci 448bf80f4bSopenharmony_ci ReturnError ExportValue(const IAny& entity, ISerNode::Ptr&); 458bf80f4bSopenharmony_ci ReturnError ExportAny(const IAny::ConstPtr& any, ISerNode::Ptr&); 468bf80f4bSopenharmony_ci ReturnError ExportWeakPtr(const IObject::ConstWeakPtr& ptr, ISerNode::Ptr&); 478bf80f4bSopenharmony_ci 488bf80f4bSopenharmony_ci ReturnError ExportToNode(const IAny& entity, ISerNode::Ptr&) override; 498bf80f4bSopenharmony_ci ReturnError AutoExportObjectMembers(const IObject::ConstPtr& object, BASE_NS::vector<NamedNode>& members); 508bf80f4bSopenharmony_ci 518bf80f4bSopenharmony_ciprivate: 528bf80f4bSopenharmony_ci bool ShouldSerialize(const IObject::ConstPtr& object) const; 538bf80f4bSopenharmony_ci bool ShouldSerialize(const IAny& any) const; 548bf80f4bSopenharmony_ci InstanceId ConvertInstanceId(const InstanceId& id) const; 558bf80f4bSopenharmony_ci bool MarkExported(const IObject::ConstPtr& object); 568bf80f4bSopenharmony_ci bool HasBeenExported(const InstanceId& id) const; 578bf80f4bSopenharmony_ci 588bf80f4bSopenharmony_ci ReturnError ExportObject(const IObject::ConstPtr& object, ISerNode::Ptr&); 598bf80f4bSopenharmony_ci ReturnError ExportPointer(const IAny& entity, ISerNode::Ptr&); 608bf80f4bSopenharmony_ci ISerNode::Ptr ExportBuiltinValue(const IAny& value); 618bf80f4bSopenharmony_ci ISerNode::Ptr ExportArray(const IArrayAny& array); 628bf80f4bSopenharmony_ci 638bf80f4bSopenharmony_ci ISerNode::Ptr CreateObjectNode(const IObject::ConstPtr& object, BASE_NS::shared_ptr<MapNode> node); 648bf80f4bSopenharmony_ci ISerNode::Ptr CreateObjectRefNode(const RefUri& ref); 658bf80f4bSopenharmony_ci ISerNode::Ptr CreateObjectRefNode(const IObject::ConstPtr& object); 668bf80f4bSopenharmony_ci ISerNode::Ptr AutoExportObject(const IObject::ConstPtr& object); 678bf80f4bSopenharmony_ci IObject::Ptr ResolveUriSegment(const IObject::ConstPtr& ptr, RefUri& uri) const; 688bf80f4bSopenharmony_ci 698bf80f4bSopenharmony_ci BASE_NS::vector<NamedNode> ExportIMetadata(const IMetadata& data); 708bf80f4bSopenharmony_ci ISerNode::Ptr ExportIContainer(const IContainer& cont); 718bf80f4bSopenharmony_ci 728bf80f4bSopenharmony_ciprivate: 738bf80f4bSopenharmony_ci IObjectRegistry& registry_; 748bf80f4bSopenharmony_ci IGlobalSerializationData& globalData_; 758bf80f4bSopenharmony_ci BASE_NS::unordered_map<InstanceId, IObject::ConstWeakPtr> exported_; 768bf80f4bSopenharmony_ci BASE_NS::unordered_map<InstanceId, InstanceId> mapInstanceIds_; 778bf80f4bSopenharmony_ci}; 788bf80f4bSopenharmony_ci 798bf80f4bSopenharmony_ciclass ExportContext : public IntroduceInterfaces<IExportContext> { 808bf80f4bSopenharmony_cipublic: 818bf80f4bSopenharmony_ci ExportContext(Exporter& exp, const IObject::ConstPtr& p) : exporter_(exp), object_(p) {} 828bf80f4bSopenharmony_ci 838bf80f4bSopenharmony_ci BASE_NS::shared_ptr<MapNode> ExtractNode(); 848bf80f4bSopenharmony_ci 858bf80f4bSopenharmony_ci ReturnError Export(BASE_NS::string_view name, const IAny& entity) override; 868bf80f4bSopenharmony_ci ReturnError ExportAny(BASE_NS::string_view name, const IAny::Ptr& any) override; 878bf80f4bSopenharmony_ci ReturnError ExportWeakPtr(BASE_NS::string_view name, const IObject::ConstWeakPtr& ptr) override; 888bf80f4bSopenharmony_ci ReturnError AutoExport() override; 898bf80f4bSopenharmony_ci 908bf80f4bSopenharmony_ci ReturnError ExportToNode(const IAny& entity, ISerNode::Ptr&) override; 918bf80f4bSopenharmony_ci 928bf80f4bSopenharmony_ciprivate: 938bf80f4bSopenharmony_ci Exporter& exporter_; 948bf80f4bSopenharmony_ci IObject::ConstPtr object_; 958bf80f4bSopenharmony_ci BASE_NS::vector<NamedNode> elements_; 968bf80f4bSopenharmony_ci}; 978bf80f4bSopenharmony_ci 988bf80f4bSopenharmony_ci} // namespace Serialization 998bf80f4bSopenharmony_ciMETA_END_NAMESPACE() 1008bf80f4bSopenharmony_ci 1018bf80f4bSopenharmony_ci#endif 102