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