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 "stream_ffi.h"
17 
18 using namespace OHOS::FFI;
19 using namespace OHOS::CJSystemapi;
20 using namespace OHOS::CJSystemapi::FileFs;
21 
22 extern "C" {
FfiOHOSStreamClose(int64_t id)23 RetCode FfiOHOSStreamClose(int64_t id)
24 {
25     LOGI("OHOS::CJSystemapi FfiOHOSStreamClose");
26     auto instance = FFIData::GetData<StreamImpl>(id);
27     if (!instance) {
28         LOGE("Stream instance not exist %{public}" PRId64, id);
29         return ERR_INVALID_INSTANCE_CODE;
30     }
31     return instance->Close();
32 }
33 
FfiOHOSStreamFlush(int64_t id)34 RetCode FfiOHOSStreamFlush(int64_t id)
35 {
36     LOGI("OHOS::CJSystemapi FfiOHOSStreamFlush");
37     auto instance = FFIData::GetData<StreamImpl>(id);
38     if (!instance) {
39         LOGE("Stream instance not exist %{public}" PRId64, id);
40         return ERR_INVALID_INSTANCE_CODE;
41     }
42     return instance->Flush();
43 }
44 
FfiOHOSStreamWriteCur(int64_t id,const char * buffer,int64_t length,const char * encode)45 RetDataI64 FfiOHOSStreamWriteCur(int64_t id, const char* buffer, int64_t length, const char* encode)
46 {
47     LOGI("OHOS::CJSystemapi FfiOHOSStreamWriteCur");
48     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
49     auto instance = FFIData::GetData<StreamImpl>(id);
50     if (!instance) {
51         LOGE("Stream instance not exist %{public}" PRId64, id);
52         return ret;
53     }
54     auto [state, writeLen] = instance->WriteCur(buffer, length, encode);
55     ret.code = state;
56     if (state != SUCCESS_CODE) {
57         ret.data = 0;
58         return ret;
59     }
60     ret.data = writeLen;
61     return ret;
62 }
63 
FfiOHOSStreamWrite(int64_t id,const char * buffer,int64_t length,int64_t offset,const char * encode)64 RetDataI64 FfiOHOSStreamWrite(int64_t id, const char* buffer, int64_t length, int64_t offset, const char* encode)
65 {
66     LOGI("OHOS::CJSystemapi FfiOHOSStreamWriteByString");
67     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
68     auto instance = FFIData::GetData<StreamImpl>(id);
69     if (!instance) {
70         LOGE("Stream instance not exist %{public}" PRId64, id);
71         return ret;
72     }
73     auto [state, writeLen] = instance->Write(buffer, length, offset, encode);
74     ret.code = state;
75     if (state != SUCCESS_CODE) {
76         ret.data = 0;
77         return ret;
78     }
79     ret.data = writeLen;
80     return ret;
81 }
82 
FfiOHOSStreamReadCur(int64_t id,uint8_t * buffer,int64_t bufLen,int64_t length)83 RetDataI64 FfiOHOSStreamReadCur(int64_t id, uint8_t* buffer, int64_t bufLen, int64_t length)
84 {
85     LOGI("OHOS::CJSystemapi FfiOHOSStreamReadCur");
86     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
87     auto instance = FFIData::GetData<StreamImpl>(id);
88     if (!instance) {
89         LOGE("Stream instance not exist %{public}" PRId64, id);
90         return ret;
91     }
92     auto [state, readLen] = instance->ReadCur(buffer, bufLen, length);
93     ret.code = state;
94     if (state != SUCCESS_CODE) {
95         ret.data = 0;
96         return ret;
97     }
98     ret.data = readLen;
99     LOGI("OHOS::CJSystemapi FfiOHOSStreamReadCur success");
100     return ret;
101 }
102 
FfiOHOSStreamRead(int64_t id,uint8_t * buffer,int64_t bufLen,int64_t length,int64_t offset)103 RetDataI64 FfiOHOSStreamRead(int64_t id, uint8_t* buffer, int64_t bufLen, int64_t length, int64_t offset)
104 {
105     LOGI("OHOS::CJSystemapi FfiOHOSStreamRead");
106     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = 0 };
107     auto instance = FFIData::GetData<StreamImpl>(id);
108     if (!instance) {
109         LOGE("Stream instance not exist %{public}" PRId64, id);
110         return ret;
111     }
112     auto [state, readLen] = instance->Read(buffer, bufLen, length, offset);
113     ret.code = state;
114     if (state != SUCCESS_CODE) {
115         ret.data = 0;
116         return ret;
117     }
118     ret.data = readLen;
119     LOGI("OHOS::CJSystemapi FfiOHOSStreamRead success");
120     return ret;
121 }
122 }