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