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