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()
128 cynara_finish(p_cynara);
132 static int __vc_cmd_check_privilege()
134 pthread_mutex_lock(&g_cynara_mutex);
136 if (false == g_privilege_allowed) {
138 ret = __check_privilege_initialize();
140 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
141 g_privilege_allowed = false;
142 pthread_mutex_unlock(&g_cynara_mutex);
143 return VC_ERROR_PERMISSION_DENIED;
147 snprintf(uid, 16, "%d", getuid());
149 ret = __check_privilege(uid, VC_PRIVILEGE);
150 __check_privilege_deinitialize();
152 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
153 g_privilege_allowed = false;
154 pthread_mutex_unlock(&g_cynara_mutex);
155 return VC_ERROR_PERMISSION_DENIED;
159 g_privilege_allowed = true;
160 pthread_mutex_unlock(&g_cynara_mutex);
161 return VC_ERROR_NONE;
164 static bool __vc_cmd_is_valid(vc_cmd_h vc_command)
166 if (NULL == g_cmd_list) {
167 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid");
171 if (g_list_length(g_cmd_list) == 0) {
172 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmd_list is not valid");
177 vc_cmd_s *command = NULL;
178 command = (vc_cmd_s *)vc_command;
181 iter = g_list_first(g_cmd_list);
182 while (NULL != iter) {
183 vc_cmd_s *data = NULL;
185 if (NULL != data && command == data) {
189 iter = g_list_next(iter);
193 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] command(%p) is not valid", command);
198 static bool __vc_cmd_list_is_valid(vc_cmd_list_h vc_cmd_list)
200 if (NULL == g_cmdlist_list) {
201 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid");
205 if (g_list_length(g_cmdlist_list) == 0) {
206 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] cmdlist_list is not valid");
211 vc_cmd_list_s *list = NULL;
212 list = (vc_cmd_list_s *)vc_cmd_list;
215 iter = g_list_first(g_cmdlist_list);
216 while (NULL != iter) {
217 vc_cmd_list_s *data = NULL;
219 if (NULL != data && list == data) {
223 iter = g_list_next(iter);
227 SLOG(LOG_WARN, TAG_VCCMD, "[WARNING] list(%p) is not valid", list);
232 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
234 if (0 != __vc_cmd_get_feature_enabled()) {
235 return VC_ERROR_NOT_SUPPORTED;
237 if (0 != __vc_cmd_check_privilege()) {
238 return VC_ERROR_PERMISSION_DENIED;
241 if (NULL == vc_cmd_list) {
242 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
243 return VC_ERROR_INVALID_PARAMETER;
246 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
249 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
250 return VC_ERROR_OUT_OF_MEMORY;
256 *vc_cmd_list = (vc_cmd_list_h)list;
258 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
260 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
262 return VC_ERROR_NONE;
265 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
267 if (0 != __vc_cmd_get_feature_enabled()) {
268 return VC_ERROR_NOT_SUPPORTED;
270 if (0 != __vc_cmd_check_privilege()) {
271 return VC_ERROR_PERMISSION_DENIED;
274 if (NULL == vc_cmd_list) {
275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
276 return VC_ERROR_INVALID_PARAMETER;
279 if (false == __vc_cmd_list_is_valid(vc_cmd_list)) {
280 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
281 return VC_ERROR_INVALID_PARAMETER;
284 vc_cmd_list_remove_all(vc_cmd_list, release_command);
286 vc_cmd_list_s* list = NULL;
287 list = (vc_cmd_list_s*)vc_cmd_list;
289 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
292 vc_cmd_list_s *data = NULL;
294 /* if list have item */
295 if (g_list_length(g_cmdlist_list) > 0) {
296 /* Get a first item */
297 iter = g_list_first(g_cmdlist_list);
299 while (NULL != iter) {
301 if (NULL != data && list == data) {
302 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
307 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
311 return VC_ERROR_NONE;
314 iter = g_list_next(iter);
317 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
319 return VC_ERROR_INVALID_PARAMETER;
322 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
324 if (0 != __vc_cmd_get_feature_enabled()) {
325 return VC_ERROR_NOT_SUPPORTED;
327 if (0 != __vc_cmd_check_privilege()) {
328 return VC_ERROR_PERMISSION_DENIED;
331 if (NULL == vc_cmd_list || NULL == count) {
332 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
333 return VC_ERROR_INVALID_PARAMETER;
336 vc_cmd_list_s* list = NULL;
337 list = (vc_cmd_list_s*)vc_cmd_list;
339 *count = g_slist_length(list->list);
341 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
343 return VC_ERROR_NONE;
346 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
348 if (0 != __vc_cmd_get_feature_enabled()) {
349 return VC_ERROR_NOT_SUPPORTED;
351 if (0 != __vc_cmd_check_privilege()) {
352 return VC_ERROR_PERMISSION_DENIED;
355 if (NULL == vc_cmd_list || NULL == vc_command) {
356 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
357 return VC_ERROR_INVALID_PARAMETER;
360 vc_cmd_list_s* list = NULL;
361 list = (vc_cmd_list_s*)vc_cmd_list;
363 vc_cmd_s* cmd = NULL;
364 cmd = (vc_cmd_s*)vc_command;
366 list->list = g_slist_append(list->list, cmd);
368 if (1 == g_slist_length(list->list)) {
372 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
374 return VC_ERROR_NONE;
377 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
379 if (0 != __vc_cmd_get_feature_enabled()) {
380 return VC_ERROR_NOT_SUPPORTED;
382 if (0 != __vc_cmd_check_privilege()) {
383 return VC_ERROR_PERMISSION_DENIED;
386 if (NULL == vc_cmd_list || NULL == vc_command) {
387 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
388 return VC_ERROR_INVALID_PARAMETER;
391 vc_cmd_list_s* list = NULL;
392 list = (vc_cmd_list_s*)vc_cmd_list;
394 vc_cmd_s* cmd = NULL;
395 cmd = (vc_cmd_s*)vc_command;
397 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
399 vc_cmd_s* temp_cmd = NULL;
402 iter = g_slist_nth(list->list, 0);
404 while (NULL != iter) {
405 temp_cmd = iter->data;
407 if (NULL != temp_cmd && cmd == temp_cmd) {
408 list->list = g_slist_remove(list->list, temp_cmd);
410 if (true == release_command) {
411 SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data");
412 if (NULL != temp_cmd->command) free(temp_cmd->command);
413 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
420 iter = g_slist_next(iter);
423 int count = g_slist_length(list->list);
427 } else if (list->index == count) {
428 list->index = count - 1;
431 return VC_ERROR_NONE;
434 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
436 if (0 != __vc_cmd_get_feature_enabled()) {
437 return VC_ERROR_NOT_SUPPORTED;
439 if (0 != __vc_cmd_check_privilege()) {
440 return VC_ERROR_PERMISSION_DENIED;
443 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
445 if (NULL == vc_cmd_list) {
446 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
447 return VC_ERROR_INVALID_PARAMETER;
450 vc_cmd_list_s* list = NULL;
451 list = (vc_cmd_list_s*)vc_cmd_list;
453 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
454 , list, release_command ? "true" : "false");
456 int count = g_slist_length(list->list);
457 for (int i = 0; i < count ; i++) {
458 vc_cmd_s *temp_cmd = g_slist_nth_data(list->list, 0);
460 if (NULL != temp_cmd) {
461 list->list = g_slist_remove(list->list, temp_cmd);
463 if (true == release_command) {
464 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd);
465 if (NULL != temp_cmd->command) free(temp_cmd->command);
466 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
467 if (NULL != temp_cmd->appid) free(temp_cmd->appid);
468 if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name);
469 if (NULL != temp_cmd->fixed) free(temp_cmd->fixed);
478 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
480 return VC_ERROR_NONE;
483 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
485 if (0 != __vc_cmd_get_feature_enabled()) {
486 return VC_ERROR_NOT_SUPPORTED;
488 if (0 != __vc_cmd_check_privilege()) {
489 return VC_ERROR_PERMISSION_DENIED;
492 if (NULL == vc_cmd_list) {
493 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
494 return VC_ERROR_INVALID_PARAMETER;
497 vc_cmd_list_s* list = NULL;
498 list = (vc_cmd_list_s*)vc_cmd_list;
500 int count = g_slist_length(list->list);
506 iter = g_slist_nth(list->list, 0);
508 for (i = 0; i < count; i++) {
510 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
511 return VC_ERROR_OPERATION_FAILED;
514 temp_cmd = iter->data;
516 if (NULL != temp_cmd) {
517 if (false == callback((vc_cmd_h)temp_cmd, user_data)) {
522 iter = g_slist_next(iter);
525 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
527 return VC_ERROR_NONE;
530 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
532 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
534 if (0 != __vc_cmd_get_feature_enabled()) {
535 return VC_ERROR_NOT_SUPPORTED;
537 if (0 != __vc_cmd_check_privilege()) {
538 return VC_ERROR_PERMISSION_DENIED;
541 if (NULL == original) {
542 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
543 return VC_ERROR_INVALID_PARAMETER;
546 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
547 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
548 return VC_ERROR_INVALID_PARAMETER;
551 vc_cmd_list_s* list = NULL;
552 list = (vc_cmd_list_s*)original;
554 vc_cmd_list_h temp_list;
555 if (0 != vc_cmd_list_create(&temp_list)) {
556 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
557 return VC_ERROR_OPERATION_FAILED;
560 int count = g_slist_length(list->list);
566 iter = g_slist_nth(list->list, 0);
568 for (i = 0; i < count; i++) {
570 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
571 return VC_ERROR_OPERATION_FAILED;
573 if (NULL != iter->data) {
574 iter_cmd = iter->data;
576 if (NULL != iter_cmd) {
578 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
579 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
583 if (iter_type == type) {
585 if (0 != vc_cmd_create(&temp_cmd)) {
586 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
590 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
591 if (NULL != iter_cmd->command) {
592 ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
594 if (NULL != iter_cmd->parameter) {
595 ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
598 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
599 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
600 vc_cmd_destroy(temp_cmd);
606 iter = g_slist_next(iter);
610 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
611 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
613 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
616 *filtered = temp_list;
618 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
620 return VC_ERROR_NONE;
623 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
625 if (0 != __vc_cmd_get_feature_enabled()) {
626 return VC_ERROR_NOT_SUPPORTED;
628 if (0 != __vc_cmd_check_privilege()) {
629 return VC_ERROR_PERMISSION_DENIED;
632 if (NULL == vc_cmd_list) {
633 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
634 return VC_ERROR_INVALID_PARAMETER;
637 vc_cmd_list_s* list = NULL;
638 list = (vc_cmd_list_s*)vc_cmd_list;
640 if (0 == g_slist_length(list->list)) {
641 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
642 return VC_ERROR_EMPTY;
647 return VC_ERROR_NONE;
650 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
652 if (0 != __vc_cmd_get_feature_enabled()) {
653 return VC_ERROR_NOT_SUPPORTED;
655 if (0 != __vc_cmd_check_privilege()) {
656 return VC_ERROR_PERMISSION_DENIED;
659 if (NULL == vc_cmd_list) {
660 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
661 return VC_ERROR_INVALID_PARAMETER;
664 vc_cmd_list_s* list = NULL;
665 list = (vc_cmd_list_s*)vc_cmd_list;
667 int count = g_slist_length(list->list);
670 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
671 return VC_ERROR_EMPTY;
673 list->index = count - 1;
674 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
677 return VC_ERROR_NONE;
680 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
682 if (0 != __vc_cmd_get_feature_enabled()) {
683 return VC_ERROR_NOT_SUPPORTED;
685 if (0 != __vc_cmd_check_privilege()) {
686 return VC_ERROR_PERMISSION_DENIED;
689 if (NULL == vc_cmd_list) {
690 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
691 return VC_ERROR_INVALID_PARAMETER;
694 vc_cmd_list_s* list = NULL;
695 list = (vc_cmd_list_s*)vc_cmd_list;
697 int count = g_slist_length(list->list);
699 if (list->index < count - 1) {
700 list->index = list->index + 1;
701 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
703 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
704 return VC_ERROR_ITERATION_END;
707 return VC_ERROR_NONE;
710 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
712 if (0 != __vc_cmd_get_feature_enabled()) {
713 return VC_ERROR_NOT_SUPPORTED;
715 if (0 != __vc_cmd_check_privilege()) {
716 return VC_ERROR_PERMISSION_DENIED;
719 if (NULL == vc_cmd_list) {
720 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
721 return VC_ERROR_INVALID_PARAMETER;
724 vc_cmd_list_s* list = NULL;
725 list = (vc_cmd_list_s*)vc_cmd_list;
727 if (list->index > 0) {
728 list->index = list->index - 1;
729 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
731 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
732 return VC_ERROR_ITERATION_END;
735 return VC_ERROR_NONE;
738 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
740 if (0 != __vc_cmd_get_feature_enabled()) {
741 return VC_ERROR_NOT_SUPPORTED;
743 if (0 != __vc_cmd_check_privilege()) {
744 return VC_ERROR_PERMISSION_DENIED;
747 if (NULL == vc_cmd_list || NULL == vc_command) {
748 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
749 return VC_ERROR_INVALID_PARAMETER;
752 vc_cmd_list_s* list = NULL;
753 list = (vc_cmd_list_s*)vc_cmd_list;
755 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
757 if (0 == g_slist_length(list->list)) {
758 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
760 return VC_ERROR_EMPTY;
763 vc_cmd_s *temp_cmd = NULL;
764 temp_cmd = g_slist_nth_data(list->list, list->index);
766 *vc_command = (vc_cmd_h)temp_cmd;
768 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
770 return VC_ERROR_NONE;
774 int vc_cmd_create(vc_cmd_h* vc_command)
776 if (0 != __vc_cmd_get_feature_enabled()) {
777 return VC_ERROR_NOT_SUPPORTED;
779 if (0 != __vc_cmd_check_privilege()) {
780 return VC_ERROR_PERMISSION_DENIED;
783 if (NULL == vc_command) {
784 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
785 return VC_ERROR_INVALID_PARAMETER;
788 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
790 if (NULL == command) {
791 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
792 return VC_ERROR_OUT_OF_MEMORY;
798 command->type = VC_COMMAND_TYPE_NONE;
799 command->format = VC_CMD_FORMAT_FIXED;
800 command->command = NULL;
801 command->parameter = NULL;
803 command->priority = 0;
804 command->key = VC_KEY_NONE;
805 command->modifier = VC_MODIFIER_NONE;
806 command->invocation_name = NULL;
807 command->appid = NULL;
808 command->fixed = NULL;
809 command->coordinates = NULL;
811 *vc_command = (vc_cmd_h)command;
813 g_cmd_list = g_list_append(g_cmd_list, command);
815 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
817 return VC_ERROR_NONE;
820 int vc_cmd_destroy(vc_cmd_h vc_command)
822 if (0 != __vc_cmd_get_feature_enabled()) {
823 return VC_ERROR_NOT_SUPPORTED;
825 if (0 != __vc_cmd_check_privilege()) {
826 return VC_ERROR_PERMISSION_DENIED;
829 if (NULL == vc_command) {
830 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
831 return VC_ERROR_INVALID_PARAMETER;
834 if (false == __vc_cmd_is_valid(vc_command)) {
835 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
836 return VC_ERROR_INVALID_PARAMETER;
839 vc_cmd_s* command = NULL;
840 command = (vc_cmd_s*)vc_command;
842 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
846 iter = g_list_first(g_cmd_list);
847 while (NULL != iter) {
848 vc_cmd_s *data = NULL;
850 if (NULL != data && command == data) {
851 g_cmd_list = g_list_remove_link(g_cmd_list, iter);
855 iter = g_list_next(iter);
859 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
860 return VC_ERROR_INVALID_PARAMETER;
867 if (NULL != command) {
868 if (NULL != command->command) {
869 free(command->command);
870 command->command = NULL;
872 if (NULL != command->parameter) {
873 free(command->parameter);
874 command->parameter = NULL;
876 if (NULL != command->invocation_name) {
877 free(command->invocation_name);
878 command->invocation_name = NULL;
880 if (NULL != command->appid) {
881 free(command->appid);
882 command->appid = NULL;
884 if (NULL != command->fixed) {
885 free(command->fixed);
886 command->fixed = NULL;
888 if (NULL != command->coordinates) {
889 free(command->coordinates);
890 command->coordinates = NULL;
896 return VC_ERROR_NONE;
899 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
901 if (0 != __vc_cmd_get_feature_enabled()) {
902 return VC_ERROR_NOT_SUPPORTED;
904 if (0 != __vc_cmd_check_privilege()) {
905 return VC_ERROR_PERMISSION_DENIED;
908 if (NULL == vc_command) {
909 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
910 return VC_ERROR_INVALID_PARAMETER;
913 vc_cmd_s* cmd = NULL;
914 cmd = (vc_cmd_s*)vc_command;
918 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
924 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
926 if (0 != __vc_cmd_get_feature_enabled()) {
927 return VC_ERROR_NOT_SUPPORTED;
929 if (0 != __vc_cmd_check_privilege()) {
930 return VC_ERROR_PERMISSION_DENIED;
933 if (NULL == vc_command || NULL == id) {
934 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
935 return VC_ERROR_INVALID_PARAMETER;
938 vc_cmd_s* cmd = NULL;
939 cmd = (vc_cmd_s*)vc_command;
943 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
949 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
951 if (0 != __vc_cmd_get_feature_enabled()) {
952 return VC_ERROR_NOT_SUPPORTED;
955 if (NULL == vc_command) {
956 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
957 return VC_ERROR_INVALID_PARAMETER;
961 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
962 return VC_ERROR_INVALID_PARAMETER;
965 vc_cmd_s* cmd = NULL;
966 cmd = (vc_cmd_s*)vc_command;
968 if (NULL != cmd->appid) {
973 cmd->appid = strdup(appid);
975 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
979 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
981 if (0 != __vc_cmd_get_feature_enabled()) {
982 return VC_ERROR_NOT_SUPPORTED;
985 if (NULL == vc_command || NULL == appid) {
986 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
987 return VC_ERROR_INVALID_PARAMETER;
990 vc_cmd_s* cmd = NULL;
991 cmd = (vc_cmd_s*)vc_command;
993 if (NULL != cmd->appid) {
994 *appid = strdup(gettext(cmd->appid));
997 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
1001 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
1003 if (0 != __vc_cmd_get_feature_enabled()) {
1004 return VC_ERROR_NOT_SUPPORTED;
1006 if (0 != __vc_cmd_check_privilege()) {
1007 return VC_ERROR_PERMISSION_DENIED;
1010 if (NULL == vc_command) {
1011 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1012 return VC_ERROR_INVALID_PARAMETER;
1015 vc_cmd_s* cmd = NULL;
1016 cmd = (vc_cmd_s*)vc_command;
1018 if (NULL != cmd->command) {
1022 cmd->command = NULL;
1024 if (NULL != command) {
1025 cmd->command = strdup(command);
1028 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
1033 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
1035 if (0 != __vc_cmd_get_feature_enabled()) {
1036 return VC_ERROR_NOT_SUPPORTED;
1038 if (0 != __vc_cmd_check_privilege()) {
1039 return VC_ERROR_PERMISSION_DENIED;
1042 if (NULL == vc_command || NULL == command) {
1043 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1044 return VC_ERROR_INVALID_PARAMETER;
1047 vc_cmd_s* cmd = NULL;
1048 cmd = (vc_cmd_s*)vc_command;
1050 if (NULL != cmd->command) {
1051 *command = strdup(gettext(cmd->command));
1054 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
1059 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
1061 if (0 != __vc_cmd_get_feature_enabled()) {
1062 return VC_ERROR_NOT_SUPPORTED;
1064 if (0 != __vc_cmd_check_privilege()) {
1065 return VC_ERROR_PERMISSION_DENIED;
1068 if (NULL == vc_command) {
1069 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1070 return VC_ERROR_INVALID_PARAMETER;
1073 vc_cmd_s* cmd = NULL;
1074 cmd = (vc_cmd_s*)vc_command;
1076 if (NULL != cmd->parameter) {
1077 free(cmd->parameter);
1080 cmd->parameter = NULL;
1082 if (NULL != command) {
1083 cmd->parameter = strdup(command);
1084 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
1090 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
1092 if (0 != __vc_cmd_get_feature_enabled()) {
1093 return VC_ERROR_NOT_SUPPORTED;
1096 if (NULL == vc_command || NULL == command) {
1097 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1098 return VC_ERROR_INVALID_PARAMETER;
1101 vc_cmd_s* cmd = NULL;
1102 cmd = (vc_cmd_s*)vc_command;
1104 if (NULL != cmd->parameter) {
1105 *command = strdup(gettext(cmd->parameter));
1106 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
1112 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
1114 if (0 != __vc_cmd_get_feature_enabled()) {
1115 return VC_ERROR_NOT_SUPPORTED;
1118 if (NULL == vc_command) {
1119 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1120 return VC_ERROR_INVALID_PARAMETER;
1123 if (NULL == fixed) {
1124 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
1125 return VC_ERROR_INVALID_PARAMETER;
1128 vc_cmd_s* cmd = NULL;
1129 cmd = (vc_cmd_s*)vc_command;
1131 if (NULL != cmd->fixed) {
1136 cmd->fixed = strdup(fixed);
1138 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1142 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1144 if (0 != __vc_cmd_get_feature_enabled()) {
1145 return VC_ERROR_NOT_SUPPORTED;
1148 if (NULL == vc_command || NULL == fixed) {
1149 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1150 return VC_ERROR_INVALID_PARAMETER;
1153 vc_cmd_s* cmd = NULL;
1154 cmd = (vc_cmd_s*)vc_command;
1156 if (NULL != cmd->fixed) {
1157 *fixed = strdup(gettext(cmd->fixed));
1158 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1164 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1166 if (0 != __vc_cmd_get_feature_enabled()) {
1167 return VC_ERROR_NOT_SUPPORTED;
1170 if (NULL == vc_command) {
1171 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1172 return VC_ERROR_INVALID_PARAMETER;
1175 if (NULL == invocation_name) {
1176 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1177 return VC_ERROR_INVALID_PARAMETER;
1180 vc_cmd_s* cmd = NULL;
1181 cmd = (vc_cmd_s*)vc_command;
1183 if (NULL != cmd->invocation_name) {
1184 free(cmd->invocation_name);
1185 cmd->invocation_name = NULL;
1188 cmd->invocation_name = strdup(invocation_name);
1190 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1194 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1196 if (0 != __vc_cmd_get_feature_enabled()) {
1197 return VC_ERROR_NOT_SUPPORTED;
1200 if (NULL == vc_command || NULL == invocation_name) {
1201 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1202 return VC_ERROR_INVALID_PARAMETER;
1205 vc_cmd_s* cmd = NULL;
1206 cmd = (vc_cmd_s*)vc_command;
1208 if (NULL != cmd->invocation_name) {
1209 *invocation_name = strdup(gettext(cmd->invocation_name));
1212 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1216 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1218 if (0 != __vc_cmd_get_feature_enabled()) {
1219 return VC_ERROR_NOT_SUPPORTED;
1221 if (0 != __vc_cmd_check_privilege()) {
1222 return VC_ERROR_PERMISSION_DENIED;
1225 if (NULL == vc_command) {
1226 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1227 return VC_ERROR_INVALID_PARAMETER;
1230 vc_cmd_s* cmd = NULL;
1231 cmd = (vc_cmd_s*)vc_command;
1235 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1240 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1242 if (0 != __vc_cmd_get_feature_enabled()) {
1243 return VC_ERROR_NOT_SUPPORTED;
1245 if (0 != __vc_cmd_check_privilege()) {
1246 return VC_ERROR_PERMISSION_DENIED;
1249 if (NULL == vc_command || NULL == type) {
1250 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1251 return VC_ERROR_INVALID_PARAMETER;
1254 vc_cmd_s* cmd = NULL;
1255 cmd = (vc_cmd_s*)vc_command;
1259 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1264 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1266 if (0 != __vc_cmd_get_feature_enabled()) {
1267 return VC_ERROR_NOT_SUPPORTED;
1270 if (NULL == vc_command) {
1271 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1272 return VC_ERROR_INVALID_PARAMETER;
1275 vc_cmd_s* cmd = NULL;
1276 cmd = (vc_cmd_s*)vc_command;
1278 cmd->format = format;
1280 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1285 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1287 if (0 != __vc_cmd_get_feature_enabled()) {
1288 return VC_ERROR_NOT_SUPPORTED;
1291 if (NULL == vc_command || NULL == format) {
1292 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1293 return VC_ERROR_INVALID_PARAMETER;
1296 vc_cmd_s* cmd = NULL;
1297 cmd = (vc_cmd_s*)vc_command;
1299 *format = cmd->format;
1301 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1306 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1308 if (0 != __vc_cmd_get_feature_enabled()) {
1309 return VC_ERROR_NOT_SUPPORTED;
1311 if (0 != __vc_cmd_check_privilege()) {
1312 return VC_ERROR_PERMISSION_DENIED;
1315 if (NULL == vc_command) {
1316 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1317 return VC_ERROR_INVALID_PARAMETER;
1320 vc_cmd_s* cmd = NULL;
1321 cmd = (vc_cmd_s*)vc_command;
1325 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1330 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1332 if (0 != __vc_cmd_get_feature_enabled()) {
1333 return VC_ERROR_NOT_SUPPORTED;
1335 if (0 != __vc_cmd_check_privilege()) {
1336 return VC_ERROR_PERMISSION_DENIED;
1339 if (NULL == vc_command || NULL == pid) {
1340 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1341 return VC_ERROR_INVALID_PARAMETER;
1344 vc_cmd_s* cmd = NULL;
1345 cmd = (vc_cmd_s*)vc_command;
1349 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1354 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1356 if (0 != __vc_cmd_get_feature_enabled()) {
1357 return VC_ERROR_NOT_SUPPORTED;
1359 if (0 != __vc_cmd_check_privilege()) {
1360 return VC_ERROR_PERMISSION_DENIED;
1363 if (NULL == vc_command) {
1364 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1365 return VC_ERROR_INVALID_PARAMETER;
1368 vc_cmd_s* cmd = NULL;
1369 cmd = (vc_cmd_s*)vc_command;
1371 cmd->domain = domain;
1373 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1378 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1380 if (0 != __vc_cmd_get_feature_enabled()) {
1381 return VC_ERROR_NOT_SUPPORTED;
1383 if (0 != __vc_cmd_check_privilege()) {
1384 return VC_ERROR_PERMISSION_DENIED;
1387 if (NULL == vc_command || NULL == domain) {
1388 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1389 return VC_ERROR_INVALID_PARAMETER;
1392 vc_cmd_s* cmd = NULL;
1393 cmd = (vc_cmd_s*)vc_command;
1395 *domain = cmd->domain;
1397 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1403 * @brief Sets key value of command.
1405 * @param[in] vc_command Command handle
1406 * @param[in] key key value
1407 * @param[in] modifier modifier value
1409 * @return 0 on success, otherwise a negative error value
1410 * @retval #VC_ERROR_NONE Successful
1411 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1413 * @see vc_cmd_get_result_key()
1415 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1417 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1419 if (NULL == vc_command) {
1420 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1421 return VC_ERROR_INVALID_PARAMETER;
1424 vc_cmd_s* cmd = NULL;
1425 cmd = (vc_cmd_s*)vc_command;
1427 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1430 cmd->modifier = modifier;
1432 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1438 * @brief Gets key value of command.
1440 * @param[in] vc_command Command handle
1441 * @param[out] key key value
1442 * @param[out] modifier modifier value
1444 * @return 0 on success, otherwise a negative error value
1445 * @retval #VC_ERROR_NONE Successful
1446 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1448 * @see vc_cmd_add_result_key()
1450 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1452 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1454 if (NULL == vc_command || NULL == key || NULL == modifier) {
1455 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1456 return VC_ERROR_INVALID_PARAMETER;
1459 vc_cmd_s* cmd = NULL;
1460 cmd = (vc_cmd_s*)vc_command;
1463 *modifier = cmd->modifier;
1465 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1470 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1472 if (NULL == vc_cmd_list) {
1476 vc_cmd_list_s* list = NULL;
1477 list = (vc_cmd_list_s*)vc_cmd_list;
1479 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1480 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1482 int count = g_slist_length(list->list);
1485 vc_cmd_s *cmd = NULL;
1487 for (i = 0; i < count ; i++) {
1488 cmd = g_slist_nth_data(list->list, i);
1491 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)",
1492 i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1496 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1501 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1503 if (0 != __vc_cmd_get_feature_enabled()) {
1504 return VC_ERROR_NOT_SUPPORTED;
1507 if (NULL == vc_cmd || NULL == json) {
1508 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1509 return VC_ERROR_INVALID_PARAMETER;
1512 vc_cmd_s* cmd = NULL;
1513 cmd = (vc_cmd_s*)vc_cmd;
1515 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1516 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1517 return VC_ERROR_INVALID_PARAMETER;
1520 if (0 != vc_info_parser_get_nlu_result(json)) {
1521 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1522 return VC_ERROR_OPERATION_FAILED;
1528 static void __vc_cmd_regex_deinit(int num_regex)
1530 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1533 for (i = 0; num_regex > i; i++) {
1537 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1540 static int __vc_cmd_regex_init()
1542 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1544 int cflags = REG_EXTENDED | REG_ICASE;
1550 vc_config_mgr_get_default_language(&lang);
1552 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1553 return VC_ERROR_OPERATION_FAILED;
1556 if (!strcmp("en_US", lang)) {
1558 } else if (!strcmp("ko_KR", lang)) {
1564 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1565 return VC_ERROR_INVALID_LANGUAGE;
1571 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1573 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1575 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1576 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1578 regerror(ret, ®[0], errStr, sizeof(errStr));
1580 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1581 return VC_ERROR_OPERATION_FAILED;
1584 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1585 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1587 regerror(ret, ®[1], errStr, sizeof(errStr));
1588 __vc_cmd_regex_deinit(1);
1590 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1591 return VC_ERROR_OPERATION_FAILED;
1594 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1595 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1597 regerror(ret, ®[2], errStr, sizeof(errStr));
1598 __vc_cmd_regex_deinit(2);
1600 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1601 return VC_ERROR_OPERATION_FAILED;
1604 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1605 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1607 regerror(ret, ®[3], errStr, sizeof(errStr));
1608 __vc_cmd_regex_deinit(3);
1610 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1611 return VC_ERROR_OPERATION_FAILED;
1614 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1615 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1617 regerror(ret, ®[4], errStr, sizeof(errStr));
1618 __vc_cmd_regex_deinit(4);
1620 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1621 return VC_ERROR_OPERATION_FAILED;
1624 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1625 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1627 regerror(ret, ®[5], errStr, sizeof(errStr));
1628 __vc_cmd_regex_deinit(5);
1630 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1631 return VC_ERROR_OPERATION_FAILED;
1634 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1635 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1637 regerror(ret, ®[6], errStr, sizeof(errStr));
1638 __vc_cmd_regex_deinit(6);
1640 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1641 return VC_ERROR_OPERATION_FAILED;
1644 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1645 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1647 regerror(ret, ®[7], errStr, sizeof(errStr));
1648 __vc_cmd_regex_deinit(7);
1650 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1651 return VC_ERROR_OPERATION_FAILED;
1654 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1655 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1657 regerror(ret, ®[8], errStr, sizeof(errStr));
1658 __vc_cmd_regex_deinit(8);
1660 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1661 return VC_ERROR_OPERATION_FAILED;
1664 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1665 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1667 regerror(ret, ®[9], errStr, sizeof(errStr));
1668 __vc_cmd_regex_deinit(9);
1670 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1671 return VC_ERROR_OPERATION_FAILED;
1674 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1675 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1677 regerror(ret, ®[10], errStr, sizeof(errStr));
1678 __vc_cmd_regex_deinit(10);
1680 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1681 return VC_ERROR_OPERATION_FAILED;
1684 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1685 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1687 regerror(ret, ®[11], errStr, sizeof(errStr));
1688 __vc_cmd_regex_deinit(11);
1690 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1691 return VC_ERROR_OPERATION_FAILED;
1694 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1696 return VC_ERROR_NONE;
1699 static void __vc_cmd_add_year(struct tm *td, int year)
1701 td->tm_year += year;
1704 static void __vc_cmd_add_mon(struct tm *td, int mon)
1708 mon = td->tm_mon + mon;
1712 __vc_cmd_add_year(td, year);
1715 td->tm_mon = mon % 12;
1718 static void __vc_cmd_add_mday(struct tm *td, int mday)
1720 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1721 int year = td->tm_year + 1900;
1725 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1727 mday = td->tm_mday + mday;
1729 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1730 mday -= max_day[mon % 12];
1732 if (11 == mon % 12) {
1735 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1743 mon = mon - td->tm_mon;
1746 __vc_cmd_add_mon(td, mon);
1752 static void __vc_cmd_add_hour(struct tm *td, int hour)
1756 hour = td->tm_hour + hour;
1760 __vc_cmd_add_mday(td, day);
1763 td->tm_hour = hour % 24;
1766 static void __vc_cmd_add_min(struct tm *td, int min)
1770 min = td->tm_min + min;
1774 __vc_cmd_add_hour(td, hour);
1777 td->tm_min = min % 60;
1780 static void __copy_struct_tm(struct tm *des, struct tm *src)
1782 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1784 des->tm_sec = src->tm_sec;
1785 des->tm_min = src->tm_min;
1786 des->tm_hour = src->tm_hour;
1787 des->tm_mday = src->tm_mday;
1788 des->tm_mon = src->tm_mon;
1789 des->tm_year = src->tm_year;
1790 des->tm_wday = src->tm_wday;
1791 des->tm_yday = src->tm_yday;
1792 des->tm_isdst = src->tm_isdst;
1794 des->tm_gmtoff = src->tm_gmtoff;
1795 des->tm_zone = src->tm_zone;
1798 static void __update_data_sidx(int idx)
1800 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1803 static void __update_data_eidx(int idx)
1805 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1808 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1810 regmatch_t pmatch[3];
1816 ret = regexec(®[6], str, 3, pmatch, 0);
1819 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1821 if (12 < td->tm_hour) {
1822 __vc_cmd_add_mday(td, 1);
1828 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1830 __vc_cmd_add_mday(td, 1);
1835 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1837 __update_data_sidx(pmatch[0].rm_so);
1838 __update_data_eidx(pmatch[0].rm_eo);
1841 return VC_ERROR_NONE;
1844 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1845 return VC_ERROR_NONE;
1848 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1850 regmatch_t pmatch[2];
1858 char *tempstr = NULL;
1861 ret = regexec(®[3], str, 1, pmatch, 0);
1863 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1866 sidx = pmatch[0].rm_so;
1867 eidx = pmatch[0].rm_eo;
1869 ret = regexec(®[4], str, 2, pmatch, 0);
1871 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1874 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1875 return VC_ERROR_OPERATION_FAILED;
1877 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1879 if (NULL == tempstr) {
1880 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1881 return VC_ERROR_OUT_OF_MEMORY;
1884 hour = atoi(tempstr);
1889 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1891 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1892 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1895 ret = regexec(®[5], str, 2, pmatch, 0);
1897 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1900 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1901 return VC_ERROR_OPERATION_FAILED;
1903 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1905 if (NULL == tempstr) {
1906 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1907 return VC_ERROR_OUT_OF_MEMORY;
1910 min = atoi(tempstr);
1915 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1917 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1918 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1921 if (hour < 0 && min < 0) {
1922 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1923 return VC_ERROR_NONE;
1926 hour = 0 > hour ? 0 : hour;
1927 min = 0 > min ? 0 : min;
1929 min = min + (hour * 60);
1931 __vc_cmd_add_min(td, min);
1934 __update_data_sidx(sidx);
1935 __update_data_eidx(eidx);
1938 return VC_ERROR_NONE;
1941 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1942 return VC_ERROR_NONE;
1945 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1947 regmatch_t pmatch[5];
1956 char *tempstr = NULL;
1959 ret = regexec(®[0], str, 5, pmatch, 0);
1961 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1965 sidx = pmatch[0].rm_so;
1966 eidx = pmatch[0].rm_eo;
1969 ret = regexec(®[1], str, 2, pmatch, 0);
1971 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1974 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1975 return VC_ERROR_OPERATION_FAILED;
1977 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1979 if (NULL == tempstr) {
1980 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1981 return VC_ERROR_OUT_OF_MEMORY;
1984 hour = atoi(tempstr);
1987 hour = hour + 12 * flag;
1989 if (12 == hour) hour = 0;
1990 else if (24 == hour) hour = 12;
1993 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1994 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1997 return VC_ERROR_NONE;
2003 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2005 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2006 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2007 } else if (0 < flag) {
2008 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2009 return VC_ERROR_NONE;
2012 ret = regexec(®[2], str, 2, pmatch, 0);
2015 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2017 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
2019 if (NULL == tempstr) {
2020 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2021 return VC_ERROR_OUT_OF_MEMORY;
2024 min = atoi(tempstr);
2026 if (0 > min || 60 <= min) {
2027 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2030 return VC_ERROR_NONE;
2042 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
2043 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2044 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2047 if (0 > hour && 0 > min) {
2048 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2049 return VC_ERROR_NONE;
2052 if (0 <= min && 0 <= hour) {
2053 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
2057 } else if (0 <= min) {
2059 vc_config_mgr_get_default_language(&lang);
2061 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2062 return VC_ERROR_OPERATION_FAILED;
2065 if (!strcmp("en_US", lang)) {
2066 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2069 return VC_ERROR_NONE;
2071 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
2078 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
2086 __update_data_sidx(sidx);
2087 __update_data_eidx(eidx);
2090 return VC_ERROR_NONE;
2093 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
2095 regmatch_t pmatch[10];
2101 ret = regexec(®[10], str, 5, pmatch, 0);
2103 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
2105 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2107 td->tm_year = td_now.tm_year;
2108 td->tm_mon = td_now.tm_mon;
2109 td->tm_mday = td_now.tm_mday;
2111 __vc_cmd_add_mday(td, idx - 1);
2113 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2115 __update_data_sidx(pmatch[0].rm_so);
2116 __update_data_eidx(pmatch[0].rm_eo);
2119 return VC_ERROR_NONE;
2122 ret = regexec(®[11], str, 10, pmatch, 0);
2124 for (idx = 1; 10 > idx; idx++) {
2125 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2130 td->tm_year = td_now.tm_year;
2131 td->tm_mon = td_now.tm_mon;
2132 td->tm_mday = td_now.tm_mday;
2134 __vc_cmd_add_mday(td, idx + 1);
2136 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2138 __update_data_sidx(pmatch[0].rm_so);
2139 __update_data_eidx(pmatch[0].rm_eo);
2142 return VC_ERROR_NONE;
2145 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2146 return VC_ERROR_NONE;
2149 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2151 regmatch_t pmatch[13];
2162 char *tempstr = NULL;
2165 ret = regexec(®[9], str, 2, pmatch, 0);
2167 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2170 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2171 return VC_ERROR_OPERATION_FAILED;
2173 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2175 if (NULL == tempstr) {
2176 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2177 return VC_ERROR_OUT_OF_MEMORY;
2180 day = atoi(tempstr);
2185 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2187 sidx = pmatch[0].rm_so;
2188 eidx = pmatch[0].rm_eo;
2190 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2191 return VC_ERROR_NONE;
2194 ret = regexec(®[8], str, 13, pmatch, 0);
2196 for (idx = 1; 13 > idx; idx++) {
2197 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2207 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2209 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2210 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2213 vc_config_mgr_get_default_language(&lang);
2215 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2216 return VC_ERROR_OPERATION_FAILED;
2219 if (!strcmp("en_US", lang)) {
2220 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2223 return VC_ERROR_NONE;
2232 ret = regexec(®[7], str, 3, pmatch, 0);
2234 if (!m_flag) return -1;
2236 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2239 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2240 return VC_ERROR_OPERATION_FAILED;
2242 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2244 if (NULL == tempstr) {
2245 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2246 return VC_ERROR_OUT_OF_MEMORY;
2249 year = atoi(tempstr);
2250 year = 1900 < year ? year - 1900 : year + 100;
2256 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2258 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2259 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2264 if (0 > g_time_flag) {
2268 } else if (2 == g_time_flag) {
2269 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2270 return VC_ERROR_NONE;
2273 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2274 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2276 if (max_day[mon] < day || 1 > day) {
2277 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2278 return VC_ERROR_NONE;
2287 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2289 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2290 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2294 __update_data_sidx(sidx);
2295 __update_data_eidx(eidx);
2298 return VC_ERROR_NONE;
2301 static int __vc_cmd_time_check(const char *str, struct tm *td)
2303 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2308 ret = __vc_cmd_tphrase_check(str, td, &exist);
2312 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2314 } else if (VC_ERROR_NONE != ret) {
2315 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2319 ret = __vc_cmd_trelative_check(str, td, &exist);
2323 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2325 } else if (VC_ERROR_NONE != ret) {
2326 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2330 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2334 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2336 } else if (VC_ERROR_NONE != ret) {
2337 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2341 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2342 return VC_ERROR_NONE;
2345 static int __vc_cmd_date_check(const char *str, struct tm *td)
2347 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2352 ret = __vc_cmd_dphrase_check(str, td, &exist);
2356 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2358 } else if (VC_ERROR_NONE != ret) {
2359 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2363 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2367 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2369 } else if (VC_ERROR_NONE != ret) {
2370 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2374 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2375 return VC_ERROR_NONE;
2378 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2380 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2383 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2386 if (NULL == text || NULL == result || NULL == remain) {
2387 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2388 return VC_ERROR_INVALID_PARAMETER;
2392 ret = __vc_cmd_regex_init();
2393 if (VC_ERROR_NONE != ret) {
2394 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2398 g_data_sidx = g_data_eidx = -1;
2401 localtime_r(&t_now, &td_now);
2402 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2404 __copy_struct_tm(&td, &td_now);
2405 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2406 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);
2408 g_time_flag = g_date_flag = -1;
2410 ret = __vc_cmd_time_check(text, &td);
2411 if (VC_ERROR_NONE != ret) {
2412 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2416 ret = __vc_cmd_date_check(text, &td);
2417 if (VC_ERROR_NONE != ret) {
2418 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2422 __vc_cmd_regex_deinit(12);
2424 if (g_time_flag > 0 || g_date_flag > 0) {
2425 *result = mktime(&td);
2427 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2428 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2429 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);
2431 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2433 if (NULL == *remain) {
2434 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2435 return VC_ERROR_OUT_OF_MEMORY;
2438 strncpy(*remain, text, g_data_sidx);
2439 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2441 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2444 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2446 return VC_ERROR_NONE;