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 if (true == g_privilege_allowed)
139 return VC_ERROR_NONE;
141 pthread_mutex_lock(&g_cynara_mutex);
143 if (false == g_privilege_allowed) {
145 ret = __check_privilege_initialize();
147 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
148 g_privilege_allowed = false;
149 pthread_mutex_unlock(&g_cynara_mutex);
150 return VC_ERROR_PERMISSION_DENIED;
154 snprintf(uid, 16, "%d", getuid());
156 ret = __check_privilege(uid, VC_PRIVILEGE);
157 __check_privilege_deinitialize();
159 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
160 g_privilege_allowed = false;
161 pthread_mutex_unlock(&g_cynara_mutex);
162 return VC_ERROR_PERMISSION_DENIED;
166 g_privilege_allowed = true;
167 pthread_mutex_unlock(&g_cynara_mutex);
168 return VC_ERROR_NONE;
171 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
173 if (0 != __vc_cmd_get_feature_enabled()) {
174 return VC_ERROR_NOT_SUPPORTED;
176 if (0 != __vc_cmd_check_privilege()) {
177 return VC_ERROR_PERMISSION_DENIED;
180 if (NULL == vc_cmd_list) {
181 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
182 return VC_ERROR_INVALID_PARAMETER;
185 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
188 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
189 return VC_ERROR_OUT_OF_MEMORY;
195 *vc_cmd_list = (vc_cmd_list_h)list;
197 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
199 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
201 return VC_ERROR_NONE;
204 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
206 if (0 != __vc_cmd_get_feature_enabled()) {
207 return VC_ERROR_NOT_SUPPORTED;
209 if (0 != __vc_cmd_check_privilege()) {
210 return VC_ERROR_PERMISSION_DENIED;
213 if (NULL == vc_cmd_list) {
214 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
215 return VC_ERROR_INVALID_PARAMETER;
218 vc_cmd_list_remove_all(vc_cmd_list, release_command);
220 vc_cmd_list_s* list = NULL;
221 list = (vc_cmd_list_s*)vc_cmd_list;
223 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
226 iter = g_list_find(g_cmdlist_list, list);
228 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
229 return VC_ERROR_INVALID_PARAMETER;
232 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
237 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
238 return VC_ERROR_NONE;
241 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
243 if (0 != __vc_cmd_get_feature_enabled()) {
244 return VC_ERROR_NOT_SUPPORTED;
246 if (0 != __vc_cmd_check_privilege()) {
247 return VC_ERROR_PERMISSION_DENIED;
250 if (NULL == vc_cmd_list || NULL == count) {
251 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
252 return VC_ERROR_INVALID_PARAMETER;
255 vc_cmd_list_s* list = NULL;
256 list = (vc_cmd_list_s*)vc_cmd_list;
258 *count = g_slist_length(list->list);
260 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
262 return VC_ERROR_NONE;
265 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_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 || NULL == vc_command) {
275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
276 return VC_ERROR_INVALID_PARAMETER;
279 vc_cmd_list_s* list = NULL;
280 list = (vc_cmd_list_s*)vc_cmd_list;
282 vc_cmd_s* cmd = NULL;
283 cmd = (vc_cmd_s*)vc_command;
285 list->list = g_slist_append(list->list, cmd);
287 if (1 == g_slist_length(list->list)) {
291 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
293 return VC_ERROR_NONE;
296 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
298 if (0 != __vc_cmd_get_feature_enabled()) {
299 return VC_ERROR_NOT_SUPPORTED;
301 if (0 != __vc_cmd_check_privilege()) {
302 return VC_ERROR_PERMISSION_DENIED;
305 if (NULL == vc_cmd_list || NULL == vc_command) {
306 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
307 return VC_ERROR_INVALID_PARAMETER;
310 vc_cmd_list_s* list = NULL;
311 list = (vc_cmd_list_s*)vc_cmd_list;
313 vc_cmd_s* cmd = NULL;
314 cmd = (vc_cmd_s*)vc_command;
316 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
319 iter = g_slist_find(list->list, cmd);
321 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid");
322 return VC_ERROR_INVALID_PARAMETER;
325 list->list = g_slist_remove_link(list->list, iter);
326 SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command");
328 int len = g_slist_length(list->list);
331 else if (list->index == len)
332 list->index = len - 1;
334 return VC_ERROR_NONE;
337 static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data)
339 vc_cmd_s *temp = NULL;
342 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp);
343 vc_cmd_destroy((vc_cmd_h)temp);
349 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
351 if (0 != __vc_cmd_get_feature_enabled()) {
352 return VC_ERROR_NOT_SUPPORTED;
354 if (0 != __vc_cmd_check_privilege()) {
355 return VC_ERROR_PERMISSION_DENIED;
358 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
360 if (NULL == vc_cmd_list) {
361 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
362 return VC_ERROR_INVALID_PARAMETER;
365 vc_cmd_list_s* list = NULL;
366 list = (vc_cmd_list_s*)vc_cmd_list;
368 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
369 , list, release_command ? "true" : "false");
371 if (true == release_command)
372 g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL);
373 g_slist_free(list->list);
377 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
379 return VC_ERROR_NONE;
382 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
384 if (0 != __vc_cmd_get_feature_enabled()) {
385 return VC_ERROR_NOT_SUPPORTED;
387 if (0 != __vc_cmd_check_privilege()) {
388 return VC_ERROR_PERMISSION_DENIED;
391 if (NULL == vc_cmd_list) {
392 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
393 return VC_ERROR_INVALID_PARAMETER;
396 vc_cmd_list_s* list = NULL;
397 list = (vc_cmd_list_s*)vc_cmd_list;
400 iter = g_slist_nth(list->list, 0);
401 while (NULL != iter) {
402 vc_cmd_s *temp_cmd = NULL;
403 temp_cmd = iter->data;
404 if (NULL == temp_cmd) {
405 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
406 return VC_ERROR_OPERATION_FAILED;
408 if (false == callback((vc_cmd_h)temp_cmd, user_data))
411 iter = g_slist_next(iter);
414 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
416 return VC_ERROR_NONE;
419 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
421 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
423 if (0 != __vc_cmd_get_feature_enabled()) {
424 return VC_ERROR_NOT_SUPPORTED;
426 if (0 != __vc_cmd_check_privilege()) {
427 return VC_ERROR_PERMISSION_DENIED;
430 if (NULL == original) {
431 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
432 return VC_ERROR_INVALID_PARAMETER;
435 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
436 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
437 return VC_ERROR_INVALID_PARAMETER;
440 vc_cmd_list_s* list = NULL;
441 list = (vc_cmd_list_s*)original;
443 vc_cmd_list_h temp_list;
444 if (0 != vc_cmd_list_create(&temp_list)) {
445 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
446 return VC_ERROR_OPERATION_FAILED;
450 iter = g_slist_nth(list->list, 0);
451 while (NULL != iter) {
452 vc_cmd_s *iter_cmd = NULL;
453 iter_cmd = iter->data;
454 if (NULL == iter_cmd) {
455 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
456 return VC_ERROR_OPERATION_FAILED;
460 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
461 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
465 if (iter_type == type) {
467 if (0 != vc_cmd_create(&temp_cmd)) {
468 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
472 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
473 if (NULL != iter_cmd->command)
474 ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command);
475 if (NULL != iter_cmd->parameter)
476 ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter);
478 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
479 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
480 vc_cmd_destroy(temp_cmd);
484 iter = g_slist_next(iter);
488 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
489 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
491 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
494 *filtered = temp_list;
496 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
498 return VC_ERROR_NONE;
501 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
503 if (0 != __vc_cmd_get_feature_enabled()) {
504 return VC_ERROR_NOT_SUPPORTED;
506 if (0 != __vc_cmd_check_privilege()) {
507 return VC_ERROR_PERMISSION_DENIED;
510 if (NULL == vc_cmd_list) {
511 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
512 return VC_ERROR_INVALID_PARAMETER;
515 vc_cmd_list_s* list = NULL;
516 list = (vc_cmd_list_s*)vc_cmd_list;
518 if (0 == g_slist_length(list->list)) {
519 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
520 return VC_ERROR_EMPTY;
525 return VC_ERROR_NONE;
528 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
530 if (0 != __vc_cmd_get_feature_enabled()) {
531 return VC_ERROR_NOT_SUPPORTED;
533 if (0 != __vc_cmd_check_privilege()) {
534 return VC_ERROR_PERMISSION_DENIED;
537 if (NULL == vc_cmd_list) {
538 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
539 return VC_ERROR_INVALID_PARAMETER;
542 vc_cmd_list_s* list = NULL;
543 list = (vc_cmd_list_s*)vc_cmd_list;
545 int count = g_slist_length(list->list);
548 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
549 return VC_ERROR_EMPTY;
551 list->index = count - 1;
552 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
555 return VC_ERROR_NONE;
558 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
560 if (0 != __vc_cmd_get_feature_enabled()) {
561 return VC_ERROR_NOT_SUPPORTED;
563 if (0 != __vc_cmd_check_privilege()) {
564 return VC_ERROR_PERMISSION_DENIED;
567 if (NULL == vc_cmd_list) {
568 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
569 return VC_ERROR_INVALID_PARAMETER;
572 vc_cmd_list_s* list = NULL;
573 list = (vc_cmd_list_s*)vc_cmd_list;
575 int count = g_slist_length(list->list);
577 if (list->index < count - 1) {
578 list->index = list->index + 1;
579 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
581 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
582 return VC_ERROR_ITERATION_END;
585 return VC_ERROR_NONE;
588 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
590 if (0 != __vc_cmd_get_feature_enabled()) {
591 return VC_ERROR_NOT_SUPPORTED;
593 if (0 != __vc_cmd_check_privilege()) {
594 return VC_ERROR_PERMISSION_DENIED;
597 if (NULL == vc_cmd_list) {
598 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
599 return VC_ERROR_INVALID_PARAMETER;
602 vc_cmd_list_s* list = NULL;
603 list = (vc_cmd_list_s*)vc_cmd_list;
605 if (list->index > 0) {
606 list->index = list->index - 1;
607 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
609 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
610 return VC_ERROR_ITERATION_END;
613 return VC_ERROR_NONE;
616 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
618 if (0 != __vc_cmd_get_feature_enabled()) {
619 return VC_ERROR_NOT_SUPPORTED;
621 if (0 != __vc_cmd_check_privilege()) {
622 return VC_ERROR_PERMISSION_DENIED;
625 if (NULL == vc_cmd_list || NULL == vc_command) {
626 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
627 return VC_ERROR_INVALID_PARAMETER;
630 vc_cmd_list_s* list = NULL;
631 list = (vc_cmd_list_s*)vc_cmd_list;
633 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
635 if (0 == g_slist_length(list->list)) {
636 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
638 return VC_ERROR_EMPTY;
641 vc_cmd_s *temp_cmd = NULL;
642 temp_cmd = g_slist_nth_data(list->list, list->index);
644 *vc_command = (vc_cmd_h)temp_cmd;
646 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
648 return VC_ERROR_NONE;
652 int vc_cmd_create(vc_cmd_h* vc_command)
654 if (0 != __vc_cmd_get_feature_enabled()) {
655 return VC_ERROR_NOT_SUPPORTED;
657 if (0 != __vc_cmd_check_privilege()) {
658 return VC_ERROR_PERMISSION_DENIED;
661 if (NULL == vc_command) {
662 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
663 return VC_ERROR_INVALID_PARAMETER;
666 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
668 if (NULL == command) {
669 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
670 return VC_ERROR_OUT_OF_MEMORY;
676 command->type = VC_COMMAND_TYPE_NONE;
677 command->format = VC_CMD_FORMAT_FIXED;
678 command->command = NULL;
679 command->parameter = NULL;
681 command->priority = 0;
682 command->key = VC_KEY_NONE;
683 command->modifier = VC_MODIFIER_NONE;
684 command->invocation_name = NULL;
685 command->appid = NULL;
686 command->fixed = NULL;
687 command->coordinates = NULL;
689 *vc_command = (vc_cmd_h)command;
691 g_cmd_list = g_list_append(g_cmd_list, command);
693 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
695 return VC_ERROR_NONE;
698 int vc_cmd_destroy(vc_cmd_h vc_command)
700 if (0 != __vc_cmd_get_feature_enabled()) {
701 return VC_ERROR_NOT_SUPPORTED;
703 if (0 != __vc_cmd_check_privilege()) {
704 return VC_ERROR_PERMISSION_DENIED;
707 if (NULL == vc_command) {
708 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
709 return VC_ERROR_INVALID_PARAMETER;
712 vc_cmd_s* command = NULL;
713 command = (vc_cmd_s*)vc_command;
715 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
718 iter = g_list_find(g_cmd_list, command);
720 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid");
721 return VC_ERROR_INVALID_PARAMETER;
724 g_cmd_list = g_list_remove_link(g_cmd_list, iter);
726 if (command->command)
727 free(command->command);
728 command->command = NULL;
729 if (command->parameter)
730 free(command->parameter);
731 command->parameter = NULL;
732 if (command->invocation_name)
733 free(command->invocation_name);
734 command->invocation_name = NULL;
736 free(command->appid);
737 command->appid = NULL;
739 free(command->fixed);
740 command->fixed = NULL;
741 if (command->coordinates)
742 free(command->coordinates);
743 command->coordinates = NULL;
747 return VC_ERROR_NONE;
750 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
752 if (0 != __vc_cmd_get_feature_enabled()) {
753 return VC_ERROR_NOT_SUPPORTED;
755 if (0 != __vc_cmd_check_privilege()) {
756 return VC_ERROR_PERMISSION_DENIED;
759 if (NULL == vc_command) {
760 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
761 return VC_ERROR_INVALID_PARAMETER;
764 vc_cmd_s* cmd = NULL;
765 cmd = (vc_cmd_s*)vc_command;
768 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
773 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
775 if (0 != __vc_cmd_get_feature_enabled()) {
776 return VC_ERROR_NOT_SUPPORTED;
778 if (0 != __vc_cmd_check_privilege()) {
779 return VC_ERROR_PERMISSION_DENIED;
782 if (NULL == vc_command || NULL == id) {
783 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
784 return VC_ERROR_INVALID_PARAMETER;
787 vc_cmd_s* cmd = NULL;
788 cmd = (vc_cmd_s*)vc_command;
791 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
796 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
798 if (0 != __vc_cmd_get_feature_enabled()) {
799 return VC_ERROR_NOT_SUPPORTED;
802 if (NULL == vc_command) {
803 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
804 return VC_ERROR_INVALID_PARAMETER;
808 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
809 return VC_ERROR_INVALID_PARAMETER;
812 vc_cmd_s* cmd = NULL;
813 cmd = (vc_cmd_s*)vc_command;
818 cmd->appid = strdup(appid);
820 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
824 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
826 if (0 != __vc_cmd_get_feature_enabled()) {
827 return VC_ERROR_NOT_SUPPORTED;
830 if (NULL == vc_command || NULL == appid) {
831 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
832 return VC_ERROR_INVALID_PARAMETER;
835 vc_cmd_s* cmd = NULL;
836 cmd = (vc_cmd_s*)vc_command;
839 *appid = strdup(gettext(cmd->appid));
843 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
848 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
850 if (0 != __vc_cmd_get_feature_enabled()) {
851 return VC_ERROR_NOT_SUPPORTED;
853 if (0 != __vc_cmd_check_privilege()) {
854 return VC_ERROR_PERMISSION_DENIED;
857 if (NULL == vc_command) {
858 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
859 return VC_ERROR_INVALID_PARAMETER;
862 vc_cmd_s* cmd = NULL;
863 cmd = (vc_cmd_s*)vc_command;
868 cmd->command = strdup(command);
870 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
875 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
877 if (0 != __vc_cmd_get_feature_enabled()) {
878 return VC_ERROR_NOT_SUPPORTED;
880 if (0 != __vc_cmd_check_privilege()) {
881 return VC_ERROR_PERMISSION_DENIED;
884 if (NULL == vc_command || NULL == command) {
885 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
886 return VC_ERROR_INVALID_PARAMETER;
889 vc_cmd_s* cmd = NULL;
890 cmd = (vc_cmd_s*)vc_command;
893 *command = strdup(gettext(cmd->command));
897 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
902 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
904 if (0 != __vc_cmd_get_feature_enabled()) {
905 return VC_ERROR_NOT_SUPPORTED;
907 if (0 != __vc_cmd_check_privilege()) {
908 return VC_ERROR_PERMISSION_DENIED;
911 if (NULL == vc_command || NULL == command) {
912 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
913 return VC_ERROR_INVALID_PARAMETER;
916 vc_cmd_s* cmd = NULL;
917 cmd = (vc_cmd_s*)vc_command;
920 free(cmd->parameter);
921 cmd->parameter = NULL;
922 cmd->parameter = strdup(command);
923 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
928 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
930 if (0 != __vc_cmd_get_feature_enabled()) {
931 return VC_ERROR_NOT_SUPPORTED;
934 if (NULL == vc_command || NULL == command) {
935 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
936 return VC_ERROR_INVALID_PARAMETER;
939 vc_cmd_s* cmd = NULL;
940 cmd = (vc_cmd_s*)vc_command;
943 *command = strdup(gettext(cmd->parameter));
947 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
952 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
954 if (0 != __vc_cmd_get_feature_enabled()) {
955 return VC_ERROR_NOT_SUPPORTED;
958 if (NULL == vc_command) {
959 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
960 return VC_ERROR_INVALID_PARAMETER;
964 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
965 return VC_ERROR_INVALID_PARAMETER;
968 vc_cmd_s* cmd = NULL;
969 cmd = (vc_cmd_s*)vc_command;
974 cmd->fixed = strdup(fixed);
976 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
980 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
982 if (0 != __vc_cmd_get_feature_enabled()) {
983 return VC_ERROR_NOT_SUPPORTED;
986 if (NULL == vc_command || NULL == fixed) {
987 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
988 return VC_ERROR_INVALID_PARAMETER;
991 vc_cmd_s* cmd = NULL;
992 cmd = (vc_cmd_s*)vc_command;
995 *fixed = strdup(gettext(cmd->fixed));
999 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1004 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1006 if (0 != __vc_cmd_get_feature_enabled()) {
1007 return VC_ERROR_NOT_SUPPORTED;
1010 if (NULL == vc_command) {
1011 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1012 return VC_ERROR_INVALID_PARAMETER;
1015 if (NULL == invocation_name) {
1016 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1017 return VC_ERROR_INVALID_PARAMETER;
1020 vc_cmd_s* cmd = NULL;
1021 cmd = (vc_cmd_s*)vc_command;
1023 if (cmd->invocation_name)
1024 free(cmd->invocation_name);
1025 cmd->invocation_name = NULL;
1026 cmd->invocation_name = strdup(invocation_name);
1028 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1032 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1034 if (0 != __vc_cmd_get_feature_enabled()) {
1035 return VC_ERROR_NOT_SUPPORTED;
1038 if (NULL == vc_command || NULL == invocation_name) {
1039 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1040 return VC_ERROR_INVALID_PARAMETER;
1043 vc_cmd_s* cmd = NULL;
1044 cmd = (vc_cmd_s*)vc_command;
1046 if (cmd->invocation_name)
1047 *invocation_name = strdup(gettext(cmd->invocation_name));
1049 *invocation_name = NULL;
1051 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1055 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1057 if (0 != __vc_cmd_get_feature_enabled()) {
1058 return VC_ERROR_NOT_SUPPORTED;
1060 if (0 != __vc_cmd_check_privilege()) {
1061 return VC_ERROR_PERMISSION_DENIED;
1064 if (NULL == vc_command) {
1065 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1066 return VC_ERROR_INVALID_PARAMETER;
1069 vc_cmd_s* cmd = NULL;
1070 cmd = (vc_cmd_s*)vc_command;
1074 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1079 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1081 if (0 != __vc_cmd_get_feature_enabled()) {
1082 return VC_ERROR_NOT_SUPPORTED;
1084 if (0 != __vc_cmd_check_privilege()) {
1085 return VC_ERROR_PERMISSION_DENIED;
1088 if (NULL == vc_command || NULL == type) {
1089 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1090 return VC_ERROR_INVALID_PARAMETER;
1093 vc_cmd_s* cmd = NULL;
1094 cmd = (vc_cmd_s*)vc_command;
1098 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1103 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1105 if (0 != __vc_cmd_get_feature_enabled()) {
1106 return VC_ERROR_NOT_SUPPORTED;
1109 if (NULL == vc_command) {
1110 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1111 return VC_ERROR_INVALID_PARAMETER;
1114 vc_cmd_s* cmd = NULL;
1115 cmd = (vc_cmd_s*)vc_command;
1117 cmd->format = format;
1119 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1124 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1126 if (0 != __vc_cmd_get_feature_enabled()) {
1127 return VC_ERROR_NOT_SUPPORTED;
1130 if (NULL == vc_command || NULL == format) {
1131 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1132 return VC_ERROR_INVALID_PARAMETER;
1135 vc_cmd_s* cmd = NULL;
1136 cmd = (vc_cmd_s*)vc_command;
1138 *format = cmd->format;
1140 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1145 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1147 if (0 != __vc_cmd_get_feature_enabled()) {
1148 return VC_ERROR_NOT_SUPPORTED;
1150 if (0 != __vc_cmd_check_privilege()) {
1151 return VC_ERROR_PERMISSION_DENIED;
1154 if (NULL == vc_command) {
1155 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1156 return VC_ERROR_INVALID_PARAMETER;
1159 vc_cmd_s* cmd = NULL;
1160 cmd = (vc_cmd_s*)vc_command;
1164 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1169 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1171 if (0 != __vc_cmd_get_feature_enabled()) {
1172 return VC_ERROR_NOT_SUPPORTED;
1174 if (0 != __vc_cmd_check_privilege()) {
1175 return VC_ERROR_PERMISSION_DENIED;
1178 if (NULL == vc_command || NULL == pid) {
1179 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1180 return VC_ERROR_INVALID_PARAMETER;
1183 vc_cmd_s* cmd = NULL;
1184 cmd = (vc_cmd_s*)vc_command;
1188 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1193 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1195 if (0 != __vc_cmd_get_feature_enabled()) {
1196 return VC_ERROR_NOT_SUPPORTED;
1198 if (0 != __vc_cmd_check_privilege()) {
1199 return VC_ERROR_PERMISSION_DENIED;
1202 if (NULL == vc_command) {
1203 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1204 return VC_ERROR_INVALID_PARAMETER;
1207 vc_cmd_s* cmd = NULL;
1208 cmd = (vc_cmd_s*)vc_command;
1210 cmd->domain = domain;
1212 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1217 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1219 if (0 != __vc_cmd_get_feature_enabled()) {
1220 return VC_ERROR_NOT_SUPPORTED;
1222 if (0 != __vc_cmd_check_privilege()) {
1223 return VC_ERROR_PERMISSION_DENIED;
1226 if (NULL == vc_command || NULL == domain) {
1227 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1228 return VC_ERROR_INVALID_PARAMETER;
1231 vc_cmd_s* cmd = NULL;
1232 cmd = (vc_cmd_s*)vc_command;
1234 *domain = cmd->domain;
1236 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1242 * @brief Sets key value of command.
1244 * @param[in] vc_command Command handle
1245 * @param[in] key key value
1246 * @param[in] modifier modifier value
1248 * @return 0 on success, otherwise a negative error value
1249 * @retval #VC_ERROR_NONE Successful
1250 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1252 * @see vc_cmd_get_result_key()
1254 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1256 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1258 if (NULL == vc_command) {
1259 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1260 return VC_ERROR_INVALID_PARAMETER;
1263 vc_cmd_s* cmd = NULL;
1264 cmd = (vc_cmd_s*)vc_command;
1266 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1269 cmd->modifier = modifier;
1271 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1277 * @brief Gets key value of command.
1279 * @param[in] vc_command Command handle
1280 * @param[out] key key value
1281 * @param[out] modifier modifier value
1283 * @return 0 on success, otherwise a negative error value
1284 * @retval #VC_ERROR_NONE Successful
1285 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1287 * @see vc_cmd_add_result_key()
1289 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1291 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1293 if (NULL == vc_command || NULL == key || NULL == modifier) {
1294 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1295 return VC_ERROR_INVALID_PARAMETER;
1298 vc_cmd_s* cmd = NULL;
1299 cmd = (vc_cmd_s*)vc_command;
1302 *modifier = cmd->modifier;
1304 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1309 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1311 if (NULL == vc_cmd_list) {
1315 vc_cmd_list_s* list = NULL;
1316 list = (vc_cmd_list_s*)vc_cmd_list;
1318 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1319 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1322 GSList *iter = NULL;
1323 iter = g_slist_nth(list->list, 0);
1324 while (NULL != iter) {
1325 vc_cmd_s *cmd = NULL;
1328 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
1329 return VC_ERROR_OPERATION_FAILED;
1331 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)",
1332 i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1334 iter = g_slist_next(iter);
1337 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1342 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1344 if (0 != __vc_cmd_get_feature_enabled()) {
1345 return VC_ERROR_NOT_SUPPORTED;
1348 if (NULL == vc_cmd || NULL == json) {
1349 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1350 return VC_ERROR_INVALID_PARAMETER;
1353 vc_cmd_s* cmd = NULL;
1354 cmd = (vc_cmd_s*)vc_cmd;
1356 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1357 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1358 return VC_ERROR_INVALID_PARAMETER;
1361 if (0 != vc_info_parser_get_nlu_result(json)) {
1362 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1363 return VC_ERROR_OPERATION_FAILED;
1369 static void __vc_cmd_regex_deinit(int num_regex)
1371 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1374 for (i = 0; num_regex > i; i++) {
1378 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1381 static int __vc_cmd_regex_init()
1383 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1385 int cflags = REG_EXTENDED | REG_ICASE;
1391 vc_config_mgr_get_default_language(&lang);
1393 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1394 return VC_ERROR_OPERATION_FAILED;
1397 if (!strcmp("en_US", lang)) {
1399 } else if (!strcmp("ko_KR", lang)) {
1405 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1406 return VC_ERROR_INVALID_LANGUAGE;
1412 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1414 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1416 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1417 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1419 regerror(ret, ®[0], errStr, sizeof(errStr));
1421 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1422 return VC_ERROR_OPERATION_FAILED;
1425 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1426 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1428 regerror(ret, ®[1], errStr, sizeof(errStr));
1429 __vc_cmd_regex_deinit(1);
1431 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1432 return VC_ERROR_OPERATION_FAILED;
1435 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1436 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1438 regerror(ret, ®[2], errStr, sizeof(errStr));
1439 __vc_cmd_regex_deinit(2);
1441 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1442 return VC_ERROR_OPERATION_FAILED;
1445 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1446 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1448 regerror(ret, ®[3], errStr, sizeof(errStr));
1449 __vc_cmd_regex_deinit(3);
1451 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1452 return VC_ERROR_OPERATION_FAILED;
1455 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1456 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1458 regerror(ret, ®[4], errStr, sizeof(errStr));
1459 __vc_cmd_regex_deinit(4);
1461 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1462 return VC_ERROR_OPERATION_FAILED;
1465 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1466 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1468 regerror(ret, ®[5], errStr, sizeof(errStr));
1469 __vc_cmd_regex_deinit(5);
1471 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1472 return VC_ERROR_OPERATION_FAILED;
1475 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1476 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1478 regerror(ret, ®[6], errStr, sizeof(errStr));
1479 __vc_cmd_regex_deinit(6);
1481 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1482 return VC_ERROR_OPERATION_FAILED;
1485 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1486 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1488 regerror(ret, ®[7], errStr, sizeof(errStr));
1489 __vc_cmd_regex_deinit(7);
1491 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1492 return VC_ERROR_OPERATION_FAILED;
1495 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1496 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1498 regerror(ret, ®[8], errStr, sizeof(errStr));
1499 __vc_cmd_regex_deinit(8);
1501 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1502 return VC_ERROR_OPERATION_FAILED;
1505 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1506 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1508 regerror(ret, ®[9], errStr, sizeof(errStr));
1509 __vc_cmd_regex_deinit(9);
1511 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1512 return VC_ERROR_OPERATION_FAILED;
1515 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1516 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1518 regerror(ret, ®[10], errStr, sizeof(errStr));
1519 __vc_cmd_regex_deinit(10);
1521 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1522 return VC_ERROR_OPERATION_FAILED;
1525 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1526 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1528 regerror(ret, ®[11], errStr, sizeof(errStr));
1529 __vc_cmd_regex_deinit(11);
1531 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1532 return VC_ERROR_OPERATION_FAILED;
1535 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1537 return VC_ERROR_NONE;
1540 static void __vc_cmd_add_year(struct tm *td, int year)
1542 td->tm_year += year;
1545 static void __vc_cmd_add_mon(struct tm *td, int mon)
1549 mon = td->tm_mon + mon;
1553 __vc_cmd_add_year(td, year);
1556 td->tm_mon = mon % 12;
1559 static void __vc_cmd_add_mday(struct tm *td, int mday)
1561 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1562 int year = td->tm_year + 1900;
1566 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1568 mday = td->tm_mday + mday;
1570 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1571 mday -= max_day[mon % 12];
1573 if (11 == mon % 12) {
1576 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1584 mon = mon - td->tm_mon;
1587 __vc_cmd_add_mon(td, mon);
1593 static void __vc_cmd_add_hour(struct tm *td, int hour)
1597 hour = td->tm_hour + hour;
1601 __vc_cmd_add_mday(td, day);
1604 td->tm_hour = hour % 24;
1607 static void __vc_cmd_add_min(struct tm *td, int min)
1611 min = td->tm_min + min;
1615 __vc_cmd_add_hour(td, hour);
1618 td->tm_min = min % 60;
1621 static void __copy_struct_tm(struct tm *des, struct tm *src)
1623 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1625 des->tm_sec = src->tm_sec;
1626 des->tm_min = src->tm_min;
1627 des->tm_hour = src->tm_hour;
1628 des->tm_mday = src->tm_mday;
1629 des->tm_mon = src->tm_mon;
1630 des->tm_year = src->tm_year;
1631 des->tm_wday = src->tm_wday;
1632 des->tm_yday = src->tm_yday;
1633 des->tm_isdst = src->tm_isdst;
1635 des->tm_gmtoff = src->tm_gmtoff;
1636 des->tm_zone = src->tm_zone;
1639 static void __update_data_sidx(int idx)
1641 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1644 static void __update_data_eidx(int idx)
1646 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1649 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1651 regmatch_t pmatch[3];
1657 ret = regexec(®[6], str, 3, pmatch, 0);
1660 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1662 if (12 < td->tm_hour) {
1663 __vc_cmd_add_mday(td, 1);
1669 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1671 __vc_cmd_add_mday(td, 1);
1676 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1678 __update_data_sidx(pmatch[0].rm_so);
1679 __update_data_eidx(pmatch[0].rm_eo);
1682 return VC_ERROR_NONE;
1685 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1686 return VC_ERROR_NONE;
1689 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1691 regmatch_t pmatch[2];
1699 char *tempstr = NULL;
1702 ret = regexec(®[3], str, 1, pmatch, 0);
1704 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1707 sidx = pmatch[0].rm_so;
1708 eidx = pmatch[0].rm_eo;
1710 ret = regexec(®[4], str, 2, pmatch, 0);
1712 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1715 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1716 return VC_ERROR_OPERATION_FAILED;
1718 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1720 if (NULL == tempstr) {
1721 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1722 return VC_ERROR_OUT_OF_MEMORY;
1725 hour = atoi(tempstr);
1730 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1732 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1733 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1736 ret = regexec(®[5], str, 2, pmatch, 0);
1738 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1741 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1742 return VC_ERROR_OPERATION_FAILED;
1744 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1746 if (NULL == tempstr) {
1747 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1748 return VC_ERROR_OUT_OF_MEMORY;
1751 min = atoi(tempstr);
1756 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1758 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1759 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1762 if (hour < 0 && min < 0) {
1763 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1764 return VC_ERROR_NONE;
1767 hour = 0 > hour ? 0 : hour;
1768 min = 0 > min ? 0 : min;
1770 min = min + (hour * 60);
1772 __vc_cmd_add_min(td, min);
1775 __update_data_sidx(sidx);
1776 __update_data_eidx(eidx);
1779 return VC_ERROR_NONE;
1782 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1783 return VC_ERROR_NONE;
1786 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1788 regmatch_t pmatch[5];
1797 char *tempstr = NULL;
1800 ret = regexec(®[0], str, 5, pmatch, 0);
1802 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1806 sidx = pmatch[0].rm_so;
1807 eidx = pmatch[0].rm_eo;
1810 ret = regexec(®[1], str, 2, pmatch, 0);
1812 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1815 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1816 return VC_ERROR_OPERATION_FAILED;
1818 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1820 if (NULL == tempstr) {
1821 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1822 return VC_ERROR_OUT_OF_MEMORY;
1825 hour = atoi(tempstr);
1828 hour = hour + 12 * flag;
1830 if (12 == hour) hour = 0;
1831 else if (24 == hour) hour = 12;
1834 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1835 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1838 return VC_ERROR_NONE;
1844 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1846 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1847 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1848 } else if (0 < flag) {
1849 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1850 return VC_ERROR_NONE;
1853 ret = regexec(®[2], str, 2, pmatch, 0);
1856 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1858 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1860 if (NULL == tempstr) {
1861 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1862 return VC_ERROR_OUT_OF_MEMORY;
1865 min = atoi(tempstr);
1867 if (0 > min || 60 <= min) {
1868 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1871 return VC_ERROR_NONE;
1883 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1884 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1885 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1888 if (0 > hour && 0 > min) {
1889 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1890 return VC_ERROR_NONE;
1893 if (0 <= min && 0 <= hour) {
1894 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1898 } else if (0 <= min) {
1900 vc_config_mgr_get_default_language(&lang);
1902 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1903 return VC_ERROR_OPERATION_FAILED;
1906 if (!strcmp("en_US", lang)) {
1907 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1910 return VC_ERROR_NONE;
1912 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1919 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1927 __update_data_sidx(sidx);
1928 __update_data_eidx(eidx);
1931 return VC_ERROR_NONE;
1934 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1936 regmatch_t pmatch[10];
1942 ret = regexec(®[10], str, 5, pmatch, 0);
1944 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1946 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1948 td->tm_year = td_now.tm_year;
1949 td->tm_mon = td_now.tm_mon;
1950 td->tm_mday = td_now.tm_mday;
1952 __vc_cmd_add_mday(td, idx - 1);
1954 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1956 __update_data_sidx(pmatch[0].rm_so);
1957 __update_data_eidx(pmatch[0].rm_eo);
1960 return VC_ERROR_NONE;
1963 ret = regexec(®[11], str, 10, pmatch, 0);
1965 for (idx = 1; 10 > idx; idx++) {
1966 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1971 td->tm_year = td_now.tm_year;
1972 td->tm_mon = td_now.tm_mon;
1973 td->tm_mday = td_now.tm_mday;
1975 __vc_cmd_add_mday(td, idx + 1);
1977 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1979 __update_data_sidx(pmatch[0].rm_so);
1980 __update_data_eidx(pmatch[0].rm_eo);
1983 return VC_ERROR_NONE;
1986 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1987 return VC_ERROR_NONE;
1990 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
1992 regmatch_t pmatch[13];
2003 char *tempstr = NULL;
2006 ret = regexec(®[9], str, 2, pmatch, 0);
2008 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2011 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2012 return VC_ERROR_OPERATION_FAILED;
2014 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2016 if (NULL == tempstr) {
2017 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2018 return VC_ERROR_OUT_OF_MEMORY;
2021 day = atoi(tempstr);
2026 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2028 sidx = pmatch[0].rm_so;
2029 eidx = pmatch[0].rm_eo;
2031 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2032 return VC_ERROR_NONE;
2035 ret = regexec(®[8], str, 13, pmatch, 0);
2037 for (idx = 1; 13 > idx; idx++) {
2038 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2048 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2050 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2051 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2054 vc_config_mgr_get_default_language(&lang);
2056 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2057 return VC_ERROR_OPERATION_FAILED;
2060 if (!strcmp("en_US", lang)) {
2061 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2064 return VC_ERROR_NONE;
2073 ret = regexec(®[7], str, 3, pmatch, 0);
2075 if (!m_flag) return -1;
2077 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2080 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2081 return VC_ERROR_OPERATION_FAILED;
2083 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2085 if (NULL == tempstr) {
2086 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2087 return VC_ERROR_OUT_OF_MEMORY;
2090 year = atoi(tempstr);
2091 year = 1900 < year ? year - 1900 : year + 100;
2097 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2099 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2100 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2105 if (0 > g_time_flag) {
2109 } else if (2 == g_time_flag) {
2110 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2111 return VC_ERROR_NONE;
2114 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2115 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2117 if (max_day[mon] < day || 1 > day) {
2118 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2119 return VC_ERROR_NONE;
2128 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2130 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2131 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2135 __update_data_sidx(sidx);
2136 __update_data_eidx(eidx);
2139 return VC_ERROR_NONE;
2142 static int __vc_cmd_time_check(const char *str, struct tm *td)
2144 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2149 ret = __vc_cmd_tphrase_check(str, td, &exist);
2153 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2155 } else if (VC_ERROR_NONE != ret) {
2156 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2160 ret = __vc_cmd_trelative_check(str, td, &exist);
2164 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2166 } else if (VC_ERROR_NONE != ret) {
2167 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2171 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2175 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2177 } else if (VC_ERROR_NONE != ret) {
2178 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2182 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2183 return VC_ERROR_NONE;
2186 static int __vc_cmd_date_check(const char *str, struct tm *td)
2188 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2193 ret = __vc_cmd_dphrase_check(str, td, &exist);
2197 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2199 } else if (VC_ERROR_NONE != ret) {
2200 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2204 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2208 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2210 } else if (VC_ERROR_NONE != ret) {
2211 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2215 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2216 return VC_ERROR_NONE;
2219 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2221 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2224 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2227 if (NULL == text || NULL == result || NULL == remain) {
2228 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2229 return VC_ERROR_INVALID_PARAMETER;
2233 ret = __vc_cmd_regex_init();
2234 if (VC_ERROR_NONE != ret) {
2235 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2239 g_data_sidx = g_data_eidx = -1;
2242 localtime_r(&t_now, &td_now);
2243 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2245 __copy_struct_tm(&td, &td_now);
2246 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2247 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);
2249 g_time_flag = g_date_flag = -1;
2251 ret = __vc_cmd_time_check(text, &td);
2252 if (VC_ERROR_NONE != ret) {
2253 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2257 ret = __vc_cmd_date_check(text, &td);
2258 if (VC_ERROR_NONE != ret) {
2259 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2263 __vc_cmd_regex_deinit(12);
2265 if (g_time_flag > 0 || g_date_flag > 0) {
2266 *result = mktime(&td);
2268 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2269 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2270 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);
2272 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2274 if (NULL == *remain) {
2275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2276 return VC_ERROR_OUT_OF_MEMORY;
2279 strncpy(*remain, text, g_data_sidx);
2280 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2282 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2285 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2287 return VC_ERROR_NONE;