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.
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
24 #include <system_info.h>
26 #include "vc_command.h"
27 #include "vc_info_parser.h"
29 #include "vc_regex_rule.h"
30 #include "vc_config_mgr.h"
31 #include "voice_control_command.h"
32 #include "voice_control_command_expand.h"
33 #include "voice_control_common.h"
34 #include "voice_control_key_defines.h"
36 static int g_feature_enabled = -1;
37 static bool g_privilege_allowed = false;
39 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
40 static cynara *p_cynara = NULL;
41 static GList *g_cmd_list = NULL;
42 static GList *g_cmdlist_list = NULL;
45 // For getting timestamp using regular expression
46 static regex_t reg[MAX_NUM_REGEX];
47 static time_t t_now; //time_t is based on UTC
48 static struct tm td_now; //if use localtime function, the value follows the local time zone, otherwise it follows the UTC.
50 static int g_time_flag;
51 static int g_date_flag;
53 static int g_data_sidx;
54 static int g_data_eidx;
56 static int __vc_cmd_get_feature_enabled()
58 if (0 == g_feature_enabled) {
59 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
60 return VC_ERROR_NOT_SUPPORTED;
61 } else if (-1 == g_feature_enabled) {
62 bool vc_supported = false;
63 bool mic_supported = false;
64 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
65 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
66 if (false == vc_supported || false == mic_supported) {
67 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
68 g_feature_enabled = 0;
69 return VC_ERROR_NOT_SUPPORTED;
72 g_feature_enabled = 1;
74 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
75 return VC_ERROR_NOT_SUPPORTED;
78 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
79 return VC_ERROR_NOT_SUPPORTED;
86 static int __check_privilege_initialize()
88 int ret = cynara_initialize(&p_cynara, NULL);
89 if (CYNARA_API_SUCCESS != ret)
90 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
92 return ret == CYNARA_API_SUCCESS;
95 static int __check_privilege(const char* uid, const char * privilege)
98 char label_path[1024] = "/proc/self/attr/current";
99 char smack_label[1024] = {'\0',};
105 fp = fopen(label_path, "r");
107 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
108 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
113 pid_t pid = getpid();
114 char *session = cynara_session_from_pid(pid);
115 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
116 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
120 if (ret != CYNARA_API_ACCESS_ALLOWED)
125 static void __check_privilege_deinitialize()
129 int ret = cynara_finish(p_cynara);
130 if (ret != CYNARA_API_SUCCESS)
131 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] cynara finish %d", ret);
136 static int __vc_cmd_check_privilege()
138 pthread_mutex_lock(&g_cynara_mutex);
140 if (false == g_privilege_allowed) {
142 ret = __check_privilege_initialize();
144 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
145 g_privilege_allowed = false;
146 pthread_mutex_unlock(&g_cynara_mutex);
147 return VC_ERROR_PERMISSION_DENIED;
151 snprintf(uid, 16, "%d", getuid());
153 ret = __check_privilege(uid, VC_PRIVILEGE);
154 __check_privilege_deinitialize();
156 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
157 g_privilege_allowed = false;
158 pthread_mutex_unlock(&g_cynara_mutex);
159 return VC_ERROR_PERMISSION_DENIED;
163 g_privilege_allowed = true;
164 pthread_mutex_unlock(&g_cynara_mutex);
165 return VC_ERROR_NONE;
168 static bool __vc_cmd_is_valid(vc_cmd_h vc_command)
170 if (NULL == g_cmd_list) {
171 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid");
175 if (g_list_length(g_cmd_list) == 0) {
176 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid");
181 vc_cmd_s *command = NULL;
182 command = (vc_cmd_s *)vc_command;
185 iter = g_list_first(g_cmd_list);
186 while (NULL != iter) {
187 vc_cmd_s *data = NULL;
189 if (NULL != data && command == data) {
193 iter = g_list_next(iter);
197 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] command(%p) is not valid", command);
202 static bool __vc_cmd_list_is_valid(vc_cmd_list_h vc_cmd_list)
204 if (NULL == g_cmdlist_list) {
205 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid");
209 if (g_list_length(g_cmdlist_list) == 0) {
210 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid");
215 vc_cmd_list_s *list = NULL;
216 list = (vc_cmd_list_s *)vc_cmd_list;
219 iter = g_list_first(g_cmdlist_list);
220 while (NULL != iter) {
221 vc_cmd_list_s *data = NULL;
223 if (NULL != data && list == data) {
227 iter = g_list_next(iter);
231 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] list(%p) is not valid", list);
236 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
238 if (0 != __vc_cmd_get_feature_enabled()) {
239 return VC_ERROR_NOT_SUPPORTED;
241 if (0 != __vc_cmd_check_privilege()) {
242 return VC_ERROR_PERMISSION_DENIED;
245 if (NULL == vc_cmd_list) {
246 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
247 return VC_ERROR_INVALID_PARAMETER;
250 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
253 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
254 return VC_ERROR_OUT_OF_MEMORY;
260 *vc_cmd_list = (vc_cmd_list_h)list;
262 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
264 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
266 return VC_ERROR_NONE;
269 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
271 if (0 != __vc_cmd_get_feature_enabled()) {
272 return VC_ERROR_NOT_SUPPORTED;
274 if (0 != __vc_cmd_check_privilege()) {
275 return VC_ERROR_PERMISSION_DENIED;
278 if (NULL == vc_cmd_list) {
279 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
280 return VC_ERROR_INVALID_PARAMETER;
283 if (false == __vc_cmd_list_is_valid(vc_cmd_list)) {
284 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
285 return VC_ERROR_INVALID_PARAMETER;
288 vc_cmd_list_remove_all(vc_cmd_list, release_command);
290 vc_cmd_list_s* list = NULL;
291 list = (vc_cmd_list_s*)vc_cmd_list;
293 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
296 vc_cmd_list_s *data = NULL;
298 /* if list have item */
299 if (g_list_length(g_cmdlist_list) > 0) {
300 /* Get a first item */
301 iter = g_list_first(g_cmdlist_list);
303 while (NULL != iter) {
305 if (NULL != data && list == data) {
306 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
311 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
315 return VC_ERROR_NONE;
318 iter = g_list_next(iter);
321 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
323 return VC_ERROR_INVALID_PARAMETER;
326 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
328 if (0 != __vc_cmd_get_feature_enabled()) {
329 return VC_ERROR_NOT_SUPPORTED;
331 if (0 != __vc_cmd_check_privilege()) {
332 return VC_ERROR_PERMISSION_DENIED;
335 if (NULL == vc_cmd_list || NULL == count) {
336 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
337 return VC_ERROR_INVALID_PARAMETER;
340 vc_cmd_list_s* list = NULL;
341 list = (vc_cmd_list_s*)vc_cmd_list;
343 *count = g_slist_length(list->list);
345 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
347 return VC_ERROR_NONE;
350 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
352 if (0 != __vc_cmd_get_feature_enabled()) {
353 return VC_ERROR_NOT_SUPPORTED;
355 if (0 != __vc_cmd_check_privilege()) {
356 return VC_ERROR_PERMISSION_DENIED;
359 if (NULL == vc_cmd_list || NULL == vc_command) {
360 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
361 return VC_ERROR_INVALID_PARAMETER;
364 vc_cmd_list_s* list = NULL;
365 list = (vc_cmd_list_s*)vc_cmd_list;
367 vc_cmd_s* cmd = NULL;
368 cmd = (vc_cmd_s*)vc_command;
370 list->list = g_slist_append(list->list, cmd);
372 if (1 == g_slist_length(list->list)) {
376 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
378 return VC_ERROR_NONE;
381 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
383 if (0 != __vc_cmd_get_feature_enabled()) {
384 return VC_ERROR_NOT_SUPPORTED;
386 if (0 != __vc_cmd_check_privilege()) {
387 return VC_ERROR_PERMISSION_DENIED;
390 if (NULL == vc_cmd_list || NULL == vc_command) {
391 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
392 return VC_ERROR_INVALID_PARAMETER;
395 vc_cmd_list_s* list = NULL;
396 list = (vc_cmd_list_s*)vc_cmd_list;
398 vc_cmd_s* cmd = NULL;
399 cmd = (vc_cmd_s*)vc_command;
401 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
403 vc_cmd_s* temp_cmd = NULL;
406 iter = g_slist_nth(list->list, 0);
408 while (NULL != iter) {
409 temp_cmd = iter->data;
411 if (NULL != temp_cmd && cmd == temp_cmd) {
412 list->list = g_slist_remove(list->list, temp_cmd);
414 if (true == release_command) {
415 SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data");
416 if (NULL != temp_cmd->command) free(temp_cmd->command);
417 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
424 iter = g_slist_next(iter);
427 int count = g_slist_length(list->list);
431 } else if (list->index == count) {
432 list->index = count - 1;
435 return VC_ERROR_NONE;
438 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
440 if (0 != __vc_cmd_get_feature_enabled()) {
441 return VC_ERROR_NOT_SUPPORTED;
443 if (0 != __vc_cmd_check_privilege()) {
444 return VC_ERROR_PERMISSION_DENIED;
447 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
449 if (NULL == vc_cmd_list) {
450 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
451 return VC_ERROR_INVALID_PARAMETER;
454 vc_cmd_list_s* list = NULL;
455 list = (vc_cmd_list_s*)vc_cmd_list;
457 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
458 , list, release_command ? "true" : "false");
460 int count = g_slist_length(list->list);
461 for (int i = 0; i < count ; i++) {
462 vc_cmd_s *temp_cmd = g_slist_nth_data(list->list, 0);
464 if (NULL != temp_cmd) {
465 list->list = g_slist_remove(list->list, temp_cmd);
467 if (true == release_command) {
468 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd);
469 if (NULL != temp_cmd->command) free(temp_cmd->command);
470 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
471 if (NULL != temp_cmd->appid) free(temp_cmd->appid);
472 if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name);
473 if (NULL != temp_cmd->fixed) free(temp_cmd->fixed);
482 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
484 return VC_ERROR_NONE;
487 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
489 if (0 != __vc_cmd_get_feature_enabled()) {
490 return VC_ERROR_NOT_SUPPORTED;
492 if (0 != __vc_cmd_check_privilege()) {
493 return VC_ERROR_PERMISSION_DENIED;
496 if (NULL == vc_cmd_list) {
497 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
498 return VC_ERROR_INVALID_PARAMETER;
501 vc_cmd_list_s* list = NULL;
502 list = (vc_cmd_list_s*)vc_cmd_list;
504 int count = g_slist_length(list->list);
510 iter = g_slist_nth(list->list, 0);
512 for (i = 0; i < count; i++) {
514 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
515 return VC_ERROR_OPERATION_FAILED;
518 temp_cmd = iter->data;
520 if (NULL != temp_cmd) {
521 if (false == callback((vc_cmd_h)temp_cmd, user_data)) {
526 iter = g_slist_next(iter);
529 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
531 return VC_ERROR_NONE;
534 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
536 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
538 if (0 != __vc_cmd_get_feature_enabled()) {
539 return VC_ERROR_NOT_SUPPORTED;
541 if (0 != __vc_cmd_check_privilege()) {
542 return VC_ERROR_PERMISSION_DENIED;
545 if (NULL == original) {
546 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
547 return VC_ERROR_INVALID_PARAMETER;
550 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
551 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
552 return VC_ERROR_INVALID_PARAMETER;
555 vc_cmd_list_s* list = NULL;
556 list = (vc_cmd_list_s*)original;
558 vc_cmd_list_h temp_list;
559 if (0 != vc_cmd_list_create(&temp_list)) {
560 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
561 return VC_ERROR_OPERATION_FAILED;
564 int count = g_slist_length(list->list);
570 iter = g_slist_nth(list->list, 0);
572 for (i = 0; i < count; i++) {
574 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
575 return VC_ERROR_OPERATION_FAILED;
577 if (NULL != iter->data) {
578 iter_cmd = iter->data;
580 if (NULL != iter_cmd) {
582 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
583 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
587 if (iter_type == type) {
589 if (0 != vc_cmd_create(&temp_cmd)) {
590 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
594 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
595 if (NULL != iter_cmd->command) {
596 ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
598 if (NULL != iter_cmd->parameter) {
599 ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
602 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
603 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
604 vc_cmd_destroy(temp_cmd);
610 iter = g_slist_next(iter);
614 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
615 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
617 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
620 *filtered = temp_list;
622 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
624 return VC_ERROR_NONE;
627 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
629 if (0 != __vc_cmd_get_feature_enabled()) {
630 return VC_ERROR_NOT_SUPPORTED;
632 if (0 != __vc_cmd_check_privilege()) {
633 return VC_ERROR_PERMISSION_DENIED;
636 if (NULL == vc_cmd_list) {
637 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
638 return VC_ERROR_INVALID_PARAMETER;
641 vc_cmd_list_s* list = NULL;
642 list = (vc_cmd_list_s*)vc_cmd_list;
644 if (0 == g_slist_length(list->list)) {
645 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
646 return VC_ERROR_EMPTY;
651 return VC_ERROR_NONE;
654 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
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_cmd_list) {
664 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
665 return VC_ERROR_INVALID_PARAMETER;
668 vc_cmd_list_s* list = NULL;
669 list = (vc_cmd_list_s*)vc_cmd_list;
671 int count = g_slist_length(list->list);
674 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
675 return VC_ERROR_EMPTY;
677 list->index = count - 1;
678 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
681 return VC_ERROR_NONE;
684 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
686 if (0 != __vc_cmd_get_feature_enabled()) {
687 return VC_ERROR_NOT_SUPPORTED;
689 if (0 != __vc_cmd_check_privilege()) {
690 return VC_ERROR_PERMISSION_DENIED;
693 if (NULL == vc_cmd_list) {
694 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
695 return VC_ERROR_INVALID_PARAMETER;
698 vc_cmd_list_s* list = NULL;
699 list = (vc_cmd_list_s*)vc_cmd_list;
701 int count = g_slist_length(list->list);
703 if (list->index < count - 1) {
704 list->index = list->index + 1;
705 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
707 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
708 return VC_ERROR_ITERATION_END;
711 return VC_ERROR_NONE;
714 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
716 if (0 != __vc_cmd_get_feature_enabled()) {
717 return VC_ERROR_NOT_SUPPORTED;
719 if (0 != __vc_cmd_check_privilege()) {
720 return VC_ERROR_PERMISSION_DENIED;
723 if (NULL == vc_cmd_list) {
724 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
725 return VC_ERROR_INVALID_PARAMETER;
728 vc_cmd_list_s* list = NULL;
729 list = (vc_cmd_list_s*)vc_cmd_list;
731 if (list->index > 0) {
732 list->index = list->index - 1;
733 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
735 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
736 return VC_ERROR_ITERATION_END;
739 return VC_ERROR_NONE;
742 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
744 if (0 != __vc_cmd_get_feature_enabled()) {
745 return VC_ERROR_NOT_SUPPORTED;
747 if (0 != __vc_cmd_check_privilege()) {
748 return VC_ERROR_PERMISSION_DENIED;
751 if (NULL == vc_cmd_list || NULL == vc_command) {
752 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
753 return VC_ERROR_INVALID_PARAMETER;
756 vc_cmd_list_s* list = NULL;
757 list = (vc_cmd_list_s*)vc_cmd_list;
759 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
761 if (0 == g_slist_length(list->list)) {
762 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
764 return VC_ERROR_EMPTY;
767 vc_cmd_s *temp_cmd = NULL;
768 temp_cmd = g_slist_nth_data(list->list, list->index);
770 *vc_command = (vc_cmd_h)temp_cmd;
772 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
774 return VC_ERROR_NONE;
778 int vc_cmd_create(vc_cmd_h* vc_command)
780 if (0 != __vc_cmd_get_feature_enabled()) {
781 return VC_ERROR_NOT_SUPPORTED;
783 if (0 != __vc_cmd_check_privilege()) {
784 return VC_ERROR_PERMISSION_DENIED;
787 if (NULL == vc_command) {
788 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
789 return VC_ERROR_INVALID_PARAMETER;
792 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
794 if (NULL == command) {
795 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
796 return VC_ERROR_OUT_OF_MEMORY;
802 command->type = VC_COMMAND_TYPE_NONE;
803 command->format = VC_CMD_FORMAT_FIXED;
804 command->command = NULL;
805 command->parameter = NULL;
807 command->priority = 0;
808 command->key = VC_KEY_NONE;
809 command->modifier = VC_MODIFIER_NONE;
810 command->invocation_name = NULL;
811 command->appid = NULL;
812 command->fixed = NULL;
813 command->coordinates = NULL;
815 *vc_command = (vc_cmd_h)command;
817 g_cmd_list = g_list_append(g_cmd_list, command);
819 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
821 return VC_ERROR_NONE;
824 int vc_cmd_destroy(vc_cmd_h vc_command)
826 if (0 != __vc_cmd_get_feature_enabled()) {
827 return VC_ERROR_NOT_SUPPORTED;
829 if (0 != __vc_cmd_check_privilege()) {
830 return VC_ERROR_PERMISSION_DENIED;
833 if (NULL == vc_command) {
834 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
835 return VC_ERROR_INVALID_PARAMETER;
838 if (false == __vc_cmd_is_valid(vc_command)) {
839 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
840 return VC_ERROR_INVALID_PARAMETER;
843 vc_cmd_s* command = NULL;
844 command = (vc_cmd_s*)vc_command;
846 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
850 iter = g_list_first(g_cmd_list);
851 while (NULL != iter) {
852 vc_cmd_s *data = NULL;
854 if (NULL != data && command == data) {
855 g_cmd_list = g_list_remove_link(g_cmd_list, iter);
859 iter = g_list_next(iter);
863 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
864 return VC_ERROR_INVALID_PARAMETER;
871 if (NULL != command) {
872 if (NULL != command->command) {
873 free(command->command);
874 command->command = NULL;
876 if (NULL != command->parameter) {
877 free(command->parameter);
878 command->parameter = NULL;
880 if (NULL != command->invocation_name) {
881 free(command->invocation_name);
882 command->invocation_name = NULL;
884 if (NULL != command->appid) {
885 free(command->appid);
886 command->appid = NULL;
888 if (NULL != command->fixed) {
889 free(command->fixed);
890 command->fixed = NULL;
892 if (NULL != command->coordinates) {
893 free(command->coordinates);
894 command->coordinates = NULL;
900 return VC_ERROR_NONE;
903 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
905 if (0 != __vc_cmd_get_feature_enabled()) {
906 return VC_ERROR_NOT_SUPPORTED;
908 if (0 != __vc_cmd_check_privilege()) {
909 return VC_ERROR_PERMISSION_DENIED;
912 if (NULL == vc_command) {
913 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
914 return VC_ERROR_INVALID_PARAMETER;
917 vc_cmd_s* cmd = NULL;
918 cmd = (vc_cmd_s*)vc_command;
922 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
928 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
930 if (0 != __vc_cmd_get_feature_enabled()) {
931 return VC_ERROR_NOT_SUPPORTED;
933 if (0 != __vc_cmd_check_privilege()) {
934 return VC_ERROR_PERMISSION_DENIED;
937 if (NULL == vc_command || NULL == id) {
938 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
939 return VC_ERROR_INVALID_PARAMETER;
942 vc_cmd_s* cmd = NULL;
943 cmd = (vc_cmd_s*)vc_command;
947 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
953 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
955 if (0 != __vc_cmd_get_feature_enabled()) {
956 return VC_ERROR_NOT_SUPPORTED;
959 if (NULL == vc_command) {
960 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
961 return VC_ERROR_INVALID_PARAMETER;
965 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
966 return VC_ERROR_INVALID_PARAMETER;
969 vc_cmd_s* cmd = NULL;
970 cmd = (vc_cmd_s*)vc_command;
972 if (NULL != cmd->appid) {
977 cmd->appid = strdup(appid);
979 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
983 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
985 if (0 != __vc_cmd_get_feature_enabled()) {
986 return VC_ERROR_NOT_SUPPORTED;
989 if (NULL == vc_command || NULL == appid) {
990 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
991 return VC_ERROR_INVALID_PARAMETER;
994 vc_cmd_s* cmd = NULL;
995 cmd = (vc_cmd_s*)vc_command;
997 if (NULL != cmd->appid) {
998 *appid = strdup(gettext(cmd->appid));
1001 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
1005 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
1007 if (0 != __vc_cmd_get_feature_enabled()) {
1008 return VC_ERROR_NOT_SUPPORTED;
1010 if (0 != __vc_cmd_check_privilege()) {
1011 return VC_ERROR_PERMISSION_DENIED;
1014 if (NULL == vc_command) {
1015 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1016 return VC_ERROR_INVALID_PARAMETER;
1019 vc_cmd_s* cmd = NULL;
1020 cmd = (vc_cmd_s*)vc_command;
1022 if (NULL != cmd->command) {
1026 cmd->command = NULL;
1028 if (NULL != command) {
1029 cmd->command = strdup(command);
1032 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
1037 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
1039 if (0 != __vc_cmd_get_feature_enabled()) {
1040 return VC_ERROR_NOT_SUPPORTED;
1042 if (0 != __vc_cmd_check_privilege()) {
1043 return VC_ERROR_PERMISSION_DENIED;
1046 if (NULL == vc_command || NULL == command) {
1047 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1048 return VC_ERROR_INVALID_PARAMETER;
1051 vc_cmd_s* cmd = NULL;
1052 cmd = (vc_cmd_s*)vc_command;
1054 if (NULL != cmd->command) {
1055 *command = strdup(gettext(cmd->command));
1058 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
1063 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
1065 if (0 != __vc_cmd_get_feature_enabled()) {
1066 return VC_ERROR_NOT_SUPPORTED;
1068 if (0 != __vc_cmd_check_privilege()) {
1069 return VC_ERROR_PERMISSION_DENIED;
1072 if (NULL == vc_command) {
1073 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1074 return VC_ERROR_INVALID_PARAMETER;
1077 vc_cmd_s* cmd = NULL;
1078 cmd = (vc_cmd_s*)vc_command;
1080 if (NULL != cmd->parameter) {
1081 free(cmd->parameter);
1084 cmd->parameter = NULL;
1086 if (NULL != command) {
1087 cmd->parameter = strdup(command);
1088 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
1094 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
1096 if (0 != __vc_cmd_get_feature_enabled()) {
1097 return VC_ERROR_NOT_SUPPORTED;
1100 if (NULL == vc_command || NULL == command) {
1101 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1102 return VC_ERROR_INVALID_PARAMETER;
1105 vc_cmd_s* cmd = NULL;
1106 cmd = (vc_cmd_s*)vc_command;
1108 if (NULL != cmd->parameter) {
1109 *command = strdup(gettext(cmd->parameter));
1110 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
1116 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
1118 if (0 != __vc_cmd_get_feature_enabled()) {
1119 return VC_ERROR_NOT_SUPPORTED;
1122 if (NULL == vc_command) {
1123 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1124 return VC_ERROR_INVALID_PARAMETER;
1127 if (NULL == fixed) {
1128 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
1129 return VC_ERROR_INVALID_PARAMETER;
1132 vc_cmd_s* cmd = NULL;
1133 cmd = (vc_cmd_s*)vc_command;
1135 if (NULL != cmd->fixed) {
1140 cmd->fixed = strdup(fixed);
1142 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1146 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1148 if (0 != __vc_cmd_get_feature_enabled()) {
1149 return VC_ERROR_NOT_SUPPORTED;
1152 if (NULL == vc_command || NULL == fixed) {
1153 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1154 return VC_ERROR_INVALID_PARAMETER;
1157 vc_cmd_s* cmd = NULL;
1158 cmd = (vc_cmd_s*)vc_command;
1160 if (NULL != cmd->fixed) {
1161 *fixed = strdup(gettext(cmd->fixed));
1162 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1168 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1170 if (0 != __vc_cmd_get_feature_enabled()) {
1171 return VC_ERROR_NOT_SUPPORTED;
1174 if (NULL == vc_command) {
1175 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1176 return VC_ERROR_INVALID_PARAMETER;
1179 if (NULL == invocation_name) {
1180 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1181 return VC_ERROR_INVALID_PARAMETER;
1184 vc_cmd_s* cmd = NULL;
1185 cmd = (vc_cmd_s*)vc_command;
1187 if (NULL != cmd->invocation_name) {
1188 free(cmd->invocation_name);
1189 cmd->invocation_name = NULL;
1192 cmd->invocation_name = strdup(invocation_name);
1194 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1198 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1200 if (0 != __vc_cmd_get_feature_enabled()) {
1201 return VC_ERROR_NOT_SUPPORTED;
1204 if (NULL == vc_command || NULL == invocation_name) {
1205 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1206 return VC_ERROR_INVALID_PARAMETER;
1209 vc_cmd_s* cmd = NULL;
1210 cmd = (vc_cmd_s*)vc_command;
1212 if (NULL != cmd->invocation_name) {
1213 *invocation_name = strdup(gettext(cmd->invocation_name));
1216 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1220 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1222 if (0 != __vc_cmd_get_feature_enabled()) {
1223 return VC_ERROR_NOT_SUPPORTED;
1225 if (0 != __vc_cmd_check_privilege()) {
1226 return VC_ERROR_PERMISSION_DENIED;
1229 if (NULL == vc_command) {
1230 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1231 return VC_ERROR_INVALID_PARAMETER;
1234 vc_cmd_s* cmd = NULL;
1235 cmd = (vc_cmd_s*)vc_command;
1239 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1244 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1246 if (0 != __vc_cmd_get_feature_enabled()) {
1247 return VC_ERROR_NOT_SUPPORTED;
1249 if (0 != __vc_cmd_check_privilege()) {
1250 return VC_ERROR_PERMISSION_DENIED;
1253 if (NULL == vc_command || NULL == type) {
1254 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1255 return VC_ERROR_INVALID_PARAMETER;
1258 vc_cmd_s* cmd = NULL;
1259 cmd = (vc_cmd_s*)vc_command;
1263 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1268 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1270 if (0 != __vc_cmd_get_feature_enabled()) {
1271 return VC_ERROR_NOT_SUPPORTED;
1274 if (NULL == vc_command) {
1275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1276 return VC_ERROR_INVALID_PARAMETER;
1279 vc_cmd_s* cmd = NULL;
1280 cmd = (vc_cmd_s*)vc_command;
1282 cmd->format = format;
1284 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1289 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1291 if (0 != __vc_cmd_get_feature_enabled()) {
1292 return VC_ERROR_NOT_SUPPORTED;
1295 if (NULL == vc_command || NULL == format) {
1296 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1297 return VC_ERROR_INVALID_PARAMETER;
1300 vc_cmd_s* cmd = NULL;
1301 cmd = (vc_cmd_s*)vc_command;
1303 *format = cmd->format;
1305 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1310 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1312 if (0 != __vc_cmd_get_feature_enabled()) {
1313 return VC_ERROR_NOT_SUPPORTED;
1315 if (0 != __vc_cmd_check_privilege()) {
1316 return VC_ERROR_PERMISSION_DENIED;
1319 if (NULL == vc_command) {
1320 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1321 return VC_ERROR_INVALID_PARAMETER;
1324 vc_cmd_s* cmd = NULL;
1325 cmd = (vc_cmd_s*)vc_command;
1329 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1334 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1336 if (0 != __vc_cmd_get_feature_enabled()) {
1337 return VC_ERROR_NOT_SUPPORTED;
1339 if (0 != __vc_cmd_check_privilege()) {
1340 return VC_ERROR_PERMISSION_DENIED;
1343 if (NULL == vc_command || NULL == pid) {
1344 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1345 return VC_ERROR_INVALID_PARAMETER;
1348 vc_cmd_s* cmd = NULL;
1349 cmd = (vc_cmd_s*)vc_command;
1353 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1358 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1360 if (0 != __vc_cmd_get_feature_enabled()) {
1361 return VC_ERROR_NOT_SUPPORTED;
1363 if (0 != __vc_cmd_check_privilege()) {
1364 return VC_ERROR_PERMISSION_DENIED;
1367 if (NULL == vc_command) {
1368 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1369 return VC_ERROR_INVALID_PARAMETER;
1372 vc_cmd_s* cmd = NULL;
1373 cmd = (vc_cmd_s*)vc_command;
1375 cmd->domain = domain;
1377 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1382 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1384 if (0 != __vc_cmd_get_feature_enabled()) {
1385 return VC_ERROR_NOT_SUPPORTED;
1387 if (0 != __vc_cmd_check_privilege()) {
1388 return VC_ERROR_PERMISSION_DENIED;
1391 if (NULL == vc_command || NULL == domain) {
1392 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1393 return VC_ERROR_INVALID_PARAMETER;
1396 vc_cmd_s* cmd = NULL;
1397 cmd = (vc_cmd_s*)vc_command;
1399 *domain = cmd->domain;
1401 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1407 * @brief Sets key value of command.
1409 * @param[in] vc_command Command handle
1410 * @param[in] key key value
1411 * @param[in] modifier modifier value
1413 * @return 0 on success, otherwise a negative error value
1414 * @retval #VC_ERROR_NONE Successful
1415 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1417 * @see vc_cmd_get_result_key()
1419 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1421 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1423 if (NULL == vc_command) {
1424 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1425 return VC_ERROR_INVALID_PARAMETER;
1428 vc_cmd_s* cmd = NULL;
1429 cmd = (vc_cmd_s*)vc_command;
1431 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1434 cmd->modifier = modifier;
1436 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1442 * @brief Gets key value of command.
1444 * @param[in] vc_command Command handle
1445 * @param[out] key key value
1446 * @param[out] modifier modifier value
1448 * @return 0 on success, otherwise a negative error value
1449 * @retval #VC_ERROR_NONE Successful
1450 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1452 * @see vc_cmd_add_result_key()
1454 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1456 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1458 if (NULL == vc_command || NULL == key || NULL == modifier) {
1459 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1460 return VC_ERROR_INVALID_PARAMETER;
1463 vc_cmd_s* cmd = NULL;
1464 cmd = (vc_cmd_s*)vc_command;
1467 *modifier = cmd->modifier;
1469 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1474 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1476 if (NULL == vc_cmd_list) {
1480 vc_cmd_list_s* list = NULL;
1481 list = (vc_cmd_list_s*)vc_cmd_list;
1483 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1484 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1486 int count = g_slist_length(list->list);
1489 vc_cmd_s *cmd = NULL;
1491 for (i = 0; i < count ; i++) {
1492 cmd = g_slist_nth_data(list->list, i);
1495 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)",
1496 i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1500 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1505 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1507 if (0 != __vc_cmd_get_feature_enabled()) {
1508 return VC_ERROR_NOT_SUPPORTED;
1511 if (NULL == vc_cmd || NULL == json) {
1512 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1513 return VC_ERROR_INVALID_PARAMETER;
1516 vc_cmd_s* cmd = NULL;
1517 cmd = (vc_cmd_s*)vc_cmd;
1519 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1520 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1521 return VC_ERROR_INVALID_PARAMETER;
1524 if (0 != vc_info_parser_get_nlu_result(json)) {
1525 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1526 return VC_ERROR_OPERATION_FAILED;
1532 static void __vc_cmd_regex_deinit(int num_regex)
1534 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1537 for (i = 0; num_regex > i; i++) {
1541 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1544 static int __vc_cmd_regex_init()
1546 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1548 int cflags = REG_EXTENDED | REG_ICASE;
1554 vc_config_mgr_get_default_language(&lang);
1556 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1557 return VC_ERROR_OPERATION_FAILED;
1560 if (!strcmp("en_US", lang)) {
1562 } else if (!strcmp("ko_KR", lang)) {
1568 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1569 return VC_ERROR_INVALID_LANGUAGE;
1575 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1577 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1579 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1580 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1582 regerror(ret, ®[0], errStr, sizeof(errStr));
1584 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1585 return VC_ERROR_OPERATION_FAILED;
1588 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1589 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1591 regerror(ret, ®[1], errStr, sizeof(errStr));
1592 __vc_cmd_regex_deinit(1);
1594 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1595 return VC_ERROR_OPERATION_FAILED;
1598 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1599 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1601 regerror(ret, ®[2], errStr, sizeof(errStr));
1602 __vc_cmd_regex_deinit(2);
1604 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1605 return VC_ERROR_OPERATION_FAILED;
1608 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1609 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1611 regerror(ret, ®[3], errStr, sizeof(errStr));
1612 __vc_cmd_regex_deinit(3);
1614 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1615 return VC_ERROR_OPERATION_FAILED;
1618 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1619 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1621 regerror(ret, ®[4], errStr, sizeof(errStr));
1622 __vc_cmd_regex_deinit(4);
1624 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1625 return VC_ERROR_OPERATION_FAILED;
1628 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1629 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1631 regerror(ret, ®[5], errStr, sizeof(errStr));
1632 __vc_cmd_regex_deinit(5);
1634 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1635 return VC_ERROR_OPERATION_FAILED;
1638 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1639 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1641 regerror(ret, ®[6], errStr, sizeof(errStr));
1642 __vc_cmd_regex_deinit(6);
1644 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1645 return VC_ERROR_OPERATION_FAILED;
1648 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1649 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1651 regerror(ret, ®[7], errStr, sizeof(errStr));
1652 __vc_cmd_regex_deinit(7);
1654 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1655 return VC_ERROR_OPERATION_FAILED;
1658 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1659 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1661 regerror(ret, ®[8], errStr, sizeof(errStr));
1662 __vc_cmd_regex_deinit(8);
1664 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1665 return VC_ERROR_OPERATION_FAILED;
1668 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1669 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1671 regerror(ret, ®[9], errStr, sizeof(errStr));
1672 __vc_cmd_regex_deinit(9);
1674 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1675 return VC_ERROR_OPERATION_FAILED;
1678 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1679 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1681 regerror(ret, ®[10], errStr, sizeof(errStr));
1682 __vc_cmd_regex_deinit(10);
1684 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1685 return VC_ERROR_OPERATION_FAILED;
1688 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1689 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1691 regerror(ret, ®[11], errStr, sizeof(errStr));
1692 __vc_cmd_regex_deinit(11);
1694 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1695 return VC_ERROR_OPERATION_FAILED;
1698 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1700 return VC_ERROR_NONE;
1703 static void __vc_cmd_add_year(struct tm *td, int year)
1705 td->tm_year += year;
1708 static void __vc_cmd_add_mon(struct tm *td, int mon)
1712 mon = td->tm_mon + mon;
1716 __vc_cmd_add_year(td, year);
1719 td->tm_mon = mon % 12;
1722 static void __vc_cmd_add_mday(struct tm *td, int mday)
1724 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1725 int year = td->tm_year + 1900;
1729 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1731 mday = td->tm_mday + mday;
1733 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1734 mday -= max_day[mon % 12];
1736 if (11 == mon % 12) {
1739 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1747 mon = mon - td->tm_mon;
1750 __vc_cmd_add_mon(td, mon);
1756 static void __vc_cmd_add_hour(struct tm *td, int hour)
1760 hour = td->tm_hour + hour;
1764 __vc_cmd_add_mday(td, day);
1767 td->tm_hour = hour % 24;
1770 static void __vc_cmd_add_min(struct tm *td, int min)
1774 min = td->tm_min + min;
1778 __vc_cmd_add_hour(td, hour);
1781 td->tm_min = min % 60;
1784 static void __copy_struct_tm(struct tm *des, struct tm *src)
1786 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1788 des->tm_sec = src->tm_sec;
1789 des->tm_min = src->tm_min;
1790 des->tm_hour = src->tm_hour;
1791 des->tm_mday = src->tm_mday;
1792 des->tm_mon = src->tm_mon;
1793 des->tm_year = src->tm_year;
1794 des->tm_wday = src->tm_wday;
1795 des->tm_yday = src->tm_yday;
1796 des->tm_isdst = src->tm_isdst;
1798 des->tm_gmtoff = src->tm_gmtoff;
1799 des->tm_zone = src->tm_zone;
1802 static void __update_data_sidx(int idx)
1804 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1807 static void __update_data_eidx(int idx)
1809 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1812 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1814 regmatch_t pmatch[3];
1820 ret = regexec(®[6], str, 3, pmatch, 0);
1823 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1825 if (12 < td->tm_hour) {
1826 __vc_cmd_add_mday(td, 1);
1832 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1834 __vc_cmd_add_mday(td, 1);
1839 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1841 __update_data_sidx(pmatch[0].rm_so);
1842 __update_data_eidx(pmatch[0].rm_eo);
1845 return VC_ERROR_NONE;
1848 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1849 return VC_ERROR_NONE;
1852 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1854 regmatch_t pmatch[2];
1862 char *tempstr = NULL;
1865 ret = regexec(®[3], str, 1, pmatch, 0);
1867 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1870 sidx = pmatch[0].rm_so;
1871 eidx = pmatch[0].rm_eo;
1873 ret = regexec(®[4], str, 2, pmatch, 0);
1875 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1878 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1879 return VC_ERROR_OPERATION_FAILED;
1881 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1883 if (NULL == tempstr) {
1884 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1885 return VC_ERROR_OUT_OF_MEMORY;
1888 hour = atoi(tempstr);
1893 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1895 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1896 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1899 ret = regexec(®[5], str, 2, pmatch, 0);
1901 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1904 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1905 return VC_ERROR_OPERATION_FAILED;
1907 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1909 if (NULL == tempstr) {
1910 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1911 return VC_ERROR_OUT_OF_MEMORY;
1914 min = atoi(tempstr);
1919 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1921 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1922 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1925 if (hour < 0 && min < 0) {
1926 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1927 return VC_ERROR_NONE;
1930 hour = 0 > hour ? 0 : hour;
1931 min = 0 > min ? 0 : min;
1933 min = min + (hour * 60);
1935 __vc_cmd_add_min(td, min);
1938 __update_data_sidx(sidx);
1939 __update_data_eidx(eidx);
1942 return VC_ERROR_NONE;
1945 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1946 return VC_ERROR_NONE;
1949 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1951 regmatch_t pmatch[5];
1960 char *tempstr = NULL;
1963 ret = regexec(®[0], str, 5, pmatch, 0);
1965 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1969 sidx = pmatch[0].rm_so;
1970 eidx = pmatch[0].rm_eo;
1973 ret = regexec(®[1], str, 2, pmatch, 0);
1975 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1978 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1979 return VC_ERROR_OPERATION_FAILED;
1981 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1983 if (NULL == tempstr) {
1984 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1985 return VC_ERROR_OUT_OF_MEMORY;
1988 hour = atoi(tempstr);
1991 hour = hour + 12 * flag;
1993 if (12 == hour) hour = 0;
1994 else if (24 == hour) hour = 12;
1997 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1998 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2001 return VC_ERROR_NONE;
2007 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2009 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2010 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2011 } else if (0 < flag) {
2012 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2013 return VC_ERROR_NONE;
2016 ret = regexec(®[2], str, 2, pmatch, 0);
2019 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2021 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
2023 if (NULL == tempstr) {
2024 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2025 return VC_ERROR_OUT_OF_MEMORY;
2028 min = atoi(tempstr);
2030 if (0 > min || 60 <= min) {
2031 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2034 return VC_ERROR_NONE;
2046 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
2047 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2048 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2051 if (0 > hour && 0 > min) {
2052 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2053 return VC_ERROR_NONE;
2056 if (0 <= min && 0 <= hour) {
2057 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
2061 } else if (0 <= min) {
2063 vc_config_mgr_get_default_language(&lang);
2065 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2066 return VC_ERROR_OPERATION_FAILED;
2069 if (!strcmp("en_US", lang)) {
2070 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2073 return VC_ERROR_NONE;
2075 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
2082 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
2090 __update_data_sidx(sidx);
2091 __update_data_eidx(eidx);
2094 return VC_ERROR_NONE;
2097 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
2099 regmatch_t pmatch[10];
2105 ret = regexec(®[10], str, 5, pmatch, 0);
2107 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
2109 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2111 td->tm_year = td_now.tm_year;
2112 td->tm_mon = td_now.tm_mon;
2113 td->tm_mday = td_now.tm_mday;
2115 __vc_cmd_add_mday(td, idx - 1);
2117 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2119 __update_data_sidx(pmatch[0].rm_so);
2120 __update_data_eidx(pmatch[0].rm_eo);
2123 return VC_ERROR_NONE;
2126 ret = regexec(®[11], str, 10, pmatch, 0);
2128 for (idx = 1; 10 > idx; idx++) {
2129 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2134 td->tm_year = td_now.tm_year;
2135 td->tm_mon = td_now.tm_mon;
2136 td->tm_mday = td_now.tm_mday;
2138 __vc_cmd_add_mday(td, idx + 1);
2140 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2142 __update_data_sidx(pmatch[0].rm_so);
2143 __update_data_eidx(pmatch[0].rm_eo);
2146 return VC_ERROR_NONE;
2149 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2150 return VC_ERROR_NONE;
2153 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2155 regmatch_t pmatch[13];
2166 char *tempstr = NULL;
2169 ret = regexec(®[9], str, 2, pmatch, 0);
2171 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2174 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2175 return VC_ERROR_OPERATION_FAILED;
2177 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2179 if (NULL == tempstr) {
2180 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2181 return VC_ERROR_OUT_OF_MEMORY;
2184 day = atoi(tempstr);
2189 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2191 sidx = pmatch[0].rm_so;
2192 eidx = pmatch[0].rm_eo;
2194 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2195 return VC_ERROR_NONE;
2198 ret = regexec(®[8], str, 13, pmatch, 0);
2200 for (idx = 1; 13 > idx; idx++) {
2201 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2211 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2213 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2214 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2217 vc_config_mgr_get_default_language(&lang);
2219 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2220 return VC_ERROR_OPERATION_FAILED;
2223 if (!strcmp("en_US", lang)) {
2224 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2227 return VC_ERROR_NONE;
2236 ret = regexec(®[7], str, 3, pmatch, 0);
2238 if (!m_flag) return -1;
2240 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2243 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2244 return VC_ERROR_OPERATION_FAILED;
2246 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2248 if (NULL == tempstr) {
2249 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2250 return VC_ERROR_OUT_OF_MEMORY;
2253 year = atoi(tempstr);
2254 year = 1900 < year ? year - 1900 : year + 100;
2260 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2262 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2263 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2268 if (0 > g_time_flag) {
2272 } else if (2 == g_time_flag) {
2273 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2274 return VC_ERROR_NONE;
2277 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2278 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2280 if (max_day[mon] < day || 1 > day) {
2281 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2282 return VC_ERROR_NONE;
2291 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2293 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2294 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2298 __update_data_sidx(sidx);
2299 __update_data_eidx(eidx);
2302 return VC_ERROR_NONE;
2305 static int __vc_cmd_time_check(const char *str, struct tm *td)
2307 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2312 ret = __vc_cmd_tphrase_check(str, td, &exist);
2316 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2318 } else if (VC_ERROR_NONE != ret) {
2319 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2323 ret = __vc_cmd_trelative_check(str, td, &exist);
2327 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2329 } else if (VC_ERROR_NONE != ret) {
2330 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2334 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2338 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2340 } else if (VC_ERROR_NONE != ret) {
2341 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2345 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2346 return VC_ERROR_NONE;
2349 static int __vc_cmd_date_check(const char *str, struct tm *td)
2351 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2356 ret = __vc_cmd_dphrase_check(str, td, &exist);
2360 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2362 } else if (VC_ERROR_NONE != ret) {
2363 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2367 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2371 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2373 } else if (VC_ERROR_NONE != ret) {
2374 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2378 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2379 return VC_ERROR_NONE;
2382 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2384 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2387 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2390 if (NULL == text || NULL == result || NULL == remain) {
2391 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2392 return VC_ERROR_INVALID_PARAMETER;
2396 ret = __vc_cmd_regex_init();
2397 if (VC_ERROR_NONE != ret) {
2398 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2402 g_data_sidx = g_data_eidx = -1;
2405 localtime_r(&t_now, &td_now);
2406 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2408 __copy_struct_tm(&td, &td_now);
2409 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2410 td.tm_year + 1900, td.tm_mon + 1, td.tm_mday, day_name[td.tm_wday], td.tm_hour, td.tm_min, td.tm_sec);
2412 g_time_flag = g_date_flag = -1;
2414 ret = __vc_cmd_time_check(text, &td);
2415 if (VC_ERROR_NONE != ret) {
2416 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2420 ret = __vc_cmd_date_check(text, &td);
2421 if (VC_ERROR_NONE != ret) {
2422 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2426 __vc_cmd_regex_deinit(12);
2428 if (g_time_flag > 0 || g_date_flag > 0) {
2429 *result = mktime(&td);
2431 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2432 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2433 td.tm_year + 1900, td.tm_mon + 1, td.tm_mday, day_name[td.tm_wday], td.tm_hour, td.tm_min, td.tm_sec);
2435 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2437 if (NULL == *remain) {
2438 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2439 return VC_ERROR_OUT_OF_MEMORY;
2442 strncpy(*remain, text, g_data_sidx);
2443 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2445 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2448 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2450 return VC_ERROR_NONE;