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