• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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