1 /*
2  * Copyright (c) 2023 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 "securec.h"
17 #include <message_parcel.h>
18 #include "buffer_handle_sequenceable.h"
19 #include "buffer_util.h"
20 #include "hdi_log.h"
21 #include "native_buffer.h"
22 
23 namespace OHOS {
24 namespace HDI {
25 namespace Camera {
26 namespace V1_0 {
27 using namespace OHOS::HDI::Base;
28 
29 class BufferHandleSequenceable::BufferHandleWrap {
30 public:
BufferHandleWrap(BufferHandle * bufferHandle=nullptr)31     explicit BufferHandleWrap(BufferHandle *bufferHandle = nullptr)
32     {
33         nativeBuffer_ = new (std::nothrow) NativeBuffer();
34         if (nativeBuffer_ == nullptr) {
35             HDI_CAMERA_LOGE("Native buffer object create failed.");
36             return;
37         }
38         nativeBuffer_->SetBufferHandle(bufferHandle);
39     }
40     sptr<NativeBuffer> nativeBuffer_;
41 };
42 
BufferHandleSequenceable(const BufferHandle & bufferHandle)43 BufferHandleSequenceable::BufferHandleSequenceable(const BufferHandle &bufferHandle)
44 {
45     auto newBufferHandle = NewBufferHandle(bufferHandle.reserveFds, bufferHandle.reserveInts);
46     bufferHandleWrap_ = std::make_shared<BufferHandleWrap>(newBufferHandle);
47 }
48 
BufferHandleSequenceable(BufferHandle * bufferHandle)49 BufferHandleSequenceable::BufferHandleSequenceable(BufferHandle *bufferHandle)
50 {
51     bufferHandleWrap_ = std::make_shared<BufferHandleWrap>(bufferHandle);
52 }
53 
NewBufferHandle(uint32_t reserveFds,uint32_t reserveInts)54 BufferHandle* BufferHandleSequenceable::NewBufferHandle(uint32_t reserveFds, uint32_t reserveInts)
55 {
56     return AllocateNativeBufferHandle(reserveFds, reserveInts);
57 }
58 
SetBufferHandle(BufferHandle * handle)59 void BufferHandleSequenceable::SetBufferHandle(BufferHandle *handle)
60 {
61     if (bufferHandleWrap_->nativeBuffer_ != nullptr) {
62         bufferHandleWrap_->nativeBuffer_->SetBufferHandle(handle);
63     }
64 }
GetBufferHandle()65 BufferHandle* BufferHandleSequenceable::GetBufferHandle()
66 {
67     if (bufferHandleWrap_->nativeBuffer_ == nullptr) {
68         return nullptr;
69     }
70     return bufferHandleWrap_->nativeBuffer_->GetBufferHandle();
71 }
72 
Marshalling(Parcel & parcel) const73 bool BufferHandleSequenceable::Marshalling(Parcel &parcel) const
74 {
75     if (bufferHandleWrap_->nativeBuffer_ == nullptr) {
76         return false;
77     }
78     return bufferHandleWrap_->nativeBuffer_->Marshalling(parcel);
79 }
80 
Unmarshalling(Parcel & parcel)81 sptr<BufferHandleSequenceable> BufferHandleSequenceable::Unmarshalling(Parcel &parcel)
82 {
83     sptr<BufferHandleSequenceable> sequenceObj(new BufferHandleSequenceable());
84     if (sequenceObj->bufferHandleWrap_ == nullptr) {
85         return nullptr;
86     }
87     sequenceObj->bufferHandleWrap_->nativeBuffer_ = NativeBuffer::Unmarshalling(parcel);
88     return sequenceObj;
89 }
90 
91 } // V1_0
92 } // Camera
93 } // HDI
94 } // OHOS