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 "napi_cast_control_command.h"
17 #include "avsession_log.h"
18 #include "avsession_errors.h"
19 #include "napi_utils.h"
20
21 namespace OHOS::AVSession {
22 std::map<std::string, std::tuple<NapiCastControlCommand::GetterType, NapiCastControlCommand::SetterType, int32_t>>
23 NapiCastControlCommand::commandMap_ = {
24 { "play", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_PLAY } },
25 { "pause", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_PAUSE } },
26 { "stop", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_STOP } },
27 { "playNext", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_PLAY_NEXT } },
28 { "playPrevious", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_PLAY_PREVIOUS } },
29 { "fastForward", { GetForwardTime, SetForwardTime, AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD } },
30 { "rewind", { GetRewindTime, SetRewindTime, AVCastControlCommand::CAST_CONTROL_CMD_REWIND } },
31 { "seek", { GetSeekTime, SetSeekTime, AVCastControlCommand::CAST_CONTROL_CMD_SEEK } },
32 { "setVolume", { GetVolume, SetVolume, AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME } },
33 { "setSpeed", { GetSpeed, SetSpeed, AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED } },
34 { "setLoopMode", { GetLoopMode, SetLoopMode, AVCastControlCommand::CAST_CONTROL_CMD_SET_LOOP_MODE } },
35 { "toggleFavorite", { GetNoneParam, SetNoneParam, AVCastControlCommand::CAST_CONTROL_CMD_TOGGLE_FAVORITE } },
36 };
37
ConvertCommand(const std::string & cmd)38 int32_t NapiCastControlCommand::ConvertCommand(const std::string& cmd)
39 {
40 for (const auto& [key, value] : commandMap_) {
41 if (key == cmd) {
42 return std::get<ENUM_INDEX>(value);
43 }
44 }
45 return AVCastControlCommand::CAST_CONTROL_CMD_INVALID;
46 }
47
ConvertCommand(int32_t cmd)48 std::string NapiCastControlCommand::ConvertCommand(int32_t cmd)
49 {
50 for (const auto& [key, value] : commandMap_) {
51 if (std::get<ENUM_INDEX>(value) == cmd) {
52 return key;
53 }
54 }
55 return {};
56 }
57
ConvertCommands(const std::vector<int32_t> & cmds)58 std::vector<std::string> NapiCastControlCommand::ConvertCommands(const std::vector<int32_t>& cmds)
59 {
60 std::vector<std::string> result;
61 for (const auto& cmd : cmds) {
62 auto stringCmd = ConvertCommand(cmd);
63 if (!stringCmd.empty()) {
64 result.push_back(stringCmd);
65 }
66 }
67 return result;
68 }
69
GetValue(napi_env env,napi_value in,AVCastControlCommand & out)70 napi_status NapiCastControlCommand::GetValue(napi_env env, napi_value in, AVCastControlCommand& out)
71 {
72 std::string cmd;
73 auto status = NapiUtils::GetNamedProperty(env, in, "command", cmd);
74 if (status != napi_ok) {
75 SLOGE("get command property failed");
76 return status;
77 }
78
79 SLOGI("cmd=%{public}s", cmd.c_str());
80 auto it = commandMap_.find(cmd);
81 if (it == commandMap_.end()) {
82 SLOGE("cmd is invalid");
83 return napi_invalid_arg;
84 }
85 if (out.SetCommand(ConvertCommand(cmd)) != AVSESSION_SUCCESS) {
86 SLOGE("native set command failed");
87 return napi_invalid_arg;
88 }
89 auto getter = std::get<GETTER_INDEX>(it->second);
90 return getter(env, in, out);
91 }
92
SetValue(napi_env env,AVCastControlCommand & in,napi_value & out)93 napi_status NapiCastControlCommand::SetValue(napi_env env, AVCastControlCommand& in, napi_value& out)
94 {
95 napi_status status = napi_create_object(env, &out);
96 CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
97
98 auto cmd = ConvertCommand(in.GetCommand());
99 napi_value property {};
100 status = NapiUtils::SetValue(env, cmd, property);
101 CHECK_RETURN(status == napi_ok, "create command property failed", status);
102 status = napi_set_named_property(env, out, "command", property);
103 CHECK_RETURN(status == napi_ok, "set command property failed", status);
104
105 auto it = commandMap_.find(cmd);
106 if (it == commandMap_.end()) {
107 SLOGE("cmd is invalid");
108 return napi_invalid_arg;
109 }
110
111 auto setter = std::get<SETTER_INDEX>(it->second);
112 return setter(env, in, out);
113 }
114
GetNoneParam(napi_env env,napi_value in,AVCastControlCommand & out)115 napi_status NapiCastControlCommand::GetNoneParam(napi_env env, napi_value in, AVCastControlCommand& out)
116 {
117 SLOGD("no param need to get");
118 (void)(env);
119 (void)(in);
120 (void)(out);
121 return napi_ok;
122 }
123
SetNoneParam(napi_env env,AVCastControlCommand & in,napi_value & out)124 napi_status NapiCastControlCommand::SetNoneParam(napi_env env, AVCastControlCommand& in, napi_value& out)
125 {
126 SLOGD("no param need to set");
127 (void)(env);
128 (void)(in);
129 (void)(out);
130 return napi_ok;
131 }
132
GetForwardTime(napi_env env,napi_value in,AVCastControlCommand & out)133 napi_status NapiCastControlCommand::GetForwardTime(napi_env env, napi_value in, AVCastControlCommand& out)
134 {
135 int32_t forwardTime {};
136 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", forwardTime);
137 if (status != napi_ok) {
138 SLOGE("get parameter failed");
139 return status;
140 }
141
142 CHECK_AND_RETURN_RET_LOG(out.SetForwardTime(forwardTime) == AVSESSION_SUCCESS, napi_invalid_arg,
143 "set parameter failed");
144 return status;
145 }
146
SetForwardTime(napi_env env,AVCastControlCommand & in,napi_value & out)147 napi_status NapiCastControlCommand::SetForwardTime(napi_env env, AVCastControlCommand& in, napi_value& out)
148 {
149 int32_t forwardTime {};
150 CHECK_AND_RETURN_RET_LOG(in.GetForwardTime(forwardTime) == AVSESSION_SUCCESS, napi_invalid_arg,
151 "get parameter failed");
152
153 napi_value property {};
154 auto status = NapiUtils::SetValue(env, forwardTime, property);
155 if (status != napi_ok) {
156 SLOGE("create forwardTime property failed");
157 return status;
158 }
159
160 status = napi_set_named_property(env, out, "parameter", property);
161 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
162 return status;
163 }
164
GetRewindTime(napi_env env,napi_value in,AVCastControlCommand & out)165 napi_status NapiCastControlCommand::GetRewindTime(napi_env env, napi_value in, AVCastControlCommand& out)
166 {
167 int32_t rewindTime {};
168 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", rewindTime);
169 if (status != napi_ok) {
170 SLOGE("get parameter failed");
171 return status;
172 }
173
174 CHECK_AND_RETURN_RET_LOG(out.SetRewindTime(rewindTime) == AVSESSION_SUCCESS, napi_invalid_arg,
175 "set parameter failed");
176 return status;
177 }
178
SetRewindTime(napi_env env,AVCastControlCommand & in,napi_value & out)179 napi_status NapiCastControlCommand::SetRewindTime(napi_env env, AVCastControlCommand& in, napi_value& out)
180 {
181 int32_t rewindTime {};
182 CHECK_AND_RETURN_RET_LOG(in.GetRewindTime(rewindTime) == AVSESSION_SUCCESS, napi_invalid_arg,
183 "get parameter failed");
184
185 napi_value property {};
186 auto status = NapiUtils::SetValue(env, rewindTime, property);
187 if (status != napi_ok) {
188 SLOGE("create rewindTime property failed");
189 return status;
190 }
191
192 status = napi_set_named_property(env, out, "parameter", property);
193 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
194 return status;
195 }
196
GetSpeed(napi_env env,napi_value in,AVCastControlCommand & out)197 napi_status NapiCastControlCommand::GetSpeed(napi_env env, napi_value in, AVCastControlCommand& out)
198 {
199 int32_t speed {};
200 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", speed);
201 if (status != napi_ok) {
202 SLOGE("get parameter failed");
203 return status;
204 }
205
206 CHECK_AND_RETURN_RET_LOG(out.SetSpeed(speed) == AVSESSION_SUCCESS, napi_invalid_arg, "set parameter failed");
207 return status;
208 }
209
SetSpeed(napi_env env,AVCastControlCommand & in,napi_value & out)210 napi_status NapiCastControlCommand::SetSpeed(napi_env env, AVCastControlCommand& in, napi_value& out)
211 {
212 int32_t speed {};
213 CHECK_AND_RETURN_RET_LOG(in.GetSpeed(speed) == AVSESSION_SUCCESS, napi_invalid_arg, "get parameter failed");
214
215 napi_value property {};
216 auto status = NapiUtils::SetValue(env, speed, property);
217 if (status != napi_ok) {
218 SLOGE("create speed property failed");
219 return status;
220 }
221
222 status = napi_set_named_property(env, out, "parameter", property);
223 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
224 return status;
225 }
226
GetSeekTime(napi_env env,napi_value in,AVCastControlCommand & out)227 napi_status NapiCastControlCommand::GetSeekTime(napi_env env, napi_value in, AVCastControlCommand& out)
228 {
229 int32_t seekTime {};
230 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", seekTime);
231 if (status != napi_ok) {
232 SLOGE("get parameter failed");
233 return status;
234 }
235
236 CHECK_AND_RETURN_RET_LOG(out.SetSeekTime(seekTime) == AVSESSION_SUCCESS, napi_invalid_arg, "set parameter failed");
237 return status;
238 }
239
SetSeekTime(napi_env env,AVCastControlCommand & in,napi_value & out)240 napi_status NapiCastControlCommand::SetSeekTime(napi_env env, AVCastControlCommand& in, napi_value& out)
241 {
242 int32_t seekTime {};
243 CHECK_AND_RETURN_RET_LOG(in.GetSeekTime(seekTime) == AVSESSION_SUCCESS, napi_invalid_arg, "get parameter failed");
244
245 napi_value property {};
246 auto status = NapiUtils::SetValue(env, seekTime, property);
247 if (status != napi_ok) {
248 SLOGE("create speed property failed");
249 return status;
250 }
251
252 status = napi_set_named_property(env, out, "parameter", property);
253 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
254 return status;
255 }
256
GetVolume(napi_env env,napi_value in,AVCastControlCommand & out)257 napi_status NapiCastControlCommand::GetVolume(napi_env env, napi_value in, AVCastControlCommand& out)
258 {
259 int32_t volume {};
260 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", volume);
261 if (status != napi_ok) {
262 SLOGE("get parameter failed");
263 return status;
264 }
265
266 CHECK_AND_RETURN_RET_LOG(out.SetVolume(volume) == AVSESSION_SUCCESS, napi_invalid_arg, "set parameter failed");
267 return status;
268 }
269
SetVolume(napi_env env,AVCastControlCommand & in,napi_value & out)270 napi_status NapiCastControlCommand::SetVolume(napi_env env, AVCastControlCommand& in, napi_value& out)
271 {
272 int32_t volume {};
273 CHECK_AND_RETURN_RET_LOG(in.GetVolume(volume) == AVSESSION_SUCCESS, napi_invalid_arg, "get parameter failed");
274
275 napi_value property {};
276 auto status = NapiUtils::SetValue(env, volume, property);
277 if (status != napi_ok) {
278 SLOGE("create speed property failed");
279 return status;
280 }
281
282 status = napi_set_named_property(env, out, "parameter", property);
283 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
284 return status;
285 }
286
GetLoopMode(napi_env env,napi_value in,AVCastControlCommand & out)287 napi_status NapiCastControlCommand::GetLoopMode(napi_env env, napi_value in, AVCastControlCommand& out)
288 {
289 int32_t loopMode {};
290 auto status = NapiUtils::GetNamedProperty(env, in, "parameter", loopMode);
291 if (status != napi_ok) {
292 SLOGE("get parameter failed");
293 return status;
294 }
295
296 CHECK_AND_RETURN_RET_LOG(out.SetLoopMode(loopMode) == AVSESSION_SUCCESS, napi_invalid_arg, "set parameter failed");
297 return status;
298 }
299
SetLoopMode(napi_env env,AVCastControlCommand & in,napi_value & out)300 napi_status NapiCastControlCommand::SetLoopMode(napi_env env, AVCastControlCommand& in, napi_value& out)
301 {
302 int32_t loopMode {};
303 CHECK_AND_RETURN_RET_LOG(in.GetLoopMode(loopMode) == AVSESSION_SUCCESS, napi_invalid_arg, "get parameter failed");
304
305 napi_value property {};
306 auto status = NapiUtils::SetValue(env, loopMode, property);
307 if (status != napi_ok) {
308 SLOGE("create loopMode property failed");
309 return status;
310 }
311
312 status = napi_set_named_property(env, out, "parameter", property);
313 CHECK_AND_RETURN_RET_LOG(status == napi_ok, status, "set parameter property failed");
314 return status;
315 }
316 }
317