1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2022 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
17ca0551cfSopenharmony_ci#include <climits>
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h"
20ca0551cfSopenharmony_ci
21ca0551cfSopenharmony_cinamespace OHOS {
22ca0551cfSopenharmony_cinamespace Idl {
23ca0551cfSopenharmony_civoid MetadataSerializer::Serialize()
24ca0551cfSopenharmony_ci{
25ca0551cfSopenharmony_ci    SerializeMetaComponent(metaComponent_);
26ca0551cfSopenharmony_ci}
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaComponent(MetaComponent* mc)
29ca0551cfSopenharmony_ci{
30ca0551cfSopenharmony_ci    if (mc == nullptr) {
31ca0551cfSopenharmony_ci        return;
32ca0551cfSopenharmony_ci    }
33ca0551cfSopenharmony_ci    mc->name_ = reinterpret_cast<char*>(SerializeAdjust(mc->name_));
34ca0551cfSopenharmony_ci
35ca0551cfSopenharmony_ci    for (int i = 0; i < mc->namespaceNumber_; i++) {
36ca0551cfSopenharmony_ci        MetaNamespace* mn = mc->namespaces_[i];
37ca0551cfSopenharmony_ci        SerializeMetaNamespace(mn);
38ca0551cfSopenharmony_ci        mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(mn));
39ca0551cfSopenharmony_ci    }
40ca0551cfSopenharmony_ci    mc->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mc->namespaces_));
41ca0551cfSopenharmony_ci
42ca0551cfSopenharmony_ci    for (int i = 0; i < mc->sequenceableNumber_; i++) {
43ca0551cfSopenharmony_ci        MetaSequenceable* mp = mc->sequenceables_[i];
44ca0551cfSopenharmony_ci        SerializeMetaSequenceable(mp);
45ca0551cfSopenharmony_ci        mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(SerializeAdjust(mp));
46ca0551cfSopenharmony_ci    }
47ca0551cfSopenharmony_ci    mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(SerializeAdjust(mc->sequenceables_));
48ca0551cfSopenharmony_ci
49ca0551cfSopenharmony_ci    for (int i = 0; i < mc->interfaceNumber_; i++) {
50ca0551cfSopenharmony_ci        MetaInterface* mi = mc->interfaces_[i];
51ca0551cfSopenharmony_ci        SerializeMetaInterface(mi);
52ca0551cfSopenharmony_ci        mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(SerializeAdjust(mi));
53ca0551cfSopenharmony_ci    }
54ca0551cfSopenharmony_ci    mc->interfaces_ = reinterpret_cast<MetaInterface**>(SerializeAdjust(mc->interfaces_));
55ca0551cfSopenharmony_ci
56ca0551cfSopenharmony_ci    for (int i = 0; i < mc->typeNumber_; i++) {
57ca0551cfSopenharmony_ci        MetaType* mt = mc->types_[i];
58ca0551cfSopenharmony_ci        SerializeMetaType(mt);
59ca0551cfSopenharmony_ci        mc->types_[i] = reinterpret_cast<MetaType*>(SerializeAdjust(mt));
60ca0551cfSopenharmony_ci    }
61ca0551cfSopenharmony_ci    mc->types_ = reinterpret_cast<MetaType**>(SerializeAdjust(mc->types_));
62ca0551cfSopenharmony_ci
63ca0551cfSopenharmony_ci    mc->stringPool_ = reinterpret_cast<char*>(SerializeAdjust(mc->stringPool_));
64ca0551cfSopenharmony_ci}
65ca0551cfSopenharmony_ci
66ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaNamespace(MetaNamespace* mn)
67ca0551cfSopenharmony_ci{
68ca0551cfSopenharmony_ci    if (mn == nullptr) {
69ca0551cfSopenharmony_ci        return;
70ca0551cfSopenharmony_ci    }
71ca0551cfSopenharmony_ci    mn->name_ = reinterpret_cast<char*>(SerializeAdjust(mn->name_));
72ca0551cfSopenharmony_ci    mn->sequenceableIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->sequenceableIndexes_));
73ca0551cfSopenharmony_ci    mn->interfaceIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mn->interfaceIndexes_));
74ca0551cfSopenharmony_ci
75ca0551cfSopenharmony_ci    for (int i = 0; i < mn->namespaceNumber_; i++) {
76ca0551cfSopenharmony_ci        MetaNamespace* innermn = mn->namespaces_[i];
77ca0551cfSopenharmony_ci        SerializeMetaNamespace(innermn);
78ca0551cfSopenharmony_ci        mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(SerializeAdjust(innermn));
79ca0551cfSopenharmony_ci    }
80ca0551cfSopenharmony_ci    mn->namespaces_ = reinterpret_cast<MetaNamespace**>(SerializeAdjust(mn->namespaces_));
81ca0551cfSopenharmony_ci}
82ca0551cfSopenharmony_ci
83ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaSequenceable(MetaSequenceable* mp)
84ca0551cfSopenharmony_ci{
85ca0551cfSopenharmony_ci    if (mp == nullptr) {
86ca0551cfSopenharmony_ci        return;
87ca0551cfSopenharmony_ci    }
88ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_));
89ca0551cfSopenharmony_ci    mp->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mp->namespace_));
90ca0551cfSopenharmony_ci}
91ca0551cfSopenharmony_ci
92ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaInterface(MetaInterface* mi)
93ca0551cfSopenharmony_ci{
94ca0551cfSopenharmony_ci    if (mi == nullptr) {
95ca0551cfSopenharmony_ci        return;
96ca0551cfSopenharmony_ci    }
97ca0551cfSopenharmony_ci    mi->license_ = reinterpret_cast<char*>(SerializeAdjust(mi->license_));
98ca0551cfSopenharmony_ci    mi->name_ = reinterpret_cast<char*>(SerializeAdjust(mi->name_));
99ca0551cfSopenharmony_ci    mi->namespace_ = reinterpret_cast<char*>(SerializeAdjust(mi->namespace_));
100ca0551cfSopenharmony_ci
101ca0551cfSopenharmony_ci    for (int i = 0; i < mi->methodNumber_; i++) {
102ca0551cfSopenharmony_ci        MetaMethod* mm = mi->methods_[i];
103ca0551cfSopenharmony_ci        SerializeMetaMethod(mm);
104ca0551cfSopenharmony_ci        mi->methods_[i] = reinterpret_cast<MetaMethod*>(SerializeAdjust(mm));
105ca0551cfSopenharmony_ci    }
106ca0551cfSopenharmony_ci    mi->methods_ = reinterpret_cast<MetaMethod**>(SerializeAdjust(mi->methods_));
107ca0551cfSopenharmony_ci}
108ca0551cfSopenharmony_ci
109ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaMethod(MetaMethod* mm)
110ca0551cfSopenharmony_ci{
111ca0551cfSopenharmony_ci    if (mm == nullptr) {
112ca0551cfSopenharmony_ci        return;
113ca0551cfSopenharmony_ci    }
114ca0551cfSopenharmony_ci    mm->name_ = reinterpret_cast<char*>(SerializeAdjust(mm->name_));
115ca0551cfSopenharmony_ci    mm->signature_ = reinterpret_cast<char*>(SerializeAdjust(mm->signature_));
116ca0551cfSopenharmony_ci
117ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
118ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
119ca0551cfSopenharmony_ci        SerializeMetaParameter(mp);
120ca0551cfSopenharmony_ci        mm->parameters_[i] = reinterpret_cast<MetaParameter*>(SerializeAdjust(mp));
121ca0551cfSopenharmony_ci    }
122ca0551cfSopenharmony_ci    mm->parameters_ = reinterpret_cast<MetaParameter**>(SerializeAdjust(mm->parameters_));
123ca0551cfSopenharmony_ci}
124ca0551cfSopenharmony_ci
125ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaParameter(MetaParameter* mp)
126ca0551cfSopenharmony_ci{
127ca0551cfSopenharmony_ci    if (mp == nullptr) {
128ca0551cfSopenharmony_ci        return;
129ca0551cfSopenharmony_ci    }
130ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(SerializeAdjust(mp->name_));
131ca0551cfSopenharmony_ci}
132ca0551cfSopenharmony_ci
133ca0551cfSopenharmony_civoid MetadataSerializer::SerializeMetaType(MetaType* mt)
134ca0551cfSopenharmony_ci{
135ca0551cfSopenharmony_ci    if (mt == nullptr) {
136ca0551cfSopenharmony_ci        return;
137ca0551cfSopenharmony_ci    }
138ca0551cfSopenharmony_ci    mt->nestedTypeIndexes_ = reinterpret_cast<int*>(SerializeAdjust(mt->nestedTypeIndexes_));
139ca0551cfSopenharmony_ci}
140ca0551cfSopenharmony_ci
141ca0551cfSopenharmony_ciptrdiff_t MetadataSerializer::SerializeAdjust(const void* addr)
142ca0551cfSopenharmony_ci{
143ca0551cfSopenharmony_ci    return reinterpret_cast<uintptr_t>(addr) - baseAddr_;
144ca0551cfSopenharmony_ci}
145ca0551cfSopenharmony_ci
146ca0551cfSopenharmony_civoid MetadataSerializer::Deserialize()
147ca0551cfSopenharmony_ci{
148ca0551cfSopenharmony_ci    DeserializeMetaComponent(metaComponent_);
149ca0551cfSopenharmony_ci}
150ca0551cfSopenharmony_ci
151ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaComponent(MetaComponent* mc)
152ca0551cfSopenharmony_ci{
153ca0551cfSopenharmony_ci    if (mc == nullptr) {
154ca0551cfSopenharmony_ci        return;
155ca0551cfSopenharmony_ci    }
156ca0551cfSopenharmony_ci    mc->name_ = reinterpret_cast<char*>(DeserializeAdjust(mc->name_));
157ca0551cfSopenharmony_ci
158ca0551cfSopenharmony_ci    mc->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mc->namespaces_));
159ca0551cfSopenharmony_ci    if (mc->namespaceNumber_ > 0 && mc->namespaceNumber_ < INT_MAX) {
160ca0551cfSopenharmony_ci        for (int i = 0; i < mc->namespaceNumber_; i++) {
161ca0551cfSopenharmony_ci            mc->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mc->namespaces_[i]));
162ca0551cfSopenharmony_ci            MetaNamespace* mn = mc->namespaces_[i];
163ca0551cfSopenharmony_ci            DeserializeMetaNamespace(mn);
164ca0551cfSopenharmony_ci        }
165ca0551cfSopenharmony_ci    }
166ca0551cfSopenharmony_ci
167ca0551cfSopenharmony_ci    mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(DeserializeAdjust(mc->sequenceables_));
168ca0551cfSopenharmony_ci    if (mc->sequenceableNumber_ > 0 && mc->sequenceableNumber_ < INT_MAX) {
169ca0551cfSopenharmony_ci        for (int i = 0; i < mc->sequenceableNumber_; i++) {
170ca0551cfSopenharmony_ci            mc->sequenceables_[i] = reinterpret_cast<MetaSequenceable*>(DeserializeAdjust(mc->sequenceables_[i]));
171ca0551cfSopenharmony_ci            MetaSequenceable* mp = mc->sequenceables_[i];
172ca0551cfSopenharmony_ci            DeserializeMetaSequenceable(mp);
173ca0551cfSopenharmony_ci        }
174ca0551cfSopenharmony_ci    }
175ca0551cfSopenharmony_ci
176ca0551cfSopenharmony_ci    mc->interfaces_ = reinterpret_cast<MetaInterface**>(DeserializeAdjust(mc->interfaces_));
177ca0551cfSopenharmony_ci    for (int i = 0; i < mc->interfaceNumber_; i++) {
178ca0551cfSopenharmony_ci        mc->interfaces_[i] = reinterpret_cast<MetaInterface*>(DeserializeAdjust(mc->interfaces_[i]));
179ca0551cfSopenharmony_ci        MetaInterface* mi = mc->interfaces_[i];
180ca0551cfSopenharmony_ci        DeserializeMetaInterface(mi);
181ca0551cfSopenharmony_ci    }
182ca0551cfSopenharmony_ci
183ca0551cfSopenharmony_ci    mc->types_ = reinterpret_cast<MetaType**>(DeserializeAdjust(mc->types_));
184ca0551cfSopenharmony_ci    for (int i = 0; i < mc->typeNumber_; i++) {
185ca0551cfSopenharmony_ci        mc->types_[i] = reinterpret_cast<MetaType*>(DeserializeAdjust(mc->types_[i]));
186ca0551cfSopenharmony_ci        MetaType* mt = mc->types_[i];
187ca0551cfSopenharmony_ci        DeserializeMetaType(mt);
188ca0551cfSopenharmony_ci    }
189ca0551cfSopenharmony_ci
190ca0551cfSopenharmony_ci    mc->stringPool_ = reinterpret_cast<char*>(DeserializeAdjust(mc->stringPool_));
191ca0551cfSopenharmony_ci}
192ca0551cfSopenharmony_ci
193ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaNamespace(MetaNamespace* mn)
194ca0551cfSopenharmony_ci{
195ca0551cfSopenharmony_ci    if (mn == nullptr) {
196ca0551cfSopenharmony_ci        return;
197ca0551cfSopenharmony_ci    }
198ca0551cfSopenharmony_ci    mn->name_ = reinterpret_cast<char*>(DeserializeAdjust(mn->name_));
199ca0551cfSopenharmony_ci    mn->sequenceableIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->sequenceableIndexes_));
200ca0551cfSopenharmony_ci    mn->interfaceIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mn->interfaceIndexes_));
201ca0551cfSopenharmony_ci
202ca0551cfSopenharmony_ci    mn->namespaces_ = reinterpret_cast<MetaNamespace**>(DeserializeAdjust(mn->namespaces_));
203ca0551cfSopenharmony_ci    if (mn->namespaceNumber_ > 0 && mn->namespaceNumber_ < INT_MAX) {
204ca0551cfSopenharmony_ci        for (int i = 0; i < mn->namespaceNumber_; i++) {
205ca0551cfSopenharmony_ci            mn->namespaces_[i] = reinterpret_cast<MetaNamespace*>(DeserializeAdjust(mn->namespaces_[i]));
206ca0551cfSopenharmony_ci            MetaNamespace* innermn = mn->namespaces_[i];
207ca0551cfSopenharmony_ci            DeserializeMetaNamespace(innermn);
208ca0551cfSopenharmony_ci        }
209ca0551cfSopenharmony_ci    }
210ca0551cfSopenharmony_ci}
211ca0551cfSopenharmony_ci
212ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaSequenceable(MetaSequenceable* mp)
213ca0551cfSopenharmony_ci{
214ca0551cfSopenharmony_ci    if (mp == nullptr) {
215ca0551cfSopenharmony_ci        return;
216ca0551cfSopenharmony_ci    }
217ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_));
218ca0551cfSopenharmony_ci    mp->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mp->namespace_));
219ca0551cfSopenharmony_ci}
220ca0551cfSopenharmony_ci
221ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaInterface(MetaInterface* mi)
222ca0551cfSopenharmony_ci{
223ca0551cfSopenharmony_ci    if (mi == nullptr) {
224ca0551cfSopenharmony_ci        return;
225ca0551cfSopenharmony_ci    }
226ca0551cfSopenharmony_ci    mi->license_ = reinterpret_cast<char*>(DeserializeAdjust(mi->license_));
227ca0551cfSopenharmony_ci    mi->name_ = reinterpret_cast<char*>(DeserializeAdjust(mi->name_));
228ca0551cfSopenharmony_ci    mi->namespace_ = reinterpret_cast<char*>(DeserializeAdjust(mi->namespace_));
229ca0551cfSopenharmony_ci
230ca0551cfSopenharmony_ci    mi->methods_ = reinterpret_cast<MetaMethod**>(DeserializeAdjust(mi->methods_));
231ca0551cfSopenharmony_ci    for (int i = 0; i < mi->methodNumber_; i++) {
232ca0551cfSopenharmony_ci        mi->methods_[i] = reinterpret_cast<MetaMethod*>(DeserializeAdjust(mi->methods_[i]));
233ca0551cfSopenharmony_ci        MetaMethod* mm = mi->methods_[i];
234ca0551cfSopenharmony_ci        DeserializeMetaMethod(mm);
235ca0551cfSopenharmony_ci    }
236ca0551cfSopenharmony_ci}
237ca0551cfSopenharmony_ci
238ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaMethod(MetaMethod* mm)
239ca0551cfSopenharmony_ci{
240ca0551cfSopenharmony_ci    if (mm == nullptr) {
241ca0551cfSopenharmony_ci        return;
242ca0551cfSopenharmony_ci    }
243ca0551cfSopenharmony_ci    mm->name_ = reinterpret_cast<char*>(DeserializeAdjust(mm->name_));
244ca0551cfSopenharmony_ci    mm->signature_ = reinterpret_cast<char*>(DeserializeAdjust(mm->signature_));
245ca0551cfSopenharmony_ci
246ca0551cfSopenharmony_ci    mm->parameters_ = reinterpret_cast<MetaParameter**>(DeserializeAdjust(mm->parameters_));
247ca0551cfSopenharmony_ci    for (int i = 0; i < mm->parameterNumber_; i++) {
248ca0551cfSopenharmony_ci        mm->parameters_[i] = reinterpret_cast<MetaParameter*>(DeserializeAdjust(mm->parameters_[i]));
249ca0551cfSopenharmony_ci        MetaParameter* mp = mm->parameters_[i];
250ca0551cfSopenharmony_ci        DeserializeMetaParameter(mp);
251ca0551cfSopenharmony_ci    }
252ca0551cfSopenharmony_ci}
253ca0551cfSopenharmony_ci
254ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaParameter(MetaParameter* mp)
255ca0551cfSopenharmony_ci{
256ca0551cfSopenharmony_ci    if (mp == nullptr) {
257ca0551cfSopenharmony_ci        return;
258ca0551cfSopenharmony_ci    }
259ca0551cfSopenharmony_ci    mp->name_ = reinterpret_cast<char*>(DeserializeAdjust(mp->name_));
260ca0551cfSopenharmony_ci}
261ca0551cfSopenharmony_ci
262ca0551cfSopenharmony_civoid MetadataSerializer::DeserializeMetaType(MetaType* mt)
263ca0551cfSopenharmony_ci{
264ca0551cfSopenharmony_ci    if (mt == nullptr) {
265ca0551cfSopenharmony_ci        return;
266ca0551cfSopenharmony_ci    }
267ca0551cfSopenharmony_ci    mt->nestedTypeIndexes_ = reinterpret_cast<int*>(DeserializeAdjust(mt->nestedTypeIndexes_));
268ca0551cfSopenharmony_ci}
269ca0551cfSopenharmony_ci
270ca0551cfSopenharmony_ciuintptr_t MetadataSerializer::DeserializeAdjust(const void* addr)
271ca0551cfSopenharmony_ci{
272ca0551cfSopenharmony_ci    return reinterpret_cast<ptrdiff_t>(addr) + baseAddr_;
273ca0551cfSopenharmony_ci}
274ca0551cfSopenharmony_ci} // namespace Idl
275ca0551cfSopenharmony_ci} // namespace OHOS
276