• 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 };
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