2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <cynara-client.h>
18 #include <cynara-error.h>
19 #include <cynara-session.h>
22 #include <system_info.h>
24 #include "vc_command.h"
25 #include "vc_info_parser.h"
27 #include "voice_control_command.h"
28 #include "voice_control_command_expand.h"
29 #include "voice_control_common.h"
30 #include "voice_control_key_defines.h"
32 static int g_feature_enabled = -1;
34 static int g_privilege_allowed = 1; /* Always True */
35 static cynara *p_cynara = NULL;
37 static int __vc_cmd_get_feature_enabled()
39 if (0 == g_feature_enabled) {
40 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
41 return VC_ERROR_NOT_SUPPORTED;
42 } else if (-1 == g_feature_enabled) {
43 bool vc_supported = false;
44 bool mic_supported = false;
45 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
46 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
47 if (false == vc_supported || false == mic_supported) {
48 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
49 g_feature_enabled = 0;
50 return VC_ERROR_NOT_SUPPORTED;
53 g_feature_enabled = 1;
55 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
56 return VC_ERROR_NOT_SUPPORTED;
59 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
60 return VC_ERROR_NOT_SUPPORTED;
67 static int __check_privilege_initialize()
69 int ret = cynara_initialize(&p_cynara, NULL);
70 if (CYNARA_API_SUCCESS != ret)
71 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
73 return ret == CYNARA_API_SUCCESS;
76 static int __check_privilege(const char* uid, const char * privilege)
79 char label_path[1024] = "/proc/self/attr/current";
80 char smack_label[1024] = {'\0',};
86 fp = fopen(label_path, "r");
88 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
89 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
95 char *session = cynara_session_from_pid(pid);
96 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
97 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
101 if (ret != CYNARA_API_ACCESS_ALLOWED)
106 static void __check_privilege_deinitialize()
109 cynara_finish(p_cynara);
113 static int __vc_cmd_check_privilege()
117 if (0 == g_privilege_allowed) {
118 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
119 return VC_ERROR_PERMISSION_DENIED;
120 } else if (-1 == g_privilege_allowed) {
121 if (false == __check_privilege_initialize()) {
122 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
123 return VC_ERROR_PERMISSION_DENIED;
125 snprintf(uid, 16, "%d", getuid());
126 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
127 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
128 g_privilege_allowed = 0;
129 __check_privilege_deinitialize();
130 return VC_ERROR_PERMISSION_DENIED;
132 __check_privilege_deinitialize();
135 g_privilege_allowed = 1;
137 return VC_ERROR_NONE;
140 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
142 if (0 != __vc_cmd_get_feature_enabled()) {
143 return VC_ERROR_NOT_SUPPORTED;
145 if (0 != __vc_cmd_check_privilege()) {
146 return VC_ERROR_PERMISSION_DENIED;
149 if (NULL == vc_cmd_list) {
150 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
151 return VC_ERROR_INVALID_PARAMETER;
154 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
157 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
158 return VC_ERROR_OUT_OF_MEMORY;
164 *vc_cmd_list = (vc_cmd_list_h)list;
166 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
168 return VC_ERROR_NONE;
171 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
173 if (0 != __vc_cmd_get_feature_enabled()) {
174 return VC_ERROR_NOT_SUPPORTED;
176 if (0 != __vc_cmd_check_privilege()) {
177 return VC_ERROR_PERMISSION_DENIED;
180 if (NULL == vc_cmd_list) {
181 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
182 return VC_ERROR_INVALID_PARAMETER;
185 vc_cmd_list_remove_all(vc_cmd_list, release_command);
187 vc_cmd_list_s* list = NULL;
188 list = (vc_cmd_list_s*)vc_cmd_list;
190 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
197 return VC_ERROR_NONE;
200 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
202 if (0 != __vc_cmd_get_feature_enabled()) {
203 return VC_ERROR_NOT_SUPPORTED;
205 if (0 != __vc_cmd_check_privilege()) {
206 return VC_ERROR_PERMISSION_DENIED;
209 if (NULL == vc_cmd_list || NULL == count) {
210 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
211 return VC_ERROR_INVALID_PARAMETER;
214 vc_cmd_list_s* list = NULL;
215 list = (vc_cmd_list_s*)vc_cmd_list;
217 *count = g_slist_length(list->list);
219 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
221 return VC_ERROR_NONE;
224 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
226 if (0 != __vc_cmd_get_feature_enabled()) {
227 return VC_ERROR_NOT_SUPPORTED;
229 if (0 != __vc_cmd_check_privilege()) {
230 return VC_ERROR_PERMISSION_DENIED;
233 if (NULL == vc_cmd_list || NULL == vc_command) {
234 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
235 return VC_ERROR_INVALID_PARAMETER;
238 vc_cmd_list_s* list = NULL;
239 list = (vc_cmd_list_s*)vc_cmd_list;
241 vc_cmd_s* cmd = NULL;
242 cmd = (vc_cmd_s*)vc_command;
244 list->list = g_slist_append(list->list, cmd);
246 if (1 == g_slist_length(list->list)) {
250 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
252 return VC_ERROR_NONE;
255 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
257 if (0 != __vc_cmd_get_feature_enabled()) {
258 return VC_ERROR_NOT_SUPPORTED;
260 if (0 != __vc_cmd_check_privilege()) {
261 return VC_ERROR_PERMISSION_DENIED;
264 if (NULL == vc_cmd_list || NULL == vc_command) {
265 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
266 return VC_ERROR_INVALID_PARAMETER;
269 vc_cmd_list_s* list = NULL;
270 list = (vc_cmd_list_s*)vc_cmd_list;
272 vc_cmd_s* cmd = NULL;
273 cmd = (vc_cmd_s*)vc_command;
275 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
277 vc_cmd_s* temp_cmd = NULL;
280 iter = g_slist_nth(list->list, 0);
282 while (NULL != iter) {
283 temp_cmd = iter->data;
285 if (NULL != temp_cmd && cmd == temp_cmd) {
286 list->list = g_slist_remove(list->list, temp_cmd);
288 if (true == release_command) {
289 SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data");
290 if (NULL != temp_cmd->command) free(temp_cmd->command);
291 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
298 iter = g_slist_next(iter);
301 int count = g_slist_length(list->list);
305 } else if (list->index == count) {
306 list->index = count - 1;
309 return VC_ERROR_NONE;
312 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
314 if (0 != __vc_cmd_get_feature_enabled()) {
315 return VC_ERROR_NOT_SUPPORTED;
317 if (0 != __vc_cmd_check_privilege()) {
318 return VC_ERROR_PERMISSION_DENIED;
321 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Destroy all command");
323 if (NULL == vc_cmd_list) {
324 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
325 return VC_ERROR_INVALID_PARAMETER;
328 vc_cmd_list_s* list = NULL;
329 list = (vc_cmd_list_s*)vc_cmd_list;
331 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
332 , list, release_command ? "true" : "false");
334 int count = g_slist_length(list->list);
339 for (i = 0; i < count ; i++) {
340 temp_cmd = g_slist_nth_data(list->list, 0);
342 if (NULL != temp_cmd) {
343 list->list = g_slist_remove(list->list, temp_cmd);
345 if (true == release_command) {
346 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd);
347 if (NULL != temp_cmd->command) free(temp_cmd->command);
348 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
357 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
358 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
360 return VC_ERROR_NONE;
363 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
365 if (0 != __vc_cmd_get_feature_enabled()) {
366 return VC_ERROR_NOT_SUPPORTED;
368 if (0 != __vc_cmd_check_privilege()) {
369 return VC_ERROR_PERMISSION_DENIED;
372 if (NULL == vc_cmd_list) {
373 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
374 return VC_ERROR_INVALID_PARAMETER;
377 vc_cmd_list_s* list = NULL;
378 list = (vc_cmd_list_s*)vc_cmd_list;
380 int count = g_slist_length(list->list);
386 iter = g_slist_nth(list->list, 0);
388 for (i = 0; i < count; i++) {
390 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
391 return VC_ERROR_OPERATION_FAILED;
394 temp_cmd = iter->data;
396 if (NULL != temp_cmd) {
397 if (false == callback((vc_cmd_h)temp_cmd, user_data)) {
402 iter = g_slist_next(iter);
405 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Foreach commands Done");
407 return VC_ERROR_NONE;
410 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
412 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Filter by type");
414 if (0 != __vc_cmd_get_feature_enabled()) {
415 return VC_ERROR_NOT_SUPPORTED;
417 if (0 != __vc_cmd_check_privilege()) {
418 return VC_ERROR_PERMISSION_DENIED;
421 if (NULL == original) {
422 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
423 return VC_ERROR_INVALID_PARAMETER;
426 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
427 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
428 return VC_ERROR_INVALID_PARAMETER;
431 vc_cmd_list_s* list = NULL;
432 list = (vc_cmd_list_s*)original;
434 vc_cmd_list_h temp_list;
435 if (0 != vc_cmd_list_create(&temp_list)) {
436 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
437 return VC_ERROR_OPERATION_FAILED;
440 int count = g_slist_length(list->list);
446 iter = g_slist_nth(list->list, 0);
448 for (i = 0; i < count; i++) {
450 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
451 return VC_ERROR_OPERATION_FAILED;
453 if (NULL != iter->data) {
454 iter_cmd = iter->data;
456 if (NULL != iter_cmd) {
458 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
459 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
463 if (iter_type == type) {
465 if (0 != vc_cmd_create(&temp_cmd)) {
466 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
470 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
471 if (NULL != iter_cmd->command) {
472 ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
474 if (NULL != iter_cmd->parameter) {
475 ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
478 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
479 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
480 vc_cmd_destroy(temp_cmd);
486 iter = g_slist_next(iter);
490 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
491 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
493 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
496 *filtered = temp_list;
498 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
500 return VC_ERROR_NONE;
503 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
505 if (0 != __vc_cmd_get_feature_enabled()) {
506 return VC_ERROR_NOT_SUPPORTED;
508 if (0 != __vc_cmd_check_privilege()) {
509 return VC_ERROR_PERMISSION_DENIED;
512 if (NULL == vc_cmd_list) {
513 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
514 return VC_ERROR_INVALID_PARAMETER;
517 vc_cmd_list_s* list = NULL;
518 list = (vc_cmd_list_s*)vc_cmd_list;
520 if (0 == g_slist_length(list->list)) {
521 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
522 return VC_ERROR_EMPTY;
527 return VC_ERROR_NONE;
530 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
532 if (0 != __vc_cmd_get_feature_enabled()) {
533 return VC_ERROR_NOT_SUPPORTED;
535 if (0 != __vc_cmd_check_privilege()) {
536 return VC_ERROR_PERMISSION_DENIED;
539 if (NULL == vc_cmd_list) {
540 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
541 return VC_ERROR_INVALID_PARAMETER;
544 vc_cmd_list_s* list = NULL;
545 list = (vc_cmd_list_s*)vc_cmd_list;
547 int count = g_slist_length(list->list);
550 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
551 return VC_ERROR_EMPTY;
553 list->index = count - 1;
554 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
557 return VC_ERROR_NONE;
560 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
562 if (0 != __vc_cmd_get_feature_enabled()) {
563 return VC_ERROR_NOT_SUPPORTED;
565 if (0 != __vc_cmd_check_privilege()) {
566 return VC_ERROR_PERMISSION_DENIED;
569 if (NULL == vc_cmd_list) {
570 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
571 return VC_ERROR_INVALID_PARAMETER;
574 vc_cmd_list_s* list = NULL;
575 list = (vc_cmd_list_s*)vc_cmd_list;
577 int count = g_slist_length(list->list);
579 if (list->index < count - 1) {
580 list->index = list->index + 1;
581 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
583 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
584 return VC_ERROR_ITERATION_END;
587 return VC_ERROR_NONE;
590 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
592 if (0 != __vc_cmd_get_feature_enabled()) {
593 return VC_ERROR_NOT_SUPPORTED;
595 if (0 != __vc_cmd_check_privilege()) {
596 return VC_ERROR_PERMISSION_DENIED;
599 if (NULL == vc_cmd_list) {
600 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
601 return VC_ERROR_INVALID_PARAMETER;
604 vc_cmd_list_s* list = NULL;
605 list = (vc_cmd_list_s*)vc_cmd_list;
607 if (list->index > 0) {
608 list->index = list->index - 1;
609 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
611 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
612 return VC_ERROR_ITERATION_END;
615 return VC_ERROR_NONE;
618 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
620 if (0 != __vc_cmd_get_feature_enabled()) {
621 return VC_ERROR_NOT_SUPPORTED;
623 if (0 != __vc_cmd_check_privilege()) {
624 return VC_ERROR_PERMISSION_DENIED;
627 if (NULL == vc_cmd_list || NULL == vc_command) {
628 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
629 return VC_ERROR_INVALID_PARAMETER;
632 vc_cmd_list_s* list = NULL;
633 list = (vc_cmd_list_s*)vc_cmd_list;
635 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
637 if (0 == g_slist_length(list->list)) {
638 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
640 return VC_ERROR_EMPTY;
643 vc_cmd_s *temp_cmd = NULL;
644 temp_cmd = g_slist_nth_data(list->list, list->index);
646 *vc_command = (vc_cmd_h)temp_cmd;
648 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
650 return VC_ERROR_NONE;
654 int vc_cmd_create(vc_cmd_h* vc_command)
656 if (0 != __vc_cmd_get_feature_enabled()) {
657 return VC_ERROR_NOT_SUPPORTED;
659 if (0 != __vc_cmd_check_privilege()) {
660 return VC_ERROR_PERMISSION_DENIED;
663 if (NULL == vc_command) {
664 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
665 return VC_ERROR_INVALID_PARAMETER;
668 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
670 if (NULL == command) {
671 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
672 return VC_ERROR_OUT_OF_MEMORY;
678 command->type = VC_COMMAND_TYPE_NONE;
679 command->format = VC_CMD_FORMAT_FIXED;
680 command->command = NULL;
681 command->parameter = NULL;
683 command->priority = 0;
684 command->key = VC_KEY_NONE;
685 command->modifier = VC_MODIFIER_NONE;
687 *vc_command = (vc_cmd_h)command;
689 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
691 return VC_ERROR_NONE;
694 int vc_cmd_destroy(vc_cmd_h vc_command)
696 if (0 != __vc_cmd_get_feature_enabled()) {
697 return VC_ERROR_NOT_SUPPORTED;
699 if (0 != __vc_cmd_check_privilege()) {
700 return VC_ERROR_PERMISSION_DENIED;
703 if (NULL == vc_command) {
704 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
705 return VC_ERROR_INVALID_PARAMETER;
708 vc_cmd_s* command = NULL;
709 command = (vc_cmd_s*)vc_command;
711 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
713 if (NULL != command) {
714 if (NULL != command->command) free(command->command);
715 if (NULL != command->parameter) free(command->parameter);
720 return VC_ERROR_NONE;
723 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
725 if (0 != __vc_cmd_get_feature_enabled()) {
726 return VC_ERROR_NOT_SUPPORTED;
728 if (0 != __vc_cmd_check_privilege()) {
729 return VC_ERROR_PERMISSION_DENIED;
732 if (NULL == vc_command) {
733 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
734 return VC_ERROR_INVALID_PARAMETER;
737 vc_cmd_s* cmd = NULL;
738 cmd = (vc_cmd_s*)vc_command;
742 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
748 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
750 if (0 != __vc_cmd_get_feature_enabled()) {
751 return VC_ERROR_NOT_SUPPORTED;
753 if (0 != __vc_cmd_check_privilege()) {
754 return VC_ERROR_PERMISSION_DENIED;
757 if (NULL == vc_command || NULL == id) {
758 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
759 return VC_ERROR_INVALID_PARAMETER;
762 vc_cmd_s* cmd = NULL;
763 cmd = (vc_cmd_s*)vc_command;
767 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
773 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
775 if (0 != __vc_cmd_get_feature_enabled()) {
776 return VC_ERROR_NOT_SUPPORTED;
779 if (NULL == vc_command) {
780 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
781 return VC_ERROR_INVALID_PARAMETER;
785 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
786 return VC_ERROR_INVALID_PARAMETER;
789 vc_cmd_s* cmd = NULL;
790 cmd = (vc_cmd_s*)vc_command;
792 if (NULL != cmd->appid) {
797 cmd->appid = strdup(appid);
799 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
803 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
805 if (0 != __vc_cmd_get_feature_enabled()) {
806 return VC_ERROR_NOT_SUPPORTED;
809 if (NULL == vc_command || NULL == appid) {
810 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
811 return VC_ERROR_INVALID_PARAMETER;
814 vc_cmd_s* cmd = NULL;
815 cmd = (vc_cmd_s*)vc_command;
817 if (NULL != cmd->appid) {
818 *appid = strdup(gettext(cmd->appid));
821 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
825 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
827 if (0 != __vc_cmd_get_feature_enabled()) {
828 return VC_ERROR_NOT_SUPPORTED;
830 if (0 != __vc_cmd_check_privilege()) {
831 return VC_ERROR_PERMISSION_DENIED;
834 if (NULL == vc_command) {
835 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
836 return VC_ERROR_INVALID_PARAMETER;
839 vc_cmd_s* cmd = NULL;
840 cmd = (vc_cmd_s*)vc_command;
842 if (NULL != cmd->command) {
848 if (NULL != command) {
849 cmd->command = strdup(command);
852 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
857 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
859 if (0 != __vc_cmd_get_feature_enabled()) {
860 return VC_ERROR_NOT_SUPPORTED;
862 if (0 != __vc_cmd_check_privilege()) {
863 return VC_ERROR_PERMISSION_DENIED;
866 if (NULL == vc_command || NULL == command) {
867 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
868 return VC_ERROR_INVALID_PARAMETER;
871 vc_cmd_s* cmd = NULL;
872 cmd = (vc_cmd_s*)vc_command;
874 if (NULL != cmd->command) {
875 *command = strdup(gettext(cmd->command));
878 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
883 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
885 if (0 != __vc_cmd_get_feature_enabled()) {
886 return VC_ERROR_NOT_SUPPORTED;
888 if (0 != __vc_cmd_check_privilege()) {
889 return VC_ERROR_PERMISSION_DENIED;
892 if (NULL == vc_command) {
893 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
894 return VC_ERROR_INVALID_PARAMETER;
897 vc_cmd_s* cmd = NULL;
898 cmd = (vc_cmd_s*)vc_command;
900 if (NULL != cmd->parameter) {
901 free(cmd->parameter);
904 cmd->parameter = NULL;
906 if (NULL != command) {
907 cmd->parameter = strdup(command);
908 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
914 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
916 if (0 != __vc_cmd_get_feature_enabled()) {
917 return VC_ERROR_NOT_SUPPORTED;
919 if (0 != __vc_cmd_check_privilege()) {
920 return VC_ERROR_PERMISSION_DENIED;
923 if (NULL == vc_command || NULL == command) {
924 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
925 return VC_ERROR_INVALID_PARAMETER;
928 vc_cmd_s* cmd = NULL;
929 cmd = (vc_cmd_s*)vc_command;
931 if (NULL != cmd->parameter) {
932 *command = strdup(gettext(cmd->parameter));
933 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
939 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
941 if (0 != __vc_cmd_get_feature_enabled()) {
942 return VC_ERROR_NOT_SUPPORTED;
945 if (NULL == vc_command) {
946 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
947 return VC_ERROR_INVALID_PARAMETER;
951 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
952 return VC_ERROR_INVALID_PARAMETER;
955 vc_cmd_s* cmd = NULL;
956 cmd = (vc_cmd_s*)vc_command;
958 if (NULL != cmd->fixed) {
963 cmd->fixed = strdup(fixed);
965 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
969 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
971 if (0 != __vc_cmd_get_feature_enabled()) {
972 return VC_ERROR_NOT_SUPPORTED;
975 if (NULL == vc_command || NULL == fixed) {
976 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
977 return VC_ERROR_INVALID_PARAMETER;
980 vc_cmd_s* cmd = NULL;
981 cmd = (vc_cmd_s*)vc_command;
983 if (NULL != cmd->fixed) {
984 *fixed = strdup(gettext(cmd->fixed));
985 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
991 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
993 if (0 != __vc_cmd_get_feature_enabled()) {
994 return VC_ERROR_NOT_SUPPORTED;
997 if (NULL == vc_command) {
998 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
999 return VC_ERROR_INVALID_PARAMETER;
1002 if (NULL == invocation_name) {
1003 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1004 return VC_ERROR_INVALID_PARAMETER;
1007 vc_cmd_s* cmd = NULL;
1008 cmd = (vc_cmd_s*)vc_command;
1010 if (NULL != cmd->invocation_name) {
1011 free(cmd->invocation_name);
1012 cmd->invocation_name = NULL;
1015 cmd->invocation_name = strdup(invocation_name);
1017 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1021 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1023 if (0 != __vc_cmd_get_feature_enabled()) {
1024 return VC_ERROR_NOT_SUPPORTED;
1027 if (NULL == vc_command || NULL == invocation_name) {
1028 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1029 return VC_ERROR_INVALID_PARAMETER;
1032 vc_cmd_s* cmd = NULL;
1033 cmd = (vc_cmd_s*)vc_command;
1035 if (NULL != cmd->invocation_name) {
1036 *invocation_name = strdup(gettext(cmd->invocation_name));
1039 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1043 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1045 if (0 != __vc_cmd_get_feature_enabled()) {
1046 return VC_ERROR_NOT_SUPPORTED;
1048 if (0 != __vc_cmd_check_privilege()) {
1049 return VC_ERROR_PERMISSION_DENIED;
1052 if (NULL == vc_command) {
1053 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1054 return VC_ERROR_INVALID_PARAMETER;
1057 vc_cmd_s* cmd = NULL;
1058 cmd = (vc_cmd_s*)vc_command;
1062 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1067 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1069 if (0 != __vc_cmd_get_feature_enabled()) {
1070 return VC_ERROR_NOT_SUPPORTED;
1072 if (0 != __vc_cmd_check_privilege()) {
1073 return VC_ERROR_PERMISSION_DENIED;
1076 if (NULL == vc_command || NULL == type) {
1077 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1078 return VC_ERROR_INVALID_PARAMETER;
1081 vc_cmd_s* cmd = NULL;
1082 cmd = (vc_cmd_s*)vc_command;
1086 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1091 int vc_cmd_set_format(vc_cmd_h vc_command, vc_cmd_format_e format)
1093 if (0 != __vc_cmd_get_feature_enabled()) {
1094 return VC_ERROR_NOT_SUPPORTED;
1096 if (0 != __vc_cmd_check_privilege()) {
1097 return VC_ERROR_PERMISSION_DENIED;
1100 if (NULL == vc_command) {
1101 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1102 return VC_ERROR_INVALID_PARAMETER;
1105 vc_cmd_s* cmd = NULL;
1106 cmd = (vc_cmd_s*)vc_command;
1108 cmd->format = format;
1110 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1115 int vc_cmd_get_format(vc_cmd_h vc_command, vc_cmd_format_e* format)
1117 if (0 != __vc_cmd_get_feature_enabled()) {
1118 return VC_ERROR_NOT_SUPPORTED;
1120 if (0 != __vc_cmd_check_privilege()) {
1121 return VC_ERROR_PERMISSION_DENIED;
1124 if (NULL == vc_command || NULL == format) {
1125 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1126 return VC_ERROR_INVALID_PARAMETER;
1129 vc_cmd_s* cmd = NULL;
1130 cmd = (vc_cmd_s*)vc_command;
1132 *format = cmd->format;
1134 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1139 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1141 if (0 != __vc_cmd_get_feature_enabled()) {
1142 return VC_ERROR_NOT_SUPPORTED;
1144 if (0 != __vc_cmd_check_privilege()) {
1145 return VC_ERROR_PERMISSION_DENIED;
1148 if (NULL == vc_command) {
1149 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1150 return VC_ERROR_INVALID_PARAMETER;
1153 vc_cmd_s* cmd = NULL;
1154 cmd = (vc_cmd_s*)vc_command;
1158 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1163 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1165 if (0 != __vc_cmd_get_feature_enabled()) {
1166 return VC_ERROR_NOT_SUPPORTED;
1168 if (0 != __vc_cmd_check_privilege()) {
1169 return VC_ERROR_PERMISSION_DENIED;
1172 if (NULL == vc_command || NULL == pid) {
1173 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1174 return VC_ERROR_INVALID_PARAMETER;
1177 vc_cmd_s* cmd = NULL;
1178 cmd = (vc_cmd_s*)vc_command;
1182 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1187 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1189 if (0 != __vc_cmd_get_feature_enabled()) {
1190 return VC_ERROR_NOT_SUPPORTED;
1192 if (0 != __vc_cmd_check_privilege()) {
1193 return VC_ERROR_PERMISSION_DENIED;
1196 if (NULL == vc_command) {
1197 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1198 return VC_ERROR_INVALID_PARAMETER;
1201 vc_cmd_s* cmd = NULL;
1202 cmd = (vc_cmd_s*)vc_command;
1204 cmd->domain = domain;
1206 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1211 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1213 if (0 != __vc_cmd_get_feature_enabled()) {
1214 return VC_ERROR_NOT_SUPPORTED;
1216 if (0 != __vc_cmd_check_privilege()) {
1217 return VC_ERROR_PERMISSION_DENIED;
1220 if (NULL == vc_command || NULL == domain) {
1221 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1222 return VC_ERROR_INVALID_PARAMETER;
1225 vc_cmd_s* cmd = NULL;
1226 cmd = (vc_cmd_s*)vc_command;
1228 *domain = cmd->domain;
1230 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1236 * @brief Sets key value of command.
1238 * @param[in] vc_command Command handle
1239 * @param[in] key key value
1240 * @param[in] modifier modifier value
1242 * @return 0 on success, otherwise a negative error value
1243 * @retval #VC_ERROR_NONE Successful
1244 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1246 * @see vc_cmd_get_result_key()
1248 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1250 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Set result key");
1252 if (NULL == vc_command) {
1253 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1254 return VC_ERROR_INVALID_PARAMETER;
1257 vc_cmd_s* cmd = NULL;
1258 cmd = (vc_cmd_s*)vc_command;
1260 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1263 cmd->modifier = modifier;
1265 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1266 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1272 * @brief Gets key value of command.
1274 * @param[in] vc_command Command handle
1275 * @param[out] key key value
1276 * @param[out] modifier modifier value
1278 * @return 0 on success, otherwise a negative error value
1279 * @retval #VC_ERROR_NONE Successful
1280 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1282 * @see vc_cmd_add_result_key()
1284 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1286 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Get result key");
1288 if (NULL == vc_command || NULL == key || NULL == modifier) {
1289 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1290 return VC_ERROR_INVALID_PARAMETER;
1293 vc_cmd_s* cmd = NULL;
1294 cmd = (vc_cmd_s*)vc_command;
1297 *modifier = cmd->modifier;
1299 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1300 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1305 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1307 if (NULL == vc_cmd_list) {
1311 vc_cmd_list_s* list = NULL;
1312 list = (vc_cmd_list_s*)vc_cmd_list;
1314 SLOG(LOG_DEBUG, TAG_VCCMD, "=== Command List ===");
1315 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1317 int count = g_slist_length(list->list);
1320 vc_cmd_s *cmd = NULL;
1322 for (i = 0; i < count ; i++) {
1323 cmd = g_slist_nth_data(list->list, i);
1326 SLOG(LOG_DEBUG, TAG_VCCMD, " [%d][%p] PID(%d) ID(%d) Type(%d) Format(%d) Command(%s) Param(%s) Appid(%s) Invocation(%s) Fixed(%s)",
1327 i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1331 SLOG(LOG_DEBUG, TAG_VCCMD, "==================");
1332 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1337 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1339 if (0 != __vc_cmd_get_feature_enabled()) {
1340 return VC_ERROR_NOT_SUPPORTED;
1343 if (NULL == vc_cmd || NULL == json) {
1344 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NULL parameter");
1345 return VC_ERROR_INVALID_PARAMETER;
1348 vc_cmd_s* cmd = NULL;
1349 cmd = (vc_cmd_s*)vc_cmd;
1351 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1352 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not Action format");
1353 return VC_ERROR_INVALID_PARAMETER;
1356 if (0 != vc_info_parser_get_nlu_result(json)) {
1357 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nlu result");
1358 return VC_ERROR_OPERATION_FAILED;