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 pthread_mutex_t g_cmd_mutex = PTHREAD_MUTEX_INITIALIZER;
37 static pthread_mutex_t g_cmd_list_mutex = PTHREAD_MUTEX_INITIALIZER;
38 #define CMD_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_mutex)
39 #define CMD_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_mutex)
40 #define CMD_LIST_MUTEX_LOCK() pthread_mutex_lock(&g_cmd_list_mutex)
41 #define CMD_LIST_MUTEX_UNLOCK() pthread_mutex_unlock(&g_cmd_list_mutex)
43 static int g_feature_enabled = -1;
44 static bool g_privilege_allowed = false;
46 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
47 static cynara *p_cynara = NULL;
48 static GList *g_cmd_list = NULL;
49 static GList *g_cmdlist_list = NULL;
52 // For getting timestamp using regular expression
53 static regex_t reg[MAX_NUM_REGEX];
54 static time_t t_now; //time_t is based on UTC
55 static struct tm td_now; //if use localtime function, the value follows the local time zone, otherwise it follows the UTC.
57 static int g_time_flag;
58 static int g_date_flag;
60 static int g_data_sidx;
61 static int g_data_eidx;
63 static int __vc_cmd_get_feature_enabled()
65 if (0 == g_feature_enabled) {
66 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
67 return VC_ERROR_NOT_SUPPORTED;
68 } else if (-1 == g_feature_enabled) {
69 bool vc_supported = false;
70 bool mic_supported = false;
71 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
72 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
73 if (false == vc_supported || false == mic_supported) {
74 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
75 g_feature_enabled = 0;
76 return VC_ERROR_NOT_SUPPORTED;
79 g_feature_enabled = 1;
81 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
82 return VC_ERROR_NOT_SUPPORTED;
85 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
86 return VC_ERROR_NOT_SUPPORTED;
93 static int __check_privilege_initialize()
95 int ret = cynara_initialize(&p_cynara, NULL);
96 if (CYNARA_API_SUCCESS != ret)
97 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
99 return ret == CYNARA_API_SUCCESS;
102 static int __check_privilege(const char* uid, const char * privilege)
105 char label_path[1024] = "/proc/self/attr/current";
106 char smack_label[1024] = {'\0',};
112 fp = fopen(label_path, "r");
114 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
115 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
120 pid_t pid = getpid();
121 char *session = cynara_session_from_pid(pid);
122 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
123 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
127 if (ret != CYNARA_API_ACCESS_ALLOWED)
132 static void __check_privilege_deinitialize()
136 int ret = cynara_finish(p_cynara);
137 if (ret != CYNARA_API_SUCCESS)
138 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] cynara finish %d", ret);
143 static int __vc_cmd_check_privilege()
145 if (true == g_privilege_allowed)
146 return VC_ERROR_NONE;
148 pthread_mutex_lock(&g_cynara_mutex);
150 if (false == g_privilege_allowed) {
152 ret = __check_privilege_initialize();
154 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
155 g_privilege_allowed = false;
156 pthread_mutex_unlock(&g_cynara_mutex);
157 return VC_ERROR_PERMISSION_DENIED;
161 snprintf(uid, 32, "%d", getuid());
163 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
166 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
167 __check_privilege_deinitialize();
168 g_privilege_allowed = false;
169 pthread_mutex_unlock(&g_cynara_mutex);
170 return VC_ERROR_PERMISSION_DENIED;
174 __check_privilege_deinitialize();
177 g_privilege_allowed = true;
178 pthread_mutex_unlock(&g_cynara_mutex);
179 return VC_ERROR_NONE;
182 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
184 if (0 != __vc_cmd_get_feature_enabled()) {
185 return VC_ERROR_NOT_SUPPORTED;
187 if (0 != __vc_cmd_check_privilege()) {
188 return VC_ERROR_PERMISSION_DENIED;
191 CMD_LIST_MUTEX_LOCK();
193 if (NULL == vc_cmd_list) {
194 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
195 CMD_LIST_MUTEX_UNLOCK();
196 return VC_ERROR_INVALID_PARAMETER;
199 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
202 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
203 CMD_LIST_MUTEX_UNLOCK();
204 return VC_ERROR_OUT_OF_MEMORY;
210 *vc_cmd_list = (vc_cmd_list_h)list;
212 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
214 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
216 CMD_LIST_MUTEX_UNLOCK();
217 return VC_ERROR_NONE;
220 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
222 if (0 != __vc_cmd_get_feature_enabled()) {
223 return VC_ERROR_NOT_SUPPORTED;
225 if (0 != __vc_cmd_check_privilege()) {
226 return VC_ERROR_PERMISSION_DENIED;
229 CMD_LIST_MUTEX_LOCK();
231 if (NULL == vc_cmd_list) {
232 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
233 CMD_LIST_MUTEX_UNLOCK();
234 return VC_ERROR_INVALID_PARAMETER;
238 vc_cmd_list_s* list = NULL;
239 list = (vc_cmd_list_s*)vc_cmd_list;
241 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
244 iter = g_list_find(g_cmdlist_list, list);
246 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
247 CMD_LIST_MUTEX_UNLOCK();
248 return VC_ERROR_INVALID_PARAMETER;
251 g_cmdlist_list = g_list_delete_link(g_cmdlist_list, iter);
253 vc_cmd_list_remove_all((vc_cmd_list_h)list, release_command);
257 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
259 CMD_LIST_MUTEX_UNLOCK();
260 return VC_ERROR_NONE;
263 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
265 if (0 != __vc_cmd_get_feature_enabled()) {
266 return VC_ERROR_NOT_SUPPORTED;
268 if (0 != __vc_cmd_check_privilege()) {
269 return VC_ERROR_PERMISSION_DENIED;
272 if (NULL == vc_cmd_list || NULL == count) {
273 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
274 return VC_ERROR_INVALID_PARAMETER;
277 vc_cmd_list_s* list = NULL;
278 list = (vc_cmd_list_s*)vc_cmd_list;
280 *count = g_slist_length(list->list);
282 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
284 return VC_ERROR_NONE;
287 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
289 if (0 != __vc_cmd_get_feature_enabled()) {
290 return VC_ERROR_NOT_SUPPORTED;
292 if (0 != __vc_cmd_check_privilege()) {
293 return VC_ERROR_PERMISSION_DENIED;
296 if (NULL == vc_cmd_list || NULL == vc_command) {
297 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
298 return VC_ERROR_INVALID_PARAMETER;
301 vc_cmd_list_s* list = NULL;
302 list = (vc_cmd_list_s*)vc_cmd_list;
304 vc_cmd_s* cmd = NULL;
305 cmd = (vc_cmd_s*)vc_command;
307 list->list = g_slist_append(list->list, cmd);
309 if (1 == g_slist_length(list->list)) {
313 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
315 return VC_ERROR_NONE;
318 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
320 if (0 != __vc_cmd_get_feature_enabled()) {
321 return VC_ERROR_NOT_SUPPORTED;
323 if (0 != __vc_cmd_check_privilege()) {
324 return VC_ERROR_PERMISSION_DENIED;
327 if (NULL == vc_cmd_list || NULL == vc_command) {
328 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
329 return VC_ERROR_INVALID_PARAMETER;
332 vc_cmd_list_s* list = NULL;
333 list = (vc_cmd_list_s*)vc_cmd_list;
335 vc_cmd_s* cmd = NULL;
336 cmd = (vc_cmd_s*)vc_command;
338 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
341 iter = g_slist_find(list->list, cmd);
343 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid");
344 return VC_ERROR_INVALID_PARAMETER;
347 list->list = g_slist_remove_link(list->list, iter);
348 SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command");
350 int len = g_slist_length(list->list);
353 else if (list->index == len)
354 list->index = len - 1;
356 return VC_ERROR_NONE;
359 static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data)
361 vc_cmd_s *temp = NULL;
364 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp);
365 vc_cmd_destroy((vc_cmd_h)temp);
371 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
373 if (0 != __vc_cmd_get_feature_enabled()) {
374 return VC_ERROR_NOT_SUPPORTED;
376 if (0 != __vc_cmd_check_privilege()) {
377 return VC_ERROR_PERMISSION_DENIED;
380 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
382 if (NULL == vc_cmd_list) {
383 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
384 return VC_ERROR_INVALID_PARAMETER;
387 vc_cmd_list_s* list = NULL;
388 list = (vc_cmd_list_s*)vc_cmd_list;
390 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
391 , list, release_command ? "true" : "false");
393 if (true == release_command) {
395 g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL);
396 g_slist_free(list->list);
402 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
404 return VC_ERROR_NONE;
407 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
409 if (0 != __vc_cmd_get_feature_enabled()) {
410 return VC_ERROR_NOT_SUPPORTED;
412 if (0 != __vc_cmd_check_privilege()) {
413 return VC_ERROR_PERMISSION_DENIED;
416 if (NULL == vc_cmd_list) {
417 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
418 return VC_ERROR_INVALID_PARAMETER;
421 vc_cmd_list_s* list = NULL;
422 list = (vc_cmd_list_s*)vc_cmd_list;
425 iter = g_slist_nth(list->list, 0);
426 while (NULL != iter) {
427 vc_cmd_s *temp_cmd = NULL;
428 temp_cmd = iter->data;
429 if (NULL == temp_cmd) {
430 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
431 return VC_ERROR_OPERATION_FAILED;
433 if (false == callback((vc_cmd_h)temp_cmd, user_data))
436 iter = g_slist_next(iter);
439 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
441 return VC_ERROR_NONE;
444 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
446 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
448 if (0 != __vc_cmd_get_feature_enabled()) {
449 return VC_ERROR_NOT_SUPPORTED;
451 if (0 != __vc_cmd_check_privilege()) {
452 return VC_ERROR_PERMISSION_DENIED;
455 if (NULL == original) {
456 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
457 return VC_ERROR_INVALID_PARAMETER;
460 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
461 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
462 return VC_ERROR_INVALID_PARAMETER;
465 vc_cmd_list_s* list = NULL;
466 list = (vc_cmd_list_s*)original;
468 vc_cmd_list_h temp_list;
469 if (0 != vc_cmd_list_create(&temp_list)) {
470 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
471 return VC_ERROR_OPERATION_FAILED;
475 iter = g_slist_nth(list->list, 0);
476 while (NULL != iter) {
477 vc_cmd_s *iter_cmd = NULL;
478 iter_cmd = iter->data;
479 if (NULL == iter_cmd) {
480 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
481 return VC_ERROR_OPERATION_FAILED;
485 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
486 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
490 if (iter_type == type) {
492 if (0 != vc_cmd_create(&temp_cmd)) {
493 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
497 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
498 if (NULL != iter_cmd->command)
499 ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command);
500 if (NULL != iter_cmd->parameter)
501 ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter);
503 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
504 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
505 vc_cmd_destroy(temp_cmd);
509 iter = g_slist_next(iter);
513 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
514 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
516 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
519 *filtered = temp_list;
521 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
523 return VC_ERROR_NONE;
526 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
528 if (0 != __vc_cmd_get_feature_enabled()) {
529 return VC_ERROR_NOT_SUPPORTED;
531 if (0 != __vc_cmd_check_privilege()) {
532 return VC_ERROR_PERMISSION_DENIED;
535 if (NULL == vc_cmd_list) {
536 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
537 return VC_ERROR_INVALID_PARAMETER;
540 vc_cmd_list_s* list = NULL;
541 list = (vc_cmd_list_s*)vc_cmd_list;
543 if (0 == g_slist_length(list->list)) {
544 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
545 return VC_ERROR_EMPTY;
550 return VC_ERROR_NONE;
553 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
555 if (0 != __vc_cmd_get_feature_enabled()) {
556 return VC_ERROR_NOT_SUPPORTED;
558 if (0 != __vc_cmd_check_privilege()) {
559 return VC_ERROR_PERMISSION_DENIED;
562 if (NULL == vc_cmd_list) {
563 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
564 return VC_ERROR_INVALID_PARAMETER;
567 vc_cmd_list_s* list = NULL;
568 list = (vc_cmd_list_s*)vc_cmd_list;
570 int count = g_slist_length(list->list);
573 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
574 return VC_ERROR_EMPTY;
576 list->index = count - 1;
577 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
580 return VC_ERROR_NONE;
583 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
585 if (0 != __vc_cmd_get_feature_enabled()) {
586 return VC_ERROR_NOT_SUPPORTED;
588 if (0 != __vc_cmd_check_privilege()) {
589 return VC_ERROR_PERMISSION_DENIED;
592 if (NULL == vc_cmd_list) {
593 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
594 return VC_ERROR_INVALID_PARAMETER;
597 vc_cmd_list_s* list = NULL;
598 list = (vc_cmd_list_s*)vc_cmd_list;
600 int count = g_slist_length(list->list);
602 if (list->index < count - 1) {
603 list->index = list->index + 1;
604 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
606 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
607 return VC_ERROR_ITERATION_END;
610 return VC_ERROR_NONE;
613 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
615 if (0 != __vc_cmd_get_feature_enabled()) {
616 return VC_ERROR_NOT_SUPPORTED;
618 if (0 != __vc_cmd_check_privilege()) {
619 return VC_ERROR_PERMISSION_DENIED;
622 if (NULL == vc_cmd_list) {
623 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
624 return VC_ERROR_INVALID_PARAMETER;
627 vc_cmd_list_s* list = NULL;
628 list = (vc_cmd_list_s*)vc_cmd_list;
630 if (list->index > 0) {
631 list->index = list->index - 1;
632 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
634 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
635 return VC_ERROR_ITERATION_END;
638 return VC_ERROR_NONE;
641 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
643 if (0 != __vc_cmd_get_feature_enabled()) {
644 return VC_ERROR_NOT_SUPPORTED;
646 if (0 != __vc_cmd_check_privilege()) {
647 return VC_ERROR_PERMISSION_DENIED;
650 if (NULL == vc_cmd_list || NULL == vc_command) {
651 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
652 return VC_ERROR_INVALID_PARAMETER;
655 vc_cmd_list_s* list = NULL;
656 list = (vc_cmd_list_s*)vc_cmd_list;
658 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
660 if (0 == g_slist_length(list->list)) {
661 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
663 return VC_ERROR_EMPTY;
666 vc_cmd_s *temp_cmd = NULL;
667 temp_cmd = g_slist_nth_data(list->list, list->index);
669 *vc_command = (vc_cmd_h)temp_cmd;
671 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
673 return VC_ERROR_NONE;
677 int vc_cmd_create(vc_cmd_h* vc_command)
679 if (0 != __vc_cmd_get_feature_enabled()) {
680 return VC_ERROR_NOT_SUPPORTED;
682 if (0 != __vc_cmd_check_privilege()) {
683 return VC_ERROR_PERMISSION_DENIED;
688 if (NULL == vc_command) {
689 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
691 return VC_ERROR_INVALID_PARAMETER;
694 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
696 if (NULL == command) {
697 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
699 return VC_ERROR_OUT_OF_MEMORY;
705 command->type = VC_COMMAND_TYPE_NONE;
706 command->format = VC_CMD_FORMAT_FIXED;
707 command->command = NULL;
708 command->parameter = NULL;
710 command->priority = 0;
711 command->key = VC_KEY_NONE;
712 command->modifier = VC_MODIFIER_NONE;
713 command->invocation_name = NULL;
714 command->appid = NULL;
715 command->fixed = NULL;
716 command->coordinates = NULL;
718 *vc_command = (vc_cmd_h)command;
720 g_cmd_list = g_list_append(g_cmd_list, command);
722 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
725 return VC_ERROR_NONE;
728 int vc_cmd_destroy(vc_cmd_h vc_command)
730 if (0 != __vc_cmd_get_feature_enabled()) {
731 return VC_ERROR_NOT_SUPPORTED;
733 if (0 != __vc_cmd_check_privilege()) {
734 return VC_ERROR_PERMISSION_DENIED;
739 if (NULL == vc_command) {
740 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
742 return VC_ERROR_INVALID_PARAMETER;
745 vc_cmd_s* command = NULL;
746 command = (vc_cmd_s*)vc_command;
748 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
751 iter = g_list_find(g_cmd_list, command);
753 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid");
755 return VC_ERROR_INVALID_PARAMETER;
758 g_cmd_list = g_list_delete_link(g_cmd_list, iter);
760 if (command->command)
761 free(command->command);
762 command->command = NULL;
763 if (command->parameter)
764 free(command->parameter);
765 command->parameter = NULL;
766 if (command->invocation_name)
767 free(command->invocation_name);
768 command->invocation_name = NULL;
770 free(command->appid);
771 command->appid = NULL;
773 free(command->fixed);
774 command->fixed = NULL;
775 if (command->coordinates)
776 free(command->coordinates);
777 command->coordinates = NULL;
782 return VC_ERROR_NONE;
785 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
787 if (0 != __vc_cmd_get_feature_enabled()) {
788 return VC_ERROR_NOT_SUPPORTED;
790 if (0 != __vc_cmd_check_privilege()) {
791 return VC_ERROR_PERMISSION_DENIED;
794 if (NULL == vc_command) {
795 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
796 return VC_ERROR_INVALID_PARAMETER;
799 vc_cmd_s* cmd = NULL;
800 cmd = (vc_cmd_s*)vc_command;
803 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
805 return VC_ERROR_NONE;
809 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
811 if (0 != __vc_cmd_get_feature_enabled()) {
812 return VC_ERROR_NOT_SUPPORTED;
814 if (0 != __vc_cmd_check_privilege()) {
815 return VC_ERROR_PERMISSION_DENIED;
818 if (NULL == vc_command || NULL == id) {
819 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
820 return VC_ERROR_INVALID_PARAMETER;
823 vc_cmd_s* cmd = NULL;
824 cmd = (vc_cmd_s*)vc_command;
827 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
829 return VC_ERROR_NONE;
833 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
835 if (0 != __vc_cmd_get_feature_enabled()) {
836 return VC_ERROR_NOT_SUPPORTED;
839 if (NULL == vc_command) {
840 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
841 return VC_ERROR_INVALID_PARAMETER;
845 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
846 return VC_ERROR_INVALID_PARAMETER;
849 vc_cmd_s* cmd = NULL;
850 cmd = (vc_cmd_s*)vc_command;
855 cmd->appid = strdup(appid);
857 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
858 return VC_ERROR_NONE;
861 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
863 if (0 != __vc_cmd_get_feature_enabled()) {
864 return VC_ERROR_NOT_SUPPORTED;
867 if (NULL == vc_command || NULL == appid) {
868 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
869 return VC_ERROR_INVALID_PARAMETER;
872 vc_cmd_s* cmd = NULL;
873 cmd = (vc_cmd_s*)vc_command;
876 *appid = strdup(gettext(cmd->appid));
880 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
882 return VC_ERROR_NONE;
885 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
887 if (0 != __vc_cmd_get_feature_enabled()) {
888 return VC_ERROR_NOT_SUPPORTED;
890 if (0 != __vc_cmd_check_privilege()) {
891 return VC_ERROR_PERMISSION_DENIED;
894 if (NULL == vc_command || NULL == command) {
895 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
896 return VC_ERROR_INVALID_PARAMETER;
899 vc_cmd_s* cmd = NULL;
900 cmd = (vc_cmd_s*)vc_command;
905 cmd->command = strdup(command);
907 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
909 return VC_ERROR_NONE;
912 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
914 if (0 != __vc_cmd_get_feature_enabled()) {
915 return VC_ERROR_NOT_SUPPORTED;
917 if (0 != __vc_cmd_check_privilege()) {
918 return VC_ERROR_PERMISSION_DENIED;
921 if (NULL == vc_command || NULL == command) {
922 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
923 return VC_ERROR_INVALID_PARAMETER;
926 vc_cmd_s* cmd = NULL;
927 cmd = (vc_cmd_s*)vc_command;
930 *command = strdup(gettext(cmd->command));
934 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
936 return VC_ERROR_NONE;
939 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
941 if (0 != __vc_cmd_get_feature_enabled()) {
942 return VC_ERROR_NOT_SUPPORTED;
944 if (0 != __vc_cmd_check_privilege()) {
945 return VC_ERROR_PERMISSION_DENIED;
948 if (NULL == vc_command || NULL == command) {
949 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
950 return VC_ERROR_INVALID_PARAMETER;
953 vc_cmd_s* cmd = NULL;
954 cmd = (vc_cmd_s*)vc_command;
957 free(cmd->parameter);
958 cmd->parameter = NULL;
959 cmd->parameter = strdup(command);
960 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
962 return VC_ERROR_NONE;
965 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
967 if (0 != __vc_cmd_get_feature_enabled()) {
968 return VC_ERROR_NOT_SUPPORTED;
971 if (NULL == vc_command || NULL == command) {
972 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
973 return VC_ERROR_INVALID_PARAMETER;
976 vc_cmd_s* cmd = NULL;
977 cmd = (vc_cmd_s*)vc_command;
980 *command = strdup(gettext(cmd->parameter));
984 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
986 return VC_ERROR_NONE;
990 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
992 if (0 != __vc_cmd_get_feature_enabled()) {
993 return VC_ERROR_NOT_SUPPORTED;
996 if (NULL == vc_command) {
997 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
998 return VC_ERROR_INVALID_PARAMETER;
1001 if (NULL == fixed) {
1002 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
1003 return VC_ERROR_INVALID_PARAMETER;
1006 vc_cmd_s* cmd = NULL;
1007 cmd = (vc_cmd_s*)vc_command;
1012 cmd->fixed = strdup(fixed);
1014 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1015 return VC_ERROR_NONE;
1018 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1020 if (0 != __vc_cmd_get_feature_enabled()) {
1021 return VC_ERROR_NOT_SUPPORTED;
1024 if (NULL == vc_command || NULL == fixed) {
1025 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1026 return VC_ERROR_INVALID_PARAMETER;
1029 vc_cmd_s* cmd = NULL;
1030 cmd = (vc_cmd_s*)vc_command;
1033 *fixed = strdup(gettext(cmd->fixed));
1037 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1039 return VC_ERROR_NONE;
1043 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1045 if (0 != __vc_cmd_get_feature_enabled()) {
1046 return VC_ERROR_NOT_SUPPORTED;
1049 if (NULL == vc_command) {
1050 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1051 return VC_ERROR_INVALID_PARAMETER;
1054 if (NULL == invocation_name) {
1055 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1056 return VC_ERROR_INVALID_PARAMETER;
1059 vc_cmd_s* cmd = NULL;
1060 cmd = (vc_cmd_s*)vc_command;
1062 if (cmd->invocation_name)
1063 free(cmd->invocation_name);
1064 cmd->invocation_name = NULL;
1065 cmd->invocation_name = strdup(invocation_name);
1067 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1068 return VC_ERROR_NONE;
1072 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1074 if (0 != __vc_cmd_get_feature_enabled()) {
1075 return VC_ERROR_NOT_SUPPORTED;
1078 if (NULL == vc_command || NULL == invocation_name) {
1079 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1080 return VC_ERROR_INVALID_PARAMETER;
1083 vc_cmd_s* cmd = NULL;
1084 cmd = (vc_cmd_s*)vc_command;
1086 if (cmd->invocation_name)
1087 *invocation_name = strdup(gettext(cmd->invocation_name));
1089 *invocation_name = NULL;
1091 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1092 return VC_ERROR_NONE;
1096 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1098 if (0 != __vc_cmd_get_feature_enabled()) {
1099 return VC_ERROR_NOT_SUPPORTED;
1101 if (0 != __vc_cmd_check_privilege()) {
1102 return VC_ERROR_PERMISSION_DENIED;
1105 if (NULL == vc_command) {
1106 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1107 return VC_ERROR_INVALID_PARAMETER;
1110 vc_cmd_s* cmd = NULL;
1111 cmd = (vc_cmd_s*)vc_command;
1115 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1117 return VC_ERROR_NONE;
1120 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1122 if (0 != __vc_cmd_get_feature_enabled()) {
1123 return VC_ERROR_NOT_SUPPORTED;
1125 if (0 != __vc_cmd_check_privilege()) {
1126 return VC_ERROR_PERMISSION_DENIED;
1129 if (NULL == vc_command || NULL == type) {
1130 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1131 return VC_ERROR_INVALID_PARAMETER;
1134 vc_cmd_s* cmd = NULL;
1135 cmd = (vc_cmd_s*)vc_command;
1139 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1141 return VC_ERROR_NONE;
1144 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1146 if (0 != __vc_cmd_get_feature_enabled()) {
1147 return VC_ERROR_NOT_SUPPORTED;
1150 if (NULL == vc_command) {
1151 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1152 return VC_ERROR_INVALID_PARAMETER;
1155 vc_cmd_s* cmd = NULL;
1156 cmd = (vc_cmd_s*)vc_command;
1158 cmd->format = format;
1160 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1162 return VC_ERROR_NONE;
1165 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1167 if (0 != __vc_cmd_get_feature_enabled()) {
1168 return VC_ERROR_NOT_SUPPORTED;
1171 if (NULL == vc_command || NULL == format) {
1172 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1173 return VC_ERROR_INVALID_PARAMETER;
1176 vc_cmd_s* cmd = NULL;
1177 cmd = (vc_cmd_s*)vc_command;
1179 *format = cmd->format;
1181 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1183 return VC_ERROR_NONE;
1186 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1188 if (0 != __vc_cmd_get_feature_enabled()) {
1189 return VC_ERROR_NOT_SUPPORTED;
1191 if (0 != __vc_cmd_check_privilege()) {
1192 return VC_ERROR_PERMISSION_DENIED;
1195 if (NULL == vc_command) {
1196 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1197 return VC_ERROR_INVALID_PARAMETER;
1200 vc_cmd_s* cmd = NULL;
1201 cmd = (vc_cmd_s*)vc_command;
1205 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1207 return VC_ERROR_NONE;
1210 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1212 if (0 != __vc_cmd_get_feature_enabled()) {
1213 return VC_ERROR_NOT_SUPPORTED;
1215 if (0 != __vc_cmd_check_privilege()) {
1216 return VC_ERROR_PERMISSION_DENIED;
1219 if (NULL == vc_command || NULL == pid) {
1220 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1221 return VC_ERROR_INVALID_PARAMETER;
1224 vc_cmd_s* cmd = NULL;
1225 cmd = (vc_cmd_s*)vc_command;
1229 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1231 return VC_ERROR_NONE;
1234 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1236 if (0 != __vc_cmd_get_feature_enabled()) {
1237 return VC_ERROR_NOT_SUPPORTED;
1239 if (0 != __vc_cmd_check_privilege()) {
1240 return VC_ERROR_PERMISSION_DENIED;
1243 if (NULL == vc_command) {
1244 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1245 return VC_ERROR_INVALID_PARAMETER;
1248 vc_cmd_s* cmd = NULL;
1249 cmd = (vc_cmd_s*)vc_command;
1251 cmd->domain = domain;
1253 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1255 return VC_ERROR_NONE;
1258 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1260 if (0 != __vc_cmd_get_feature_enabled()) {
1261 return VC_ERROR_NOT_SUPPORTED;
1263 if (0 != __vc_cmd_check_privilege()) {
1264 return VC_ERROR_PERMISSION_DENIED;
1267 if (NULL == vc_command || NULL == domain) {
1268 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1269 return VC_ERROR_INVALID_PARAMETER;
1272 vc_cmd_s* cmd = NULL;
1273 cmd = (vc_cmd_s*)vc_command;
1275 *domain = cmd->domain;
1277 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1279 return VC_ERROR_NONE;
1284 * @brief Sets key value of command.
1286 * @param[in] vc_command Command handle
1287 * @param[in] key key value
1288 * @param[in] modifier modifier value
1290 * @return 0 on success, otherwise a negative error value
1291 * @retval #VC_ERROR_NONE Successful
1292 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1294 * @see vc_cmd_get_result_key()
1296 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1298 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1300 if (NULL == vc_command) {
1301 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1302 return VC_ERROR_INVALID_PARAMETER;
1305 vc_cmd_s* cmd = NULL;
1306 cmd = (vc_cmd_s*)vc_command;
1308 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1311 cmd->modifier = modifier;
1313 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1315 return VC_ERROR_NONE;
1319 * @brief Gets key value of command.
1321 * @param[in] vc_command Command handle
1322 * @param[out] key key value
1323 * @param[out] modifier modifier value
1325 * @return 0 on success, otherwise a negative error value
1326 * @retval #VC_ERROR_NONE Successful
1327 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1329 * @see vc_cmd_add_result_key()
1331 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1333 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1335 if (NULL == vc_command || NULL == key || NULL == modifier) {
1336 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1337 return VC_ERROR_INVALID_PARAMETER;
1340 vc_cmd_s* cmd = NULL;
1341 cmd = (vc_cmd_s*)vc_command;
1344 *modifier = cmd->modifier;
1346 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1348 return VC_ERROR_NONE;
1351 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1353 if (NULL == vc_cmd_list) {
1357 vc_cmd_list_s* list = NULL;
1358 list = (vc_cmd_list_s*)vc_cmd_list;
1360 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1361 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1364 GSList *iter = NULL;
1365 iter = g_slist_nth(list->list, 0);
1366 while (NULL != iter) {
1367 vc_cmd_s *cmd = NULL;
1370 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
1371 return VC_ERROR_OPERATION_FAILED;
1373 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)",
1374 i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1376 iter = g_slist_next(iter);
1379 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1381 return VC_ERROR_NONE;
1384 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1386 if (0 != __vc_cmd_get_feature_enabled()) {
1387 return VC_ERROR_NOT_SUPPORTED;
1390 if (NULL == vc_cmd || NULL == json) {
1391 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1392 return VC_ERROR_INVALID_PARAMETER;
1395 vc_cmd_s* cmd = NULL;
1396 cmd = (vc_cmd_s*)vc_cmd;
1398 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1399 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1400 return VC_ERROR_INVALID_PARAMETER;
1403 if (0 != vc_info_parser_get_nlu_result(json)) {
1404 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1405 return VC_ERROR_OPERATION_FAILED;
1408 return VC_ERROR_NONE;
1411 static void __vc_cmd_regex_deinit(int num_regex)
1413 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1416 for (i = 0; num_regex > i; i++) {
1420 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1423 static int __vc_cmd_regex_init()
1425 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1427 int cflags = REG_EXTENDED | REG_ICASE;
1433 vc_config_mgr_get_default_language(&lang);
1435 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1436 return VC_ERROR_OPERATION_FAILED;
1439 if (!strcmp("en_US", lang)) {
1441 } else if (!strcmp("ko_KR", lang)) {
1447 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1448 return VC_ERROR_INVALID_LANGUAGE;
1454 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1456 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1458 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1459 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1461 regerror(ret, ®[0], errStr, sizeof(errStr));
1463 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1464 return VC_ERROR_OPERATION_FAILED;
1467 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1468 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1470 regerror(ret, ®[1], errStr, sizeof(errStr));
1471 __vc_cmd_regex_deinit(1);
1473 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1474 return VC_ERROR_OPERATION_FAILED;
1477 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1478 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1480 regerror(ret, ®[2], errStr, sizeof(errStr));
1481 __vc_cmd_regex_deinit(2);
1483 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1484 return VC_ERROR_OPERATION_FAILED;
1487 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1488 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1490 regerror(ret, ®[3], errStr, sizeof(errStr));
1491 __vc_cmd_regex_deinit(3);
1493 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1494 return VC_ERROR_OPERATION_FAILED;
1497 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1498 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1500 regerror(ret, ®[4], errStr, sizeof(errStr));
1501 __vc_cmd_regex_deinit(4);
1503 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1504 return VC_ERROR_OPERATION_FAILED;
1507 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1508 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1510 regerror(ret, ®[5], errStr, sizeof(errStr));
1511 __vc_cmd_regex_deinit(5);
1513 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1514 return VC_ERROR_OPERATION_FAILED;
1517 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1518 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1520 regerror(ret, ®[6], errStr, sizeof(errStr));
1521 __vc_cmd_regex_deinit(6);
1523 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1524 return VC_ERROR_OPERATION_FAILED;
1527 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1528 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1530 regerror(ret, ®[7], errStr, sizeof(errStr));
1531 __vc_cmd_regex_deinit(7);
1533 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1534 return VC_ERROR_OPERATION_FAILED;
1537 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1538 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1540 regerror(ret, ®[8], errStr, sizeof(errStr));
1541 __vc_cmd_regex_deinit(8);
1543 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1544 return VC_ERROR_OPERATION_FAILED;
1547 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1548 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1550 regerror(ret, ®[9], errStr, sizeof(errStr));
1551 __vc_cmd_regex_deinit(9);
1553 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1554 return VC_ERROR_OPERATION_FAILED;
1557 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1558 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1560 regerror(ret, ®[10], errStr, sizeof(errStr));
1561 __vc_cmd_regex_deinit(10);
1563 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1564 return VC_ERROR_OPERATION_FAILED;
1567 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1568 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1570 regerror(ret, ®[11], errStr, sizeof(errStr));
1571 __vc_cmd_regex_deinit(11);
1573 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1574 return VC_ERROR_OPERATION_FAILED;
1577 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1579 return VC_ERROR_NONE;
1582 static void __vc_cmd_add_year(struct tm *td, int year)
1584 td->tm_year += year;
1587 static void __vc_cmd_add_mon(struct tm *td, int mon)
1591 mon = td->tm_mon + mon;
1595 __vc_cmd_add_year(td, year);
1598 td->tm_mon = mon % 12;
1601 static void __vc_cmd_add_mday(struct tm *td, int mday)
1603 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1604 int year = td->tm_year + 1900;
1608 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1610 mday = td->tm_mday + mday;
1612 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1613 mday -= max_day[mon % 12];
1615 if (11 == mon % 12) {
1618 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1626 mon = mon - td->tm_mon;
1629 __vc_cmd_add_mon(td, mon);
1635 static void __vc_cmd_add_hour(struct tm *td, int hour)
1639 hour = td->tm_hour + hour;
1643 __vc_cmd_add_mday(td, day);
1646 td->tm_hour = hour % 24;
1649 static void __vc_cmd_add_min(struct tm *td, int min)
1653 min = td->tm_min + min;
1657 __vc_cmd_add_hour(td, hour);
1660 td->tm_min = min % 60;
1663 static void __copy_struct_tm(struct tm *des, struct tm *src)
1665 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1667 des->tm_sec = src->tm_sec;
1668 des->tm_min = src->tm_min;
1669 des->tm_hour = src->tm_hour;
1670 des->tm_mday = src->tm_mday;
1671 des->tm_mon = src->tm_mon;
1672 des->tm_year = src->tm_year;
1673 des->tm_wday = src->tm_wday;
1674 des->tm_yday = src->tm_yday;
1675 des->tm_isdst = src->tm_isdst;
1677 des->tm_gmtoff = src->tm_gmtoff;
1678 des->tm_zone = src->tm_zone;
1681 static void __update_data_sidx(int idx)
1683 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1686 static void __update_data_eidx(int idx)
1688 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1691 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1693 regmatch_t pmatch[3];
1699 ret = regexec(®[6], str, 3, pmatch, 0);
1702 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1704 if (12 < td->tm_hour) {
1705 __vc_cmd_add_mday(td, 1);
1711 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1713 __vc_cmd_add_mday(td, 1);
1718 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1720 __update_data_sidx(pmatch[0].rm_so);
1721 __update_data_eidx(pmatch[0].rm_eo);
1724 return VC_ERROR_NONE;
1727 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1728 return VC_ERROR_NONE;
1731 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1733 regmatch_t pmatch[2];
1741 char *tempstr = NULL;
1744 ret = regexec(®[3], str, 1, pmatch, 0);
1746 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1749 sidx = pmatch[0].rm_so;
1750 eidx = pmatch[0].rm_eo;
1752 ret = regexec(®[4], str, 2, pmatch, 0);
1754 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1757 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1758 return VC_ERROR_OPERATION_FAILED;
1760 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1762 if (NULL == tempstr) {
1763 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1764 return VC_ERROR_OUT_OF_MEMORY;
1767 hour = atoi(tempstr);
1772 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1774 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1775 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1778 ret = regexec(®[5], str, 2, pmatch, 0);
1780 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1783 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1784 return VC_ERROR_OPERATION_FAILED;
1786 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1788 if (NULL == tempstr) {
1789 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1790 return VC_ERROR_OUT_OF_MEMORY;
1793 min = atoi(tempstr);
1798 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1800 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1801 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1804 if (hour < 0 && min < 0) {
1805 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1806 return VC_ERROR_NONE;
1809 hour = 0 > hour ? 0 : hour;
1810 min = 0 > min ? 0 : min;
1812 min = min + (hour * 60);
1814 __vc_cmd_add_min(td, min);
1817 __update_data_sidx(sidx);
1818 __update_data_eidx(eidx);
1821 return VC_ERROR_NONE;
1824 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1825 return VC_ERROR_NONE;
1828 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1830 regmatch_t pmatch[5];
1839 char *tempstr = NULL;
1842 ret = regexec(®[0], str, 5, pmatch, 0);
1844 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1848 sidx = pmatch[0].rm_so;
1849 eidx = pmatch[0].rm_eo;
1852 ret = regexec(®[1], str, 2, pmatch, 0);
1854 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1857 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1858 return VC_ERROR_OPERATION_FAILED;
1860 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1862 if (NULL == tempstr) {
1863 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1864 return VC_ERROR_OUT_OF_MEMORY;
1867 hour = atoi(tempstr);
1870 hour = hour + 12 * flag;
1872 if (12 == hour) hour = 0;
1873 else if (24 == hour) hour = 12;
1876 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1877 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1880 return VC_ERROR_NONE;
1886 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1888 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1889 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1890 } else if (0 < flag) {
1891 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1892 return VC_ERROR_NONE;
1895 ret = regexec(®[2], str, 2, pmatch, 0);
1898 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1900 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1902 if (NULL == tempstr) {
1903 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1904 return VC_ERROR_OUT_OF_MEMORY;
1907 min = atoi(tempstr);
1909 if (0 > min || 60 <= min) {
1910 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1913 return VC_ERROR_NONE;
1925 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1926 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1927 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1930 if (0 > hour && 0 > min) {
1931 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1932 return VC_ERROR_NONE;
1935 if (0 <= min && 0 <= hour) {
1936 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1940 } else if (0 <= min) {
1942 vc_config_mgr_get_default_language(&lang);
1944 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1945 return VC_ERROR_OPERATION_FAILED;
1948 if (!strcmp("en_US", lang)) {
1949 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1952 return VC_ERROR_NONE;
1954 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1961 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1969 __update_data_sidx(sidx);
1970 __update_data_eidx(eidx);
1973 return VC_ERROR_NONE;
1976 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1978 regmatch_t pmatch[10];
1984 ret = regexec(®[10], str, 5, pmatch, 0);
1986 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1988 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1990 td->tm_year = td_now.tm_year;
1991 td->tm_mon = td_now.tm_mon;
1992 td->tm_mday = td_now.tm_mday;
1994 __vc_cmd_add_mday(td, idx - 1);
1996 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1998 __update_data_sidx(pmatch[0].rm_so);
1999 __update_data_eidx(pmatch[0].rm_eo);
2002 return VC_ERROR_NONE;
2005 ret = regexec(®[11], str, 10, pmatch, 0);
2007 for (idx = 1; 10 > idx; idx++) {
2008 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2013 td->tm_year = td_now.tm_year;
2014 td->tm_mon = td_now.tm_mon;
2015 td->tm_mday = td_now.tm_mday;
2017 __vc_cmd_add_mday(td, idx + 1);
2019 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2021 __update_data_sidx(pmatch[0].rm_so);
2022 __update_data_eidx(pmatch[0].rm_eo);
2025 return VC_ERROR_NONE;
2028 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2029 return VC_ERROR_NONE;
2032 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2034 regmatch_t pmatch[13];
2045 char *tempstr = NULL;
2048 ret = regexec(®[9], str, 2, pmatch, 0);
2050 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2053 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2054 return VC_ERROR_OPERATION_FAILED;
2056 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2058 if (NULL == tempstr) {
2059 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2060 return VC_ERROR_OUT_OF_MEMORY;
2063 day = atoi(tempstr);
2068 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2070 sidx = pmatch[0].rm_so;
2071 eidx = pmatch[0].rm_eo;
2073 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2074 return VC_ERROR_NONE;
2077 ret = regexec(®[8], str, 13, pmatch, 0);
2079 for (idx = 1; 13 > idx; idx++) {
2080 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2090 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2092 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2093 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2096 vc_config_mgr_get_default_language(&lang);
2098 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2099 return VC_ERROR_OPERATION_FAILED;
2102 if (!strcmp("en_US", lang)) {
2103 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2106 return VC_ERROR_NONE;
2115 ret = regexec(®[7], str, 3, pmatch, 0);
2117 if (!m_flag) return -1;
2119 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2122 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2123 return VC_ERROR_OPERATION_FAILED;
2125 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2127 if (NULL == tempstr) {
2128 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2129 return VC_ERROR_OUT_OF_MEMORY;
2132 year = atoi(tempstr);
2133 year = 1900 < year ? year - 1900 : year + 100;
2139 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2141 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2142 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2147 if (0 > g_time_flag) {
2151 } else if (2 == g_time_flag) {
2152 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2153 return VC_ERROR_NONE;
2156 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2157 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2159 if (max_day[mon] < day || 1 > day) {
2160 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2161 return VC_ERROR_NONE;
2170 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2172 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2173 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2177 __update_data_sidx(sidx);
2178 __update_data_eidx(eidx);
2181 return VC_ERROR_NONE;
2184 static int __vc_cmd_time_check(const char *str, struct tm *td)
2186 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2191 ret = __vc_cmd_tphrase_check(str, td, &exist);
2195 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2197 } else if (VC_ERROR_NONE != ret) {
2198 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2202 ret = __vc_cmd_trelative_check(str, td, &exist);
2206 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2208 } else if (VC_ERROR_NONE != ret) {
2209 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2213 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2217 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2219 } else if (VC_ERROR_NONE != ret) {
2220 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2224 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2225 return VC_ERROR_NONE;
2228 static int __vc_cmd_date_check(const char *str, struct tm *td)
2230 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2235 ret = __vc_cmd_dphrase_check(str, td, &exist);
2239 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2241 } else if (VC_ERROR_NONE != ret) {
2242 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2246 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2250 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2252 } else if (VC_ERROR_NONE != ret) {
2253 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2257 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2258 return VC_ERROR_NONE;
2261 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2263 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2266 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2269 if (NULL == text || NULL == result || NULL == remain) {
2270 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2271 return VC_ERROR_INVALID_PARAMETER;
2275 ret = __vc_cmd_regex_init();
2276 if (VC_ERROR_NONE != ret) {
2277 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2281 g_data_sidx = g_data_eidx = -1;
2284 localtime_r(&t_now, &td_now);
2285 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2287 __copy_struct_tm(&td, &td_now);
2288 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2289 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);
2291 g_time_flag = g_date_flag = -1;
2293 ret = __vc_cmd_time_check(text, &td);
2294 if (VC_ERROR_NONE != ret) {
2295 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2299 ret = __vc_cmd_date_check(text, &td);
2300 if (VC_ERROR_NONE != ret) {
2301 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2305 __vc_cmd_regex_deinit(12);
2307 if (g_time_flag > 0 || g_date_flag > 0) {
2308 *result = mktime(&td);
2310 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2311 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2312 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);
2314 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2316 if (NULL == *remain) {
2317 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2318 return VC_ERROR_OUT_OF_MEMORY;
2321 strncpy(*remain, text, g_data_sidx);
2322 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2324 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2327 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2329 return VC_ERROR_NONE;