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 "sample/include/sample_plugin_1.h"
17 
18 #include <cstring>
19 
20 #include "securec.h"
21 
22 #include "protocol/retcode_inner/aie_retcode_inner.h"
23 #include "utils/log/aie_log.h"
24 
25 namespace OHOS {
26 namespace AI {
27 namespace {
28 constexpr long long ALG_VERSION = 1;
29 const char *ALG_NAME = "SAMPLE_PLUGIN_1";
30 const char * const PLUGIN_INFER_MODEL = "SYNC";
31 const char * const DEFAULT_PROCESS_STRING = "sample_plugin_1 SyncProcess default data";
32 
FreeDataInfo(DataInfo * dataInfo)33 void FreeDataInfo(DataInfo *dataInfo)
34 {
35     if (dataInfo != nullptr && dataInfo->data != nullptr) {
36         free(dataInfo->data);
37         dataInfo->data = nullptr;
38         dataInfo->length = 0;
39     }
40 }
41 
ReturnDataCopyOrDefaultData(const DataInfo & inputInfo,DataInfo & outputInfo)42 int ReturnDataCopyOrDefaultData(const DataInfo &inputInfo, DataInfo &outputInfo)
43 {
44     errno_t retCode;
45     DataInfo sourceData {};
46     if (inputInfo.length <= 0 || inputInfo.data == nullptr) {
47         sourceData.data = reinterpret_cast<unsigned char*>(const_cast<char*>(DEFAULT_PROCESS_STRING));
48         sourceData.length = strlen(DEFAULT_PROCESS_STRING) + 1;
49     } else {
50         sourceData = inputInfo;
51     }
52 
53     outputInfo.length = sourceData.length;
54     outputInfo.data = reinterpret_cast<unsigned char*>(malloc(sourceData.length));
55     if (outputInfo.data == nullptr) {
56         HILOGE("[SamplePlugin1]malloc failed.");
57         return RETCODE_FAILURE;
58     }
59     retCode = memcpy_s(outputInfo.data, outputInfo.length, sourceData.data, sourceData.length);
60     if (retCode != EOK) {
61         HILOGE("[SamplePlugin1]memcpy_s failed[%d].", retCode);
62         FreeDataInfo(&outputInfo);
63         return RETCODE_FAILURE;
64     }
65     return RETCODE_SUCCESS;
66 }
67 } // anonymous namespace
68 
69 SamplePlugin1::SamplePlugin1() = default;
70 
~SamplePlugin1()71 SamplePlugin1::~SamplePlugin1()
72 {
73     FreeDataInfo(&optionData_);
74 }
75 
GetVersion() const76 const long long SamplePlugin1::GetVersion() const
77 {
78     return ALG_VERSION;
79 }
80 
GetName() const81 const char *SamplePlugin1::GetName() const
82 {
83     return ALG_NAME;
84 }
85 
GetInferMode() const86 const char *SamplePlugin1::GetInferMode() const
87 {
88     return PLUGIN_INFER_MODEL;
89 }
90 
SyncProcess(IRequest * request,IResponse * & response)91 int SamplePlugin1::SyncProcess(IRequest *request, IResponse *&response)
92 {
93     DataInfo inputInfo = request->GetMsg();
94     if (inputInfo.data != nullptr && inputInfo.length <= 0) {
95         HILOGE("[SamplePlugin1]inputInfo data is invalid.");
96         return RETCODE_FAILURE;
97     }
98 
99     response = IResponse::Create(request);
100     CHK_RET(response == nullptr, RETCODE_FAILURE);
101 
102     DataInfo outputInfo {};
103     int retCode = ReturnDataCopyOrDefaultData(inputInfo, outputInfo);
104 
105     response->SetResult(outputInfo);
106     response->SetRetCode(retCode);
107     return retCode;
108 }
109 
AsyncProcess(IRequest * request,IPluginCallback * callback)110 int SamplePlugin1::AsyncProcess(IRequest *request, IPluginCallback *callback)
111 {
112     HILOGE("[SamplePlugin1]Sync plugin, can't run AsyncProcess.");
113     return RETCODE_FAILURE;
114 }
115 
Prepare(long long transactionId,const DataInfo & inputInfo,DataInfo & outputInfo)116 int SamplePlugin1::Prepare(long long transactionId, const DataInfo &inputInfo, DataInfo &outputInfo)
117 {
118     return ReturnDataCopyOrDefaultData(inputInfo, outputInfo);
119 }
120 
Release(bool isFullUnload,long long transactionId,const DataInfo & inputInfo)121 int SamplePlugin1::Release(bool isFullUnload, long long transactionId, const DataInfo &inputInfo)
122 {
123     FreeDataInfo(&optionData_);
124     return RETCODE_SUCCESS;
125 }
126 
SetOption(int optionType,const DataInfo & inputInfo)127 int SamplePlugin1::SetOption(int optionType, const DataInfo &inputInfo)
128 {
129     FreeDataInfo(&optionData_);
130 
131     if (inputInfo.data == nullptr) {
132         return RETCODE_SUCCESS;
133     }
134 
135     return ReturnDataCopyOrDefaultData(inputInfo, optionData_);
136 }
137 
GetOption(int optionType,const DataInfo & inputInfo,DataInfo & outputInfo)138 int SamplePlugin1::GetOption(int optionType, const DataInfo &inputInfo, DataInfo &outputInfo)
139 {
140     return ReturnDataCopyOrDefaultData(optionData_, outputInfo);
141 }
142 
143 PLUGIN_INTERFACE_IMPL(SamplePlugin1);
144 }
145 }
146