1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h"
17ca0551cfSopenharmony_ci
18ca0551cfSopenharmony_cinamespace OHOS {
19ca0551cfSopenharmony_cinamespace Idl {
20ca0551cfSopenharmony_civoid MetadataSerializer::Serialize()
21ca0551cfSopenharmony_ci{
22ca0551cfSopenharmony_ci    SerializeMetaComponent(metaComponent_);
23ca0551cfSopenharmony_ci}
24ca0551cfSopenharmony_ci
25ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaComponent(MetaComponent* mc)
26ca0551cfSopenharmony_ci{
27ca0551cfSopenharmony_ci    if (mc == nullptr) {
28ca0551cfSopenharmony_ci        return;
29ca0551cfSopenharmony_ci    }
30ca0551cfSopenharmony_ci    mc->name_ = reinterpret_cast<char*>(SerializeAdjust(mc->name_));
31ca0551cfSopenharmony_ci
32ca0551cfSopenharmony_ci    for (int i = 0; i < mc->namespaceNumber_; i++) {
33ca0551cfSopenharmony_ci        MetaNamespace* mn = mc->namespaces_[i];
34ca0551cfSopenharmony_ci        SerializeMetaNamespace(mn);
35ca0551cfSopenharmony_ci        mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(mn));
36ca0551cfSopenharmony_ci    }
37ca0551cfSopenharmony_ci    mc->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mc->namespaces_));
38ca0551cfSopenharmony_ci
39ca0551cfSopenharmony_ci    for (int i = 0; i < mc->sequenceableNumber_; i++) {
40ca0551cfSopenharmony_ci        MetaSequenceable* mp = mc->sequenceables_[i];
41ca0551cfSopenharmony_ci        SerializeMetaSequenceable(mp);
42ca0551cfSopenharmony_ci        mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(SerializeAdjust(mp));
43ca0551cfSopenharmony_ci    }
44ca0551cfSopenharmony_ci    mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(SerializeAdjust(mc->sequenceables_));
45ca0551cfSopenharmony_ci
46ca0551cfSopenharmony_ci    for (int i = 0; i < mc->interfaceNumber_; i++) {
47ca0551cfSopenharmony_ci        MetaInterface* mi = mc->interfaces_[i];
48ca0551cfSopenharmony_ci        SerializeMetaInterface(mi);
49ca0551cfSopenharmony_ci        mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(SerializeAdjust(mi));
50ca0551cfSopenharmony_ci    }
51ca0551cfSopenharmony_ci    mc->interfaces_ = reinterpret_cast<MetaInterface**>(SerializeAdjust(mc->interfaces_));
52ca0551cfSopenharmony_ci
53ca0551cfSopenharmony_ci    for (int i = 0; i < mc->typeNumber_; i++) {
54ca0551cfSopenharmony_ci        MetaType* mt = mc->types_[i];
55ca0551cfSopenharmony_ci        SerializeMetaType(mt);
56ca0551cfSopenharmony_ci        mc->types_[i] = reinterpret_cast<MetaType*>(SerializeAdjust(mt));
57ca0551cfSopenharmony_ci    }
58ca0551cfSopenharmony_ci    mc->types_ = reinterpret_cast<MetaType**>(SerializeAdjust(mc->types_));
59ca0551cfSopenharmony_ci
60ca0551cfSopenharmony_ci    mc->stringPool_ = reinterpret_cast<char*>(SerializeAdjust(mc->stringPool_));
61ca0551cfSopenharmony_ci}
62ca0551cfSopenharmony_ci
63ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaNamespace(MetaNamespace* mn)
64ca0551cfSopenharmony_ci{
65ca0551cfSopenharmony_ci    if (mn == nullptr) {
66ca0551cfSopenharmony_ci        return;
67ca0551cfSopenharmony_ci    }
68ca0551cfSopenharmony_ci    mn->name_ = reinterpret_cast<char*>(SerializeAdjust(mn->name_));
69ca0551cfSopenharmony_ci    mn->sequenceableIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->sequenceableIndexes_));
70ca0551cfSopenharmony_ci    mn->interfaceIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->interfaceIndexes_));
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_ci    for (int i = 0; i < mn->namespaceNumber_; i++) {
73ca0551cfSopenharmony_ci        MetaNamespace* innermn = mn->namespaces_[i];
74ca0551cfSopenharmony_ci        SerializeMetaNamespace(innermn);
75ca0551cfSopenharmony_ci        mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(innermn));
76ca0551cfSopenharmony_ci    }
77ca0551cfSopenharmony_ci    mn->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mn->namespaces_));
78ca0551cfSopenharmony_ci}
79ca0551cfSopenharmony_ci
80ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaSequenceable(MetaSequenceable* mp)
81ca0551cfSopenharmony_ci{
82ca0551cfSopenharmony_ci    if (mp == nullptr) {
83ca0551cfSopenharmony_ci        return;
84ca0551cfSopenharmony_ci    }
85ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_));
86ca0551cfSopenharmony_ci    mp->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mp->namespace_));
87ca0551cfSopenharmony_ci}
88ca0551cfSopenharmony_ci
89ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaInterface(MetaInterface* mi)
90ca0551cfSopenharmony_ci{
91ca0551cfSopenharmony_ci    if (mi == nullptr) {
92ca0551cfSopenharmony_ci        return;
93ca0551cfSopenharmony_ci    }
94ca0551cfSopenharmony_ci    mi->license_ = reinterpret_cast<char*>(SerializeAdjust(mi->license_));
95ca0551cfSopenharmony_ci    mi->name_ = reinterpret_cast<char*>(SerializeAdjust(mi->name_));
96ca0551cfSopenharmony_ci    mi->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mi->namespace_));
97ca0551cfSopenharmony_ci
98ca0551cfSopenharmony_ci    for (int i = 0; i < mi->methodNumber_; i++) {
99ca0551cfSopenharmony_ci        MetaMethod* mm = mi->methods_[i];
100ca0551cfSopenharmony_ci        SerializeMetaMethod(mm);
101ca0551cfSopenharmony_ci        mi->methods_[i] = reinterpret_cast<MetaMethod*>(SerializeAdjust(mm));
102ca0551cfSopenharmony_ci    }
103ca0551cfSopenharmony_ci    mi->methods_ = reinterpret_cast<MetaMethod**>(SerializeAdjust(mi->methods_));
104ca0551cfSopenharmony_ci}
105ca0551cfSopenharmony_ci
106ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaMethod(MetaMethod* mm)
107ca0551cfSopenharmony_ci{
108ca0551cfSopenharmony_ci    if (mm == nullptr) {
109ca0551cfSopenharmony_ci        return;
110ca0551cfSopenharmony_ci    }
111ca0551cfSopenharmony_ci    mm->name_ = reinterpret_cast<char*>(SerializeAdjust(mm->name_));
112ca0551cfSopenharmony_ci    mm->signature_ = reinterpret_cast<char*>(SerializeAdjust(mm->signature_));
113ca0551cfSopenharmony_ci
114ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
115ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
116ca0551cfSopenharmony_ci        SerializeMetaParameter(mp);
117ca0551cfSopenharmony_ci        mm->parameters_[i] = reinterpret_cast<MetaParameter*>(SerializeAdjust(mp));
118ca0551cfSopenharmony_ci    }
119ca0551cfSopenharmony_ci    mm->parameters_ = reinterpret_cast<MetaParameter**>(SerializeAdjust(mm->parameters_));
120ca0551cfSopenharmony_ci}
121ca0551cfSopenharmony_ci
122ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaParameter(MetaParameter* mp)
123ca0551cfSopenharmony_ci{
124ca0551cfSopenharmony_ci    if (mp == nullptr) {
125ca0551cfSopenharmony_ci        return;
126ca0551cfSopenharmony_ci    }
127ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_));
128ca0551cfSopenharmony_ci}
129ca0551cfSopenharmony_ci
130ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaType(MetaType* mt)
131ca0551cfSopenharmony_ci{
132ca0551cfSopenharmony_ci    if (mt == nullptr) {
133ca0551cfSopenharmony_ci        return;
134ca0551cfSopenharmony_ci    }
135ca0551cfSopenharmony_ci    mt->nestedTypeIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mt->nestedTypeIndexes_));
136ca0551cfSopenharmony_ci}
137ca0551cfSopenharmony_ci
138ca0551cfSopenharmony_ciptrdiff_t MetadataSerializer::SerializeAdjust(const void* addr)
139ca0551cfSopenharmony_ci{
140ca0551cfSopenharmony_ci    return reinterpret_cast<uintptr_t>(addr) - baseAddr_;
141ca0551cfSopenharmony_ci}
142ca0551cfSopenharmony_ci
143ca0551cfSopenharmony_civoid MetadataSerializer::Deserialize()
144ca0551cfSopenharmony_ci{
145ca0551cfSopenharmony_ci    DeserializeMetaComponent(metaComponent_);
146ca0551cfSopenharmony_ci}
147ca0551cfSopenharmony_ci
148ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaComponent(MetaComponent* mc)
149ca0551cfSopenharmony_ci{
150ca0551cfSopenharmony_ci    if (mc == nullptr) {
151ca0551cfSopenharmony_ci        return;
152ca0551cfSopenharmony_ci    }
153ca0551cfSopenharmony_ci    mc->name_ = reinterpret_cast<char*>(DeserializeAdjust(mc->name_));
154ca0551cfSopenharmony_ci
155ca0551cfSopenharmony_ci    mc->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mc->namespaces_));
156ca0551cfSopenharmony_ci    for (int i = 0; i < mc->namespaceNumber_; i++) {
157ca0551cfSopenharmony_ci        mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mc->namespaces_[i]));
158ca0551cfSopenharmony_ci        MetaNamespace* mn = mc->namespaces_[i];
159ca0551cfSopenharmony_ci        DeserializeMetaNamespace(mn);
160ca0551cfSopenharmony_ci    }
161ca0551cfSopenharmony_ci
162ca0551cfSopenharmony_ci    mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(DeserializeAdjust(mc->sequenceables_));
163ca0551cfSopenharmony_ci    for (int i = 0; i < mc->sequenceableNumber_; i++) {
164ca0551cfSopenharmony_ci        mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(DeserializeAdjust(mc->sequenceables_[i]));
165ca0551cfSopenharmony_ci        MetaSequenceable* mp = mc->sequenceables_[i];
166ca0551cfSopenharmony_ci        DeserializeMetaSequenceable(mp);
167ca0551cfSopenharmony_ci    }
168ca0551cfSopenharmony_ci
169ca0551cfSopenharmony_ci    mc->interfaces_ = reinterpret_cast<MetaInterface**>(DeserializeAdjust(mc->interfaces_));
170ca0551cfSopenharmony_ci    for (int i = 0; i < mc->interfaceNumber_; i++) {
171ca0551cfSopenharmony_ci        mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(DeserializeAdjust(mc->interfaces_[i]));
172ca0551cfSopenharmony_ci        MetaInterface* mi = mc->interfaces_[i];
173ca0551cfSopenharmony_ci        DeserializeMetaInterface(mi);
174ca0551cfSopenharmony_ci    }
175ca0551cfSopenharmony_ci
176ca0551cfSopenharmony_ci    mc->types_ = reinterpret_cast<MetaType**>(DeserializeAdjust(mc->types_));
177ca0551cfSopenharmony_ci    for (int i = 0; i < mc->typeNumber_; i++) {
178ca0551cfSopenharmony_ci        mc->types_[i] = reinterpret_cast<MetaType*>(DeserializeAdjust(mc->types_[i]));
179ca0551cfSopenharmony_ci        MetaType* mt = mc->types_[i];
180ca0551cfSopenharmony_ci        DeserializeMetaType(mt);
181ca0551cfSopenharmony_ci    }
182ca0551cfSopenharmony_ci
183ca0551cfSopenharmony_ci    mc->stringPool_ = reinterpret_cast<char*>(DeserializeAdjust(mc->stringPool_));
184ca0551cfSopenharmony_ci}
185ca0551cfSopenharmony_ci
186ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaNamespace(MetaNamespace* mn)
187ca0551cfSopenharmony_ci{
188ca0551cfSopenharmony_ci    if (mn == nullptr) {
189ca0551cfSopenharmony_ci        return;
190ca0551cfSopenharmony_ci    }
191ca0551cfSopenharmony_ci    mn->name_ = reinterpret_cast<char*>(DeserializeAdjust(mn->name_));
192ca0551cfSopenharmony_ci    mn->sequenceableIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->sequenceableIndexes_));
193ca0551cfSopenharmony_ci    mn->interfaceIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->interfaceIndexes_));
194ca0551cfSopenharmony_ci
195ca0551cfSopenharmony_ci    mn->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mn->namespaces_));
196ca0551cfSopenharmony_ci    for (int i = 0; i < mn->namespaceNumber_; i++) {
197ca0551cfSopenharmony_ci        mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mn->namespaces_[i]));
198ca0551cfSopenharmony_ci        MetaNamespace* innermn = mn->namespaces_[i];
199ca0551cfSopenharmony_ci        DeserializeMetaNamespace(innermn);
200ca0551cfSopenharmony_ci    }
201ca0551cfSopenharmony_ci}
202ca0551cfSopenharmony_ci
203ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaSequenceable(MetaSequenceable* mp)
204ca0551cfSopenharmony_ci{
205ca0551cfSopenharmony_ci    if (mp == nullptr) {
206ca0551cfSopenharmony_ci        return;
207ca0551cfSopenharmony_ci    }
208ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_));
209ca0551cfSopenharmony_ci    mp->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mp->namespace_));
210ca0551cfSopenharmony_ci}
211ca0551cfSopenharmony_ci
212ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaInterface(MetaInterface* mi)
213ca0551cfSopenharmony_ci{
214ca0551cfSopenharmony_ci    if (mi == nullptr) {
215ca0551cfSopenharmony_ci        return;
216ca0551cfSopenharmony_ci    }
217ca0551cfSopenharmony_ci    mi->license_ = reinterpret_cast<char*>(DeserializeAdjust(mi->license_));
218ca0551cfSopenharmony_ci    mi->name_ = reinterpret_cast<char*>(DeserializeAdjust(mi->name_));
219ca0551cfSopenharmony_ci    mi->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mi->namespace_));
220ca0551cfSopenharmony_ci
221ca0551cfSopenharmony_ci    mi->methods_ = reinterpret_cast<MetaMethod**>(DeserializeAdjust(mi->methods_));
222ca0551cfSopenharmony_ci    for (int i = 0; i < mi->methodNumber_; i++) {
223ca0551cfSopenharmony_ci        mi->methods_[i] = reinterpret_cast<MetaMethod*>(DeserializeAdjust(mi->methods_[i]));
224ca0551cfSopenharmony_ci        MetaMethod* mm = mi->methods_[i];
225ca0551cfSopenharmony_ci        DeserializeMetaMethod(mm);
226ca0551cfSopenharmony_ci    }
227ca0551cfSopenharmony_ci}
228ca0551cfSopenharmony_ci
229ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaMethod(MetaMethod* mm)
230ca0551cfSopenharmony_ci{
231ca0551cfSopenharmony_ci    if (mm == nullptr) {
232ca0551cfSopenharmony_ci        return;
233ca0551cfSopenharmony_ci    }
234ca0551cfSopenharmony_ci    mm->name_ = reinterpret_cast<char*>(DeserializeAdjust(mm->name_));
235ca0551cfSopenharmony_ci    mm->signature_ = reinterpret_cast<char*>(DeserializeAdjust(mm->signature_));
236ca0551cfSopenharmony_ci
237ca0551cfSopenharmony_ci    mm->parameters_ = reinterpret_cast<MetaParameter**>(DeserializeAdjust(mm->parameters_));
238ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
239ca0551cfSopenharmony_ci        mm->parameters_[i] = reinterpret_cast<MetaParameter*>(DeserializeAdjust(mm->parameters_[i]));
240ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
241ca0551cfSopenharmony_ci        DeserializeMetaParameter(mp);
242ca0551cfSopenharmony_ci    }
243ca0551cfSopenharmony_ci}
244ca0551cfSopenharmony_ci
245ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaParameter(MetaParameter* mp)
246ca0551cfSopenharmony_ci{
247ca0551cfSopenharmony_ci    if (mp == nullptr) {
248ca0551cfSopenharmony_ci        return;
249ca0551cfSopenharmony_ci    }
250ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_));
251ca0551cfSopenharmony_ci}
252ca0551cfSopenharmony_ci
253ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaType(MetaType* mt)
254ca0551cfSopenharmony_ci{
255ca0551cfSopenharmony_ci    if (mt == nullptr) {
256ca0551cfSopenharmony_ci        return;
257ca0551cfSopenharmony_ci    }
258ca0551cfSopenharmony_ci    mt->nestedTypeIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mt->nestedTypeIndexes_));
259ca0551cfSopenharmony_ci}
260ca0551cfSopenharmony_ci
261ca0551cfSopenharmony_ciuintptr_t MetadataSerializer::DeserializeAdjust(const void* addr)
262ca0551cfSopenharmony_ci{
263ca0551cfSopenharmony_ci    return reinterpret_cast<ptrdiff_t>(addr) + baseAddr_;
264ca0551cfSopenharmony_ci}
265ca0551cfSopenharmony_ci} // namespace Idl
266ca0551cfSopenharmony_ci} // namespace OHOS
267