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 #include "script_basicinstruction.h"
16 #include <unistd.h>
17 #include "script_utils.h"
18 #include "utils.h"
19 
20 using namespace Uscript;
21 using namespace std;
22 
23 namespace BasicInstruction {
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)24 int32_t UScriptInstructionAbort::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
25 {
26     int32_t result = 1;
27     int32_t ret = context.GetParam(0, result);
28     if (ret != USCRIPT_SUCCESS) {
29         USCRIPT_LOGE("Failed to get param");
30         return ret;
31     }
32     return ((result == 0) ? USCRIPT_ABOART : USCRIPT_SUCCESS);
33 }
34 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)35 int32_t UScriptInstructionAssert::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
36 {
37     int32_t result = 1;
38     int32_t ret = context.GetParam(0, result);
39     if (ret != USCRIPT_SUCCESS) {
40         USCRIPT_LOGE("Failed to get param");
41         return ret;
42     }
43     return ((result == 0) ? USCRIPT_ASSERT : USCRIPT_SUCCESS);
44 }
45 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)46 int32_t UScriptInstructionSleep::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
47 {
48     int32_t seconds = 1;
49     int32_t ret = context.GetParam(0, seconds);
50     if (ret != USCRIPT_SUCCESS) {
51         USCRIPT_LOGE("Failed to get param");
52         return ret;
53     }
54     sleep(seconds);
55     return USCRIPT_SUCCESS;
56 }
57 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)58 int32_t UScriptInstructionConcat::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
59 {
60     int32_t ret = 0;
61     std::string str;
62     ret = context.GetParam(0, str);
63     if (ret != USCRIPT_SUCCESS) {
64         USCRIPT_LOGE("Failed to get param");
65         return ret;
66     }
67 
68     for (int32_t i = 1; i < context.GetParamCount(); i++) {
69         switch (context.GetParamType(i)) {
70             case UScriptContext::PARAM_TYPE_INTEGER: {
71                 int32_t v;
72                 ret = context.GetParam(i, v);
73                 if (ret != USCRIPT_SUCCESS) {
74                     USCRIPT_LOGE("Failed to get param");
75                     return ret;
76                 }
77                 str.append(to_string(v));
78                 break;
79             }
80             case UScriptContext::PARAM_TYPE_FLOAT: {
81                 float v;
82                 ret = context.GetParam(i, v);
83                 if (ret != USCRIPT_SUCCESS) {
84                     USCRIPT_LOGE("Failed to get param");
85                     return ret;
86                 }
87                 str.append(to_string(v));
88                 break;
89             }
90             case UScriptContext::PARAM_TYPE_STRING: {
91                 std::string v;
92                 ret = context.GetParam(i, v);
93                 if (ret != USCRIPT_SUCCESS) {
94                     USCRIPT_LOGE("Failed to get param");
95                     return ret;
96                 }
97                 str.append(v);
98                 break;
99             }
100             default:
101                 break;
102         }
103     }
104     context.PushParam(str);
105     return USCRIPT_SUCCESS;
106 }
107 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)108 int32_t UScriptInstructionIsSubString::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
109 {
110     std::string str;
111     std::string subStr;
112     int32_t ret = context.GetParam(0, str);
113     if (ret != USCRIPT_SUCCESS) {
114         USCRIPT_LOGE("Failed to get param");
115         return ret;
116     }
117     ret = context.GetParam(1, subStr);
118     if (ret != USCRIPT_SUCCESS) {
119         USCRIPT_LOGE("Failed to get param");
120         return ret;
121     }
122     string::size_type last = str.find(subStr);
123     if (last == string::npos) {
124         context.PushParam(0);
125     } else {
126         context.PushParam(1);
127     }
128     return USCRIPT_SUCCESS;
129 }
130 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)131 int32_t UScriptInstructionStdout::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
132 {
133     int32_t ret;
134     for (int32_t i = 0; i < context.GetParamCount(); i++) {
135         if (context.GetParamType(i) == UScriptContext::PARAM_TYPE_INTEGER) {
136             int32_t v;
137             ret = context.GetParam(i, v);
138             if (ret != USCRIPT_SUCCESS) {
139                 USCRIPT_LOGE("Failed to get param");
140                 return ret;
141             }
142             std::cout << v << "  ";
143         } else if (context.GetParamType(i) == UScriptContext::PARAM_TYPE_FLOAT) {
144             float v;
145             ret = context.GetParam(i, v);
146             if (ret != USCRIPT_SUCCESS) {
147                 USCRIPT_LOGE("Failed to get param");
148                 return ret;
149             }
150             std::cout << v << "  ";
151         } else if (context.GetParamType(i) == UScriptContext::PARAM_TYPE_STRING) {
152             std::string v;
153             ret = context.GetParam(i, v);
154             if (ret != USCRIPT_SUCCESS) {
155                 USCRIPT_LOGE("Failed to get param");
156                 return ret;
157             }
158             std::cout << v << "  ";
159         }
160     }
161     std::cout << std::endl;
162     return USCRIPT_SUCCESS;
163 }
164 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)165 int32_t UScriptInstructionDeleteFile::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
166 {
167     std::string file;
168     int32_t ret;
169     for (int32_t i = 0; i < context.GetParamCount(); i++) {
170         ret = context.GetParam(i, file);
171         if (ret != USCRIPT_SUCCESS) {
172             USCRIPT_LOGE("Failed to get param");
173             return ret;
174         }
175         USCRIPT_LOGI("delete file %s", file.c_str());
176         ret = Updater::Utils::DeleteFile(file.c_str());
177         if (ret != USCRIPT_SUCCESS) {
178             USCRIPT_LOGE("Failed to delete file");
179             return ret;
180         }
181     }
182     return USCRIPT_SUCCESS;
183 }
184 
Execute(Uscript::UScriptEnv & env,Uscript::UScriptContext & context)185 int32_t UScriptInstructionDeleteDir::Execute(Uscript::UScriptEnv &env, Uscript::UScriptContext &context)
186 {
187     std::string path;
188     int32_t ret;
189     for (int32_t i = 0; i < context.GetParamCount(); i++) {
190         ret = context.GetParam(i, path);
191         if (ret != USCRIPT_SUCCESS) {
192             USCRIPT_LOGE("Failed to get param");
193             return ret;
194         }
195         USCRIPT_LOGI("delete dir %s", path.c_str());
196         ret = Updater::Utils::RemoveDir(path.c_str());
197         if (ret != USCRIPT_SUCCESS) {
198             USCRIPT_LOGE("Failed to remove dir");
199             return ret;
200         }
201     }
202     return USCRIPT_SUCCESS;
203 }
204 } // namespace BasicInstruction
205