• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 <vector>
17 #include <string>
18 #include "hdf_sbuf_ipc.h"
19 #include "hdf_sbuf_impl.h"
20 #include "hdf_log.h"
21 #include "hdf_remote_adapter.h"
22 
23 using namespace OHOS;
24 
25 static void MParcelImplInterfaceAssign(struct HdfSBufImpl *inf);
26 
27 struct SBufMParcelImpl {
SBufMParcelImplSBufMParcelImpl28     SBufMParcelImpl(OHOS::MessageParcel *parcel, bool owned = true): realParcel_(parcel), owned_(owned)
29     {
30         MParcelImplInterfaceAssign(&infImpl);
31     }
~SBufMParcelImplSBufMParcelImpl32     ~SBufMParcelImpl()
33     {
34         if (owned_ && realParcel_ != nullptr) {
35             delete realParcel_;
36             realParcel_ = nullptr;
37         }
38     }
39     struct HdfSBufImpl infImpl;
40     OHOS::MessageParcel *realParcel_;
41     std::vector<std::u16string> str16Pool_;
42     bool owned_;
43 };
44 
MParcelCast(struct HdfSBufImpl * impl)45 static MessageParcel *MParcelCast(struct HdfSBufImpl *impl)
46 {
47     SBufMParcelImpl *sbufImpl = reinterpret_cast<SBufMParcelImpl *>(impl);
48     return sbufImpl->realParcel_;
49 }
50 
SbufMParcelImplWriteBuffer(struct HdfSBufImpl * sbuf,const uint8_t * data,uint32_t writeSize)51 static bool SbufMParcelImplWriteBuffer(struct HdfSBufImpl *sbuf, const uint8_t *data, uint32_t writeSize)
52 {
53     if (sbuf == nullptr) {
54         return false;
55     }
56     auto parcel = MParcelCast(sbuf);
57     if (!parcel->WriteUint32(writeSize)) {
58         return false;
59     }
60     return parcel->WriteUnpadBuffer((const void *)data, writeSize);
61 }
62 
SbufMParcelImplWriteUnpadBuffer(struct HdfSBufImpl * sbuf,const uint8_t * data,uint32_t writeSize)63 static bool SbufMParcelImplWriteUnpadBuffer(struct HdfSBufImpl *sbuf, const uint8_t *data, uint32_t writeSize)
64 {
65     if (sbuf == nullptr) {
66         return false;
67     }
68     return MParcelCast(sbuf)->WriteUnpadBuffer(static_cast<const void *>(data), writeSize);
69 }
70 
SbufMParcelImplWriteUint64(struct HdfSBufImpl * sbuf,uint64_t value)71 static bool SbufMParcelImplWriteUint64(struct HdfSBufImpl *sbuf, uint64_t value)
72 {
73     if (sbuf == nullptr) {
74         return false;
75     }
76     return MParcelCast(sbuf)->WriteUint64(value);
77 }
78 
SbufMParcelImplWriteUint32(struct HdfSBufImpl * sbuf,uint32_t value)79 static bool SbufMParcelImplWriteUint32(struct HdfSBufImpl *sbuf, uint32_t value)
80 {
81     if (sbuf == nullptr) {
82         return false;
83     }
84     return MParcelCast(sbuf)->WriteUint32(value);
85 }
86 
SbufMParcelImplWriteUint16(struct HdfSBufImpl * sbuf,uint16_t value)87 static bool SbufMParcelImplWriteUint16(struct HdfSBufImpl *sbuf, uint16_t value)
88 {
89     if (sbuf == nullptr) {
90         return false;
91     }
92     return MParcelCast(sbuf)->WriteUint16(value);
93 }
94 
SbufMParcelImplWriteUint8(struct HdfSBufImpl * sbuf,uint8_t value)95 static bool SbufMParcelImplWriteUint8(struct HdfSBufImpl *sbuf, uint8_t value)
96 {
97     if (sbuf == nullptr) {
98         return false;
99     }
100     return MParcelCast(sbuf)->WriteUint8(value);
101 }
102 
SbufMParcelImplWriteInt64(struct HdfSBufImpl * sbuf,int64_t value)103 static bool SbufMParcelImplWriteInt64(struct HdfSBufImpl *sbuf, int64_t value)
104 {
105     if (sbuf == nullptr) {
106         return false;
107     }
108     return MParcelCast(sbuf)->WriteInt64(value);
109 }
110 
SbufMParcelImplWriteInt32(struct HdfSBufImpl * sbuf,int32_t value)111 static bool SbufMParcelImplWriteInt32(struct HdfSBufImpl *sbuf, int32_t value)
112 {
113     if (sbuf == nullptr) {
114         return false;
115     }
116     return MParcelCast(sbuf)->WriteInt32(value);
117 }
118 
SbufMParcelImplWriteInt16(struct HdfSBufImpl * sbuf,int16_t value)119 static bool SbufMParcelImplWriteInt16(struct HdfSBufImpl *sbuf, int16_t value)
120 {
121     if (sbuf == nullptr) {
122         return false;
123     }
124     return MParcelCast(sbuf)->WriteInt16(value);
125 }
126 
SbufMParcelImplWriteInt8(struct HdfSBufImpl * sbuf,int8_t value)127 static bool SbufMParcelImplWriteInt8(struct HdfSBufImpl *sbuf, int8_t value)
128 {
129     if (sbuf == nullptr) {
130         return false;
131     }
132     return MParcelCast(sbuf)->WriteInt8(value);
133 }
134 
SbufMParcelImplWriteString(struct HdfSBufImpl * sbuf,const char * value)135 static bool SbufMParcelImplWriteString(struct HdfSBufImpl *sbuf, const char *value)
136 {
137     if (sbuf == nullptr) {
138         return false;
139     }
140     return MParcelCast(sbuf)->WriteCString(value);
141 }
142 
SbufMParcelImplWriteString16(struct HdfSBufImpl * sbuf,const char16_t * value,uint32_t size)143 static bool SbufMParcelImplWriteString16(struct HdfSBufImpl *sbuf, const char16_t *value, uint32_t size)
144 {
145     if (sbuf == nullptr) {
146         return false;
147     }
148     return MParcelCast(sbuf)->WriteString16WithLength(value, size);
149 }
150 
SbufMParcelImplWriteFileDescriptor(struct HdfSBufImpl * sbuf,int fd)151 static bool SbufMParcelImplWriteFileDescriptor(struct HdfSBufImpl *sbuf, int fd)
152 {
153     if (sbuf == nullptr) {
154         return false;
155     }
156     return MParcelCast(sbuf)->WriteFileDescriptor(fd);
157 }
158 
SbufMParcelImplWriteDouble(struct HdfSBufImpl * sbuf,double value)159 static bool SbufMParcelImplWriteDouble(struct HdfSBufImpl *sbuf, double value)
160 {
161     if (sbuf == nullptr) {
162         return false;
163     }
164     return MParcelCast(sbuf)->WriteDouble(value);
165 }
166 
SbufMParcelImplWriteFloat(struct HdfSBufImpl * sbuf,float value)167 static bool SbufMParcelImplWriteFloat(struct HdfSBufImpl *sbuf, float value)
168 {
169     if (sbuf == nullptr) {
170         return false;
171     }
172     return MParcelCast(sbuf)->WriteFloat(value);
173 }
174 
SbufMParcelImplReadFloat(struct HdfSBufImpl * sbuf,float * value)175 static bool SbufMParcelImplReadFloat(struct HdfSBufImpl *sbuf, float *value)
176 {
177     if (sbuf == nullptr || value == nullptr) {
178         return false;
179     }
180     float v = 0;
181     bool ret = MParcelCast(sbuf)->ReadFloat(v);
182     *value = v;
183     return ret;
184 }
185 
SbufMParcelImplReadDouble(struct HdfSBufImpl * sbuf,double * value)186 static bool SbufMParcelImplReadDouble(struct HdfSBufImpl *sbuf, double *value)
187 {
188     if (sbuf == nullptr || value == nullptr) {
189         return false;
190     }
191     double v = 0;
192     bool ret = MParcelCast(sbuf)->ReadDouble(v);
193     *value = v;
194     return ret;
195 }
196 
SbufMParcelImplReadFileDescriptor(struct HdfSBufImpl * sbuf)197 static int SbufMParcelImplReadFileDescriptor(struct HdfSBufImpl *sbuf)
198 {
199     if (sbuf == nullptr) {
200         return false;
201     }
202     return MParcelCast(sbuf)->ReadFileDescriptor();
203 }
204 
SbufMParcelImplReadBuffer(struct HdfSBufImpl * sbuf,const uint8_t ** data,uint32_t * readSize)205 static bool SbufMParcelImplReadBuffer(struct HdfSBufImpl *sbuf, const uint8_t **data, uint32_t *readSize)
206 {
207     if (sbuf == nullptr || data == nullptr || readSize == nullptr) {
208         return false;
209     }
210     MessageParcel *parcel = MParcelCast(sbuf);
211     *readSize = parcel->ReadUint32();
212     *data = parcel->ReadUnpadBuffer(*readSize);
213     return *data != nullptr;
214 }
215 
SbufMParcelImplReadUnpadBuffer(struct HdfSBufImpl * sbuf,size_t length)216 static const uint8_t *SbufMParcelImplReadUnpadBuffer(struct HdfSBufImpl *sbuf, size_t length)
217 {
218     if (sbuf == nullptr) {
219         return nullptr;
220     }
221     return MParcelCast(sbuf)->ReadUnpadBuffer(length);
222 }
223 
SbufMParcelImplReadUint64(struct HdfSBufImpl * sbuf,uint64_t * value)224 static bool SbufMParcelImplReadUint64(struct HdfSBufImpl *sbuf, uint64_t *value)
225 {
226     if (sbuf == nullptr || value == nullptr) {
227         return false;
228     }
229     uint64_t v = 0;
230     bool ret = MParcelCast(sbuf)->ReadUint64(v);
231     *value = v;
232     return ret;
233 }
234 
SbufMParcelImplReadUint32(struct HdfSBufImpl * sbuf,uint32_t * value)235 static bool SbufMParcelImplReadUint32(struct HdfSBufImpl *sbuf, uint32_t *value)
236 {
237     if (sbuf == nullptr || value == nullptr) {
238         return false;
239     }
240     uint32_t v = 0;
241     bool ret = MParcelCast(sbuf)->ReadUint32(v);
242     *value = v;
243     return ret;
244 }
245 
SbufMParcelImplReadUint16(struct HdfSBufImpl * sbuf,uint16_t * value)246 static bool SbufMParcelImplReadUint16(struct HdfSBufImpl *sbuf, uint16_t *value)
247 {
248     if (sbuf == nullptr || value == nullptr) {
249         return false;
250     }
251     uint16_t v = 0;
252     bool ret = MParcelCast(sbuf)->ReadUint16(v);
253     *value = v;
254     return ret;
255 }
256 
SbufMParcelImplReadUint8(struct HdfSBufImpl * sbuf,uint8_t * value)257 static bool SbufMParcelImplReadUint8(struct HdfSBufImpl *sbuf, uint8_t *value)
258 {
259     if (sbuf == nullptr || value == nullptr) {
260         return false;
261     }
262     uint8_t v = 0;
263     bool ret = MParcelCast(sbuf)->ReadUint8(v);
264     *value = v;
265     return ret;
266 }
267 
SbufMParcelImplReadInt64(struct HdfSBufImpl * sbuf,int64_t * value)268 static bool SbufMParcelImplReadInt64(struct HdfSBufImpl *sbuf, int64_t *value)
269 {
270     if (sbuf == nullptr || value == nullptr) {
271         return false;
272     }
273     int64_t v = 0;
274     bool ret = MParcelCast(sbuf)->ReadInt64(v);
275     *value = v;
276     return ret;
277 }
278 
SbufMParcelImplReadInt32(struct HdfSBufImpl * sbuf,int32_t * value)279 static bool SbufMParcelImplReadInt32(struct HdfSBufImpl *sbuf, int32_t *value)
280 {
281     if (sbuf == nullptr || value == nullptr) {
282         return false;
283     }
284     int32_t v = 0;
285     bool ret = MParcelCast(sbuf)->ReadInt32(v);
286     *value = v;
287     return ret;
288 }
289 
SbufMParcelImplReadInt16(struct HdfSBufImpl * sbuf,int16_t * value)290 static bool SbufMParcelImplReadInt16(struct HdfSBufImpl *sbuf, int16_t *value)
291 {
292     if (sbuf == nullptr || value == nullptr) {
293         return false;
294     }
295     int16_t v = 0;
296     bool ret = MParcelCast(sbuf)->ReadInt16(v);
297     *value = v;
298     return ret;
299 }
300 
SbufMParcelImplReadInt8(struct HdfSBufImpl * sbuf,int8_t * value)301 static bool SbufMParcelImplReadInt8(struct HdfSBufImpl *sbuf, int8_t *value)
302 {
303     if (sbuf == nullptr || value == nullptr) {
304         return false;
305     }
306     int8_t v = 0;
307     bool ret = MParcelCast(sbuf)->ReadInt8(v);
308     *value = v;
309     return ret;
310 }
311 
SbufMParcelImplReadString(struct HdfSBufImpl * sbuf)312 static const char *SbufMParcelImplReadString(struct HdfSBufImpl *sbuf)
313 {
314     if (sbuf == nullptr) {
315         return nullptr;
316     }
317     return MParcelCast(sbuf)->ReadCString();
318 }
319 
SbufMParcelImplReadString16(struct HdfSBufImpl * sbuf)320 static const char16_t *SbufMParcelImplReadString16(struct HdfSBufImpl *sbuf)
321 {
322     if (sbuf == nullptr) {
323         return nullptr;
324     }
325     SBufMParcelImpl *sbufImpl = reinterpret_cast<SBufMParcelImpl *>(sbuf);
326     sbufImpl->str16Pool_.emplace_back(sbufImpl->realParcel_->ReadString16());
327     return sbufImpl->str16Pool_.rbegin()->c_str();
328 }
329 
SbufMParcelImplWriteRemoteService(struct HdfSBufImpl * sbuf,const struct HdfRemoteService * service)330 static int32_t SbufMParcelImplWriteRemoteService(struct HdfSBufImpl *sbuf, const struct HdfRemoteService *service)
331 {
332     if (sbuf == nullptr || service == nullptr) {
333         return false;
334     }
335     MessageParcel *parcel = MParcelCast(sbuf);
336     const struct HdfRemoteServiceHolder *holder = reinterpret_cast<const struct HdfRemoteServiceHolder *>(service);
337     if (holder != nullptr) {
338         return parcel->WriteRemoteObject(holder->remote_) ? HDF_SUCCESS : HDF_FAILURE;
339     }
340     return HDF_FAILURE;
341 }
342 
SbufMParcelImplReadRemoteService(struct HdfSBufImpl * sbuf)343 static struct HdfRemoteService *SbufMParcelImplReadRemoteService(struct HdfSBufImpl *sbuf)
344 {
345     if (sbuf == nullptr) {
346         return nullptr;
347     }
348     auto remote = MParcelCast(sbuf)->ReadRemoteObject();
349     if (remote == nullptr) {
350         HDF_LOGE("%{public}s: read remote object fail", __func__);
351         return nullptr;
352     }
353     return HdfRemoteAdapterBind(remote);
354 }
355 
SbufMParcelImplGetData(const struct HdfSBufImpl * sbuf)356 static const uint8_t *SbufMParcelImplGetData(const struct HdfSBufImpl *sbuf)
357 {
358     if (sbuf == nullptr) {
359         return nullptr;
360     }
361     return reinterpret_cast<const uint8_t *>(MParcelCast(const_cast<struct HdfSBufImpl *>(sbuf))->GetData());
362 }
363 
SbufMParcelImplFlush(struct HdfSBufImpl * sbuf)364 static void SbufMParcelImplFlush(struct HdfSBufImpl *sbuf)
365 {
366     if (sbuf == nullptr) {
367         return;
368     }
369     return MParcelCast(sbuf)->FlushBuffer();
370 }
371 
SbufMParcelImplGetCapacity(const struct HdfSBufImpl * sbuf)372 static size_t SbufMParcelImplGetCapacity(const struct HdfSBufImpl *sbuf)
373 {
374     if (sbuf == nullptr) {
375         return HDF_FAILURE;
376     }
377 
378     return MParcelCast(const_cast<struct HdfSBufImpl *>(sbuf))->GetDataCapacity();
379 }
380 
SbufMParcelImplGetDataSize(const struct HdfSBufImpl * sbuf)381 static size_t SbufMParcelImplGetDataSize(const struct HdfSBufImpl *sbuf)
382 {
383     if (sbuf == nullptr) {
384         return HDF_FAILURE;
385     }
386     return MParcelCast(const_cast<struct HdfSBufImpl *>(sbuf))->GetDataSize();
387 }
388 
SbufMParcelImplSetDataSize(struct HdfSBufImpl * sbuf,size_t size)389 static void SbufMParcelImplSetDataSize(struct HdfSBufImpl *sbuf, size_t size)
390 {
391     if (sbuf == nullptr) {
392         return;
393     }
394     MParcelCast(sbuf)->SetDataSize(size);
395 }
396 
SbufMParcelImplRecycle(struct HdfSBufImpl * sbuf)397 static void SbufMParcelImplRecycle(struct HdfSBufImpl *sbuf)
398 {
399     if (sbuf == nullptr) {
400         return;
401     }
402     SBufMParcelImpl *sbufImpl = reinterpret_cast<SBufMParcelImpl *>(sbuf);
403     delete sbufImpl;
404 }
405 
MParcelImplInterfaceAssign(struct HdfSBufImpl * inf)406 static void MParcelImplInterfaceAssign(struct HdfSBufImpl *inf)
407 {
408     inf->writeBuffer = SbufMParcelImplWriteBuffer;
409     inf->writeUnpadBuffer = SbufMParcelImplWriteUnpadBuffer;
410     inf->writeUint64 = SbufMParcelImplWriteUint64;
411     inf->writeUint32 = SbufMParcelImplWriteUint32;
412     inf->writeUint16 = SbufMParcelImplWriteUint16;
413     inf->writeUint8 = SbufMParcelImplWriteUint8;
414     inf->writeInt64 = SbufMParcelImplWriteInt64;
415     inf->writeInt32 = SbufMParcelImplWriteInt32;
416     inf->writeInt16 = SbufMParcelImplWriteInt16;
417     inf->writeInt8 = SbufMParcelImplWriteInt8;
418     inf->writeString = SbufMParcelImplWriteString;
419     inf->writeString16 = SbufMParcelImplWriteString16;
420     inf->writeFileDescriptor = SbufMParcelImplWriteFileDescriptor;
421     inf->writeFloat = SbufMParcelImplWriteFloat;
422     inf->writeDouble = SbufMParcelImplWriteDouble;
423     inf->readDouble = SbufMParcelImplReadDouble;
424     inf->readFloat = SbufMParcelImplReadFloat;
425     inf->readFileDescriptor = SbufMParcelImplReadFileDescriptor;
426     inf->readBuffer = SbufMParcelImplReadBuffer;
427     inf->readUnpadBuffer = SbufMParcelImplReadUnpadBuffer;
428     inf->readUint64 = SbufMParcelImplReadUint64;
429     inf->readUint32 = SbufMParcelImplReadUint32;
430     inf->readUint16 = SbufMParcelImplReadUint16;
431     inf->readUint8 = SbufMParcelImplReadUint8;
432     inf->readInt64 = SbufMParcelImplReadInt64;
433     inf->readInt32 = SbufMParcelImplReadInt32;
434     inf->readInt16 = SbufMParcelImplReadInt16;
435     inf->readInt8 = SbufMParcelImplReadInt8;
436     inf->readString = SbufMParcelImplReadString;
437     inf->readString16 = SbufMParcelImplReadString16;
438     inf->writeRemoteService = SbufMParcelImplWriteRemoteService;
439     inf->readRemoteService = SbufMParcelImplReadRemoteService;
440     inf->getData = SbufMParcelImplGetData;
441     inf->flush = SbufMParcelImplFlush;
442     inf->getCapacity = SbufMParcelImplGetCapacity;
443     inf->getDataSize = SbufMParcelImplGetDataSize;
444     inf->setDataSize = SbufMParcelImplSetDataSize;
445     inf->recycle = SbufMParcelImplRecycle;
446     inf->transDataOwnership = nullptr;
447     inf->copy = nullptr;
448     inf->move = nullptr;
449 }
450 
SbufObtainIpc(size_t capacity)451 extern "C" struct HdfSBufImpl *SbufObtainIpc(size_t capacity)
452 {
453     (void)capacity;
454     struct SBufMParcelImpl *sbuf = new SBufMParcelImpl(new MessageParcel());
455     return &sbuf->infImpl;
456 }
457 
458 class SbufAllocator : public Allocator {
459 public:
Realloc(void * data,size_t newSize)460     virtual void *Realloc(void *data, size_t newSize) override
461     {
462         (void)data;
463         (void)newSize;
464         return nullptr;
465     }
466 
Alloc(size_t size)467     virtual void *Alloc(size_t size) override
468     {
469         (void)size;
470         return nullptr;
471     }
472 
Dealloc(void * data)473     virtual void Dealloc(void *data) override
474     {
475         (void)data;
476     }
477 };
478 
SbufBindIpc(uintptr_t base,size_t size)479 extern "C" struct HdfSBufImpl *SbufBindIpc(uintptr_t base, size_t size)
480 {
481     struct SBufMParcelImpl *sbuf = new SBufMParcelImpl(new MessageParcel(new SbufAllocator()));
482     sbuf->realParcel_->ParseFrom(base, size);
483     return &sbuf->infImpl;
484 }
485 
ParcelToSbuf(OHOS::MessageParcel * parcel)486 struct HdfSBuf *ParcelToSbuf(OHOS::MessageParcel *parcel)
487 {
488     struct SBufMParcelImpl *sbuf = new SBufMParcelImpl(parcel, false);
489     return HdfSbufTypedObtainInplace(SBUF_IPC, &sbuf->infImpl);
490 }
491 
SbufToParcel(struct HdfSBuf * sbuf,OHOS::MessageParcel ** parcel)492 int32_t SbufToParcel(struct HdfSBuf *sbuf, OHOS::MessageParcel **parcel)
493 {
494     if (sbuf == nullptr || parcel == nullptr) {
495         return HDF_ERR_INVALID_PARAM;
496     }
497     struct SBufMParcelImpl *impl = reinterpret_cast<SBufMParcelImpl *>(HdfSbufGetImpl(sbuf));
498     if (impl == nullptr) {
499         return HDF_ERR_INVALID_OBJECT;
500     }
501 
502     *parcel = impl->realParcel_;
503     return HDF_SUCCESS;
504 }