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 ret = __check_privilege(uid, VC_PRIVILEGE_DATASHARING);
177 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_DATASHARING, uid);
178 __check_privilege_deinitialize();
179 g_privilege_allowed = false;
180 pthread_mutex_unlock(&g_cynara_mutex);
181 return VC_ERROR_PERMISSION_DENIED;
185 ret = __check_privilege(uid, VC_PRIVILEGE_APPMGR);
188 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_APPMGR, uid);
189 __check_privilege_deinitialize();
190 g_privilege_allowed = false;
191 pthread_mutex_unlock(&g_cynara_mutex);
192 return VC_ERROR_PERMISSION_DENIED;
196 __check_privilege_deinitialize();
199 g_privilege_allowed = true;
200 pthread_mutex_unlock(&g_cynara_mutex);
201 return VC_ERROR_NONE;
204 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
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 CMD_LIST_MUTEX_LOCK();
215 if (NULL == vc_cmd_list) {
216 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
217 CMD_LIST_MUTEX_UNLOCK();
218 return VC_ERROR_INVALID_PARAMETER;
221 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
224 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
225 CMD_LIST_MUTEX_UNLOCK();
226 return VC_ERROR_OUT_OF_MEMORY;
232 *vc_cmd_list = (vc_cmd_list_h)list;
234 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
236 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
238 CMD_LIST_MUTEX_UNLOCK();
239 return VC_ERROR_NONE;
242 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
244 if (0 != __vc_cmd_get_feature_enabled()) {
245 return VC_ERROR_NOT_SUPPORTED;
247 if (0 != __vc_cmd_check_privilege()) {
248 return VC_ERROR_PERMISSION_DENIED;
251 CMD_LIST_MUTEX_LOCK();
253 if (NULL == vc_cmd_list) {
254 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
255 CMD_LIST_MUTEX_UNLOCK();
256 return VC_ERROR_INVALID_PARAMETER;
260 vc_cmd_list_s* list = NULL;
261 list = (vc_cmd_list_s*)vc_cmd_list;
263 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
266 iter = g_list_find(g_cmdlist_list, list);
268 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
269 CMD_LIST_MUTEX_UNLOCK();
270 return VC_ERROR_INVALID_PARAMETER;
273 g_cmdlist_list = g_list_delete_link(g_cmdlist_list, iter);
275 vc_cmd_list_remove_all((vc_cmd_list_h)list, release_command);
279 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
281 CMD_LIST_MUTEX_UNLOCK();
282 return VC_ERROR_NONE;
285 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
287 if (0 != __vc_cmd_get_feature_enabled()) {
288 return VC_ERROR_NOT_SUPPORTED;
290 if (0 != __vc_cmd_check_privilege()) {
291 return VC_ERROR_PERMISSION_DENIED;
294 if (NULL == vc_cmd_list || NULL == count) {
295 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
296 return VC_ERROR_INVALID_PARAMETER;
299 vc_cmd_list_s* list = NULL;
300 list = (vc_cmd_list_s*)vc_cmd_list;
302 *count = g_slist_length(list->list);
304 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
306 return VC_ERROR_NONE;
309 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
311 if (0 != __vc_cmd_get_feature_enabled()) {
312 return VC_ERROR_NOT_SUPPORTED;
314 if (0 != __vc_cmd_check_privilege()) {
315 return VC_ERROR_PERMISSION_DENIED;
318 if (NULL == vc_cmd_list || NULL == vc_command) {
319 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
320 return VC_ERROR_INVALID_PARAMETER;
323 vc_cmd_list_s* list = NULL;
324 list = (vc_cmd_list_s*)vc_cmd_list;
326 vc_cmd_s* cmd = NULL;
327 cmd = (vc_cmd_s*)vc_command;
329 list->list = g_slist_append(list->list, cmd);
331 if (1 == g_slist_length(list->list)) {
335 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
337 return VC_ERROR_NONE;
340 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
342 if (0 != __vc_cmd_get_feature_enabled()) {
343 return VC_ERROR_NOT_SUPPORTED;
345 if (0 != __vc_cmd_check_privilege()) {
346 return VC_ERROR_PERMISSION_DENIED;
349 if (NULL == vc_cmd_list || NULL == vc_command) {
350 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
351 return VC_ERROR_INVALID_PARAMETER;
354 vc_cmd_list_s* list = NULL;
355 list = (vc_cmd_list_s*)vc_cmd_list;
357 vc_cmd_s* cmd = NULL;
358 cmd = (vc_cmd_s*)vc_command;
360 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
363 iter = g_slist_find(list->list, cmd);
365 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid");
366 return VC_ERROR_INVALID_PARAMETER;
369 list->list = g_slist_remove_link(list->list, iter);
370 SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command");
372 int len = g_slist_length(list->list);
375 else if (list->index == len)
376 list->index = len - 1;
378 return VC_ERROR_NONE;
381 static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data)
383 vc_cmd_s *temp = NULL;
386 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp);
387 vc_cmd_destroy((vc_cmd_h)temp);
393 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
395 if (0 != __vc_cmd_get_feature_enabled()) {
396 return VC_ERROR_NOT_SUPPORTED;
398 if (0 != __vc_cmd_check_privilege()) {
399 return VC_ERROR_PERMISSION_DENIED;
402 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
404 if (NULL == vc_cmd_list) {
405 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
406 return VC_ERROR_INVALID_PARAMETER;
409 vc_cmd_list_s* list = NULL;
410 list = (vc_cmd_list_s*)vc_cmd_list;
412 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
413 , list, release_command ? "true" : "false");
415 if (true == release_command) {
417 g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL);
418 g_slist_free(list->list);
424 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
426 return VC_ERROR_NONE;
429 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
431 if (0 != __vc_cmd_get_feature_enabled()) {
432 return VC_ERROR_NOT_SUPPORTED;
434 if (0 != __vc_cmd_check_privilege()) {
435 return VC_ERROR_PERMISSION_DENIED;
438 if (NULL == vc_cmd_list) {
439 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
440 return VC_ERROR_INVALID_PARAMETER;
443 vc_cmd_list_s* list = NULL;
444 list = (vc_cmd_list_s*)vc_cmd_list;
447 iter = g_slist_nth(list->list, 0);
448 while (NULL != iter) {
449 vc_cmd_s *temp_cmd = NULL;
450 temp_cmd = iter->data;
451 if (NULL == temp_cmd) {
452 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
453 return VC_ERROR_OPERATION_FAILED;
455 if (false == callback((vc_cmd_h)temp_cmd, user_data))
458 iter = g_slist_next(iter);
461 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
463 return VC_ERROR_NONE;
466 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
468 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
470 if (0 != __vc_cmd_get_feature_enabled()) {
471 return VC_ERROR_NOT_SUPPORTED;
473 if (0 != __vc_cmd_check_privilege()) {
474 return VC_ERROR_PERMISSION_DENIED;
477 if (NULL == original) {
478 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
479 return VC_ERROR_INVALID_PARAMETER;
482 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
483 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
484 return VC_ERROR_INVALID_PARAMETER;
487 vc_cmd_list_s* list = NULL;
488 list = (vc_cmd_list_s*)original;
490 vc_cmd_list_h temp_list;
491 if (0 != vc_cmd_list_create(&temp_list)) {
492 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
493 return VC_ERROR_OPERATION_FAILED;
497 iter = g_slist_nth(list->list, 0);
498 while (NULL != iter) {
499 vc_cmd_s *iter_cmd = NULL;
500 iter_cmd = iter->data;
501 if (NULL == iter_cmd) {
502 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
503 return VC_ERROR_OPERATION_FAILED;
507 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
508 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
512 if (iter_type == type) {
514 if (0 != vc_cmd_create(&temp_cmd)) {
515 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
519 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
520 if (NULL != iter_cmd->command)
521 ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command);
522 if (NULL != iter_cmd->parameter)
523 ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter);
525 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
526 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
527 vc_cmd_destroy(temp_cmd);
531 iter = g_slist_next(iter);
535 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
536 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
538 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
541 *filtered = temp_list;
543 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
545 return VC_ERROR_NONE;
548 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
550 if (0 != __vc_cmd_get_feature_enabled()) {
551 return VC_ERROR_NOT_SUPPORTED;
553 if (0 != __vc_cmd_check_privilege()) {
554 return VC_ERROR_PERMISSION_DENIED;
557 if (NULL == vc_cmd_list) {
558 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
559 return VC_ERROR_INVALID_PARAMETER;
562 vc_cmd_list_s* list = NULL;
563 list = (vc_cmd_list_s*)vc_cmd_list;
565 if (0 == g_slist_length(list->list)) {
566 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
567 return VC_ERROR_EMPTY;
572 return VC_ERROR_NONE;
575 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
577 if (0 != __vc_cmd_get_feature_enabled()) {
578 return VC_ERROR_NOT_SUPPORTED;
580 if (0 != __vc_cmd_check_privilege()) {
581 return VC_ERROR_PERMISSION_DENIED;
584 if (NULL == vc_cmd_list) {
585 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
586 return VC_ERROR_INVALID_PARAMETER;
589 vc_cmd_list_s* list = NULL;
590 list = (vc_cmd_list_s*)vc_cmd_list;
592 int count = g_slist_length(list->list);
595 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
596 return VC_ERROR_EMPTY;
598 list->index = count - 1;
599 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
602 return VC_ERROR_NONE;
605 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
607 if (0 != __vc_cmd_get_feature_enabled()) {
608 return VC_ERROR_NOT_SUPPORTED;
610 if (0 != __vc_cmd_check_privilege()) {
611 return VC_ERROR_PERMISSION_DENIED;
614 if (NULL == vc_cmd_list) {
615 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
616 return VC_ERROR_INVALID_PARAMETER;
619 vc_cmd_list_s* list = NULL;
620 list = (vc_cmd_list_s*)vc_cmd_list;
622 int count = g_slist_length(list->list);
624 if (list->index < count - 1) {
625 list->index = list->index + 1;
626 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
628 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
629 return VC_ERROR_ITERATION_END;
632 return VC_ERROR_NONE;
635 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
637 if (0 != __vc_cmd_get_feature_enabled()) {
638 return VC_ERROR_NOT_SUPPORTED;
640 if (0 != __vc_cmd_check_privilege()) {
641 return VC_ERROR_PERMISSION_DENIED;
644 if (NULL == vc_cmd_list) {
645 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
646 return VC_ERROR_INVALID_PARAMETER;
649 vc_cmd_list_s* list = NULL;
650 list = (vc_cmd_list_s*)vc_cmd_list;
652 if (list->index > 0) {
653 list->index = list->index - 1;
654 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
656 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
657 return VC_ERROR_ITERATION_END;
660 return VC_ERROR_NONE;
663 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
665 if (0 != __vc_cmd_get_feature_enabled()) {
666 return VC_ERROR_NOT_SUPPORTED;
668 if (0 != __vc_cmd_check_privilege()) {
669 return VC_ERROR_PERMISSION_DENIED;
672 if (NULL == vc_cmd_list || NULL == vc_command) {
673 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
674 return VC_ERROR_INVALID_PARAMETER;
677 vc_cmd_list_s* list = NULL;
678 list = (vc_cmd_list_s*)vc_cmd_list;
680 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
682 if (0 == g_slist_length(list->list)) {
683 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
685 return VC_ERROR_EMPTY;
688 vc_cmd_s *temp_cmd = NULL;
689 temp_cmd = g_slist_nth_data(list->list, list->index);
691 *vc_command = (vc_cmd_h)temp_cmd;
693 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
695 return VC_ERROR_NONE;
699 int vc_cmd_create(vc_cmd_h* vc_command)
701 if (0 != __vc_cmd_get_feature_enabled()) {
702 return VC_ERROR_NOT_SUPPORTED;
704 if (0 != __vc_cmd_check_privilege()) {
705 return VC_ERROR_PERMISSION_DENIED;
710 if (NULL == vc_command) {
711 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
713 return VC_ERROR_INVALID_PARAMETER;
716 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
718 if (NULL == command) {
719 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
721 return VC_ERROR_OUT_OF_MEMORY;
727 command->type = VC_COMMAND_TYPE_NONE;
728 command->format = VC_CMD_FORMAT_FIXED;
729 command->command = NULL;
730 command->parameter = NULL;
732 command->priority = 0;
733 command->key = VC_KEY_NONE;
734 command->modifier = VC_MODIFIER_NONE;
735 command->invocation_name = NULL;
736 command->appid = NULL;
737 command->fixed = NULL;
738 command->coordinates = NULL;
740 *vc_command = (vc_cmd_h)command;
742 g_cmd_list = g_list_append(g_cmd_list, command);
744 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
747 return VC_ERROR_NONE;
750 int vc_cmd_destroy(vc_cmd_h vc_command)
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;
761 if (NULL == vc_command) {
762 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
764 return VC_ERROR_INVALID_PARAMETER;
767 vc_cmd_s* command = NULL;
768 command = (vc_cmd_s*)vc_command;
770 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
773 iter = g_list_find(g_cmd_list, command);
775 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid");
777 return VC_ERROR_INVALID_PARAMETER;
780 g_cmd_list = g_list_delete_link(g_cmd_list, iter);
782 if (command->command)
783 free(command->command);
784 command->command = NULL;
785 if (command->parameter)
786 free(command->parameter);
787 command->parameter = NULL;
788 if (command->invocation_name)
789 free(command->invocation_name);
790 command->invocation_name = NULL;
792 free(command->appid);
793 command->appid = NULL;
795 free(command->fixed);
796 command->fixed = NULL;
797 if (command->coordinates)
798 free(command->coordinates);
799 command->coordinates = NULL;
804 return VC_ERROR_NONE;
807 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
809 if (0 != __vc_cmd_get_feature_enabled()) {
810 return VC_ERROR_NOT_SUPPORTED;
812 if (0 != __vc_cmd_check_privilege()) {
813 return VC_ERROR_PERMISSION_DENIED;
816 if (NULL == vc_command) {
817 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
818 return VC_ERROR_INVALID_PARAMETER;
821 vc_cmd_s* cmd = NULL;
822 cmd = (vc_cmd_s*)vc_command;
825 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
827 return VC_ERROR_NONE;
830 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
832 if (0 != __vc_cmd_get_feature_enabled()) {
833 return VC_ERROR_NOT_SUPPORTED;
835 if (0 != __vc_cmd_check_privilege()) {
836 return VC_ERROR_PERMISSION_DENIED;
839 if (NULL == vc_command || NULL == id) {
840 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
841 return VC_ERROR_INVALID_PARAMETER;
844 vc_cmd_s* cmd = NULL;
845 cmd = (vc_cmd_s*)vc_command;
848 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
850 return VC_ERROR_NONE;
853 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
855 if (0 != __vc_cmd_get_feature_enabled()) {
856 return VC_ERROR_NOT_SUPPORTED;
859 if (NULL == vc_command) {
860 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
861 return VC_ERROR_INVALID_PARAMETER;
865 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
866 return VC_ERROR_INVALID_PARAMETER;
869 vc_cmd_s* cmd = NULL;
870 cmd = (vc_cmd_s*)vc_command;
875 cmd->appid = strdup(appid);
877 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
878 return VC_ERROR_NONE;
881 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
883 if (0 != __vc_cmd_get_feature_enabled()) {
884 return VC_ERROR_NOT_SUPPORTED;
887 if (NULL == vc_command || NULL == appid) {
888 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
889 return VC_ERROR_INVALID_PARAMETER;
892 vc_cmd_s* cmd = NULL;
893 cmd = (vc_cmd_s*)vc_command;
896 *appid = strdup(gettext(cmd->appid));
900 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
902 return VC_ERROR_NONE;
905 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
907 if (0 != __vc_cmd_get_feature_enabled()) {
908 return VC_ERROR_NOT_SUPPORTED;
910 if (0 != __vc_cmd_check_privilege()) {
911 return VC_ERROR_PERMISSION_DENIED;
914 if (NULL == vc_command || NULL == command) {
915 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
916 return VC_ERROR_INVALID_PARAMETER;
919 vc_cmd_s* cmd = NULL;
920 cmd = (vc_cmd_s*)vc_command;
925 cmd->command = strdup(command);
927 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
929 return VC_ERROR_NONE;
932 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
934 if (0 != __vc_cmd_get_feature_enabled()) {
935 return VC_ERROR_NOT_SUPPORTED;
937 if (0 != __vc_cmd_check_privilege()) {
938 return VC_ERROR_PERMISSION_DENIED;
941 if (NULL == vc_command || NULL == command) {
942 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
943 return VC_ERROR_INVALID_PARAMETER;
946 vc_cmd_s* cmd = NULL;
947 cmd = (vc_cmd_s*)vc_command;
950 *command = strdup(gettext(cmd->command));
954 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
956 return VC_ERROR_NONE;
959 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
961 if (0 != __vc_cmd_get_feature_enabled()) {
962 return VC_ERROR_NOT_SUPPORTED;
964 if (0 != __vc_cmd_check_privilege()) {
965 return VC_ERROR_PERMISSION_DENIED;
968 if (NULL == vc_command || NULL == command) {
969 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
970 return VC_ERROR_INVALID_PARAMETER;
973 vc_cmd_s* cmd = NULL;
974 cmd = (vc_cmd_s*)vc_command;
977 free(cmd->parameter);
978 cmd->parameter = NULL;
979 cmd->parameter = strdup(command);
980 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
982 return VC_ERROR_NONE;
985 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
987 if (0 != __vc_cmd_get_feature_enabled()) {
988 return VC_ERROR_NOT_SUPPORTED;
991 if (NULL == vc_command || NULL == command) {
992 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
993 return VC_ERROR_INVALID_PARAMETER;
996 vc_cmd_s* cmd = NULL;
997 cmd = (vc_cmd_s*)vc_command;
1000 *command = strdup(gettext(cmd->parameter));
1004 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
1006 return VC_ERROR_NONE;
1009 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
1011 if (0 != __vc_cmd_get_feature_enabled()) {
1012 return VC_ERROR_NOT_SUPPORTED;
1015 if (NULL == vc_command) {
1016 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1017 return VC_ERROR_INVALID_PARAMETER;
1020 if (NULL == fixed) {
1021 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
1022 return VC_ERROR_INVALID_PARAMETER;
1025 vc_cmd_s* cmd = NULL;
1026 cmd = (vc_cmd_s*)vc_command;
1031 cmd->fixed = strdup(fixed);
1033 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1034 return VC_ERROR_NONE;
1037 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1039 if (0 != __vc_cmd_get_feature_enabled()) {
1040 return VC_ERROR_NOT_SUPPORTED;
1043 if (NULL == vc_command || NULL == fixed) {
1044 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1045 return VC_ERROR_INVALID_PARAMETER;
1048 vc_cmd_s* cmd = NULL;
1049 cmd = (vc_cmd_s*)vc_command;
1052 *fixed = strdup(gettext(cmd->fixed));
1056 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1058 return VC_ERROR_NONE;
1061 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1063 if (0 != __vc_cmd_get_feature_enabled()) {
1064 return VC_ERROR_NOT_SUPPORTED;
1067 if (NULL == vc_command) {
1068 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1069 return VC_ERROR_INVALID_PARAMETER;
1072 if (NULL == invocation_name) {
1073 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1074 return VC_ERROR_INVALID_PARAMETER;
1077 vc_cmd_s* cmd = NULL;
1078 cmd = (vc_cmd_s*)vc_command;
1080 if (cmd->invocation_name)
1081 free(cmd->invocation_name);
1082 cmd->invocation_name = NULL;
1083 cmd->invocation_name = strdup(invocation_name);
1085 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1086 return VC_ERROR_NONE;
1089 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1091 if (0 != __vc_cmd_get_feature_enabled()) {
1092 return VC_ERROR_NOT_SUPPORTED;
1095 if (NULL == vc_command || NULL == invocation_name) {
1096 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1097 return VC_ERROR_INVALID_PARAMETER;
1100 vc_cmd_s* cmd = NULL;
1101 cmd = (vc_cmd_s*)vc_command;
1103 if (cmd->invocation_name)
1104 *invocation_name = strdup(gettext(cmd->invocation_name));
1106 *invocation_name = NULL;
1108 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1109 return VC_ERROR_NONE;
1112 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1114 if (0 != __vc_cmd_get_feature_enabled()) {
1115 return VC_ERROR_NOT_SUPPORTED;
1117 if (0 != __vc_cmd_check_privilege()) {
1118 return VC_ERROR_PERMISSION_DENIED;
1121 if (NULL == vc_command) {
1122 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1123 return VC_ERROR_INVALID_PARAMETER;
1126 vc_cmd_s* cmd = NULL;
1127 cmd = (vc_cmd_s*)vc_command;
1131 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1133 return VC_ERROR_NONE;
1136 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1138 if (0 != __vc_cmd_get_feature_enabled()) {
1139 return VC_ERROR_NOT_SUPPORTED;
1141 if (0 != __vc_cmd_check_privilege()) {
1142 return VC_ERROR_PERMISSION_DENIED;
1145 if (NULL == vc_command || NULL == type) {
1146 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1147 return VC_ERROR_INVALID_PARAMETER;
1150 vc_cmd_s* cmd = NULL;
1151 cmd = (vc_cmd_s*)vc_command;
1155 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1157 return VC_ERROR_NONE;
1160 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1162 if (0 != __vc_cmd_get_feature_enabled()) {
1163 return VC_ERROR_NOT_SUPPORTED;
1166 if (NULL == vc_command) {
1167 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1168 return VC_ERROR_INVALID_PARAMETER;
1171 vc_cmd_s* cmd = NULL;
1172 cmd = (vc_cmd_s*)vc_command;
1174 cmd->format = format;
1176 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1178 return VC_ERROR_NONE;
1181 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1183 if (0 != __vc_cmd_get_feature_enabled()) {
1184 return VC_ERROR_NOT_SUPPORTED;
1187 if (NULL == vc_command || NULL == format) {
1188 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1189 return VC_ERROR_INVALID_PARAMETER;
1192 vc_cmd_s* cmd = NULL;
1193 cmd = (vc_cmd_s*)vc_command;
1195 *format = cmd->format;
1197 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1199 return VC_ERROR_NONE;
1202 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1204 if (0 != __vc_cmd_get_feature_enabled()) {
1205 return VC_ERROR_NOT_SUPPORTED;
1207 if (0 != __vc_cmd_check_privilege()) {
1208 return VC_ERROR_PERMISSION_DENIED;
1211 if (NULL == vc_command) {
1212 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1213 return VC_ERROR_INVALID_PARAMETER;
1216 vc_cmd_s* cmd = NULL;
1217 cmd = (vc_cmd_s*)vc_command;
1221 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1223 return VC_ERROR_NONE;
1226 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1228 if (0 != __vc_cmd_get_feature_enabled()) {
1229 return VC_ERROR_NOT_SUPPORTED;
1231 if (0 != __vc_cmd_check_privilege()) {
1232 return VC_ERROR_PERMISSION_DENIED;
1235 if (NULL == vc_command || NULL == pid) {
1236 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1237 return VC_ERROR_INVALID_PARAMETER;
1240 vc_cmd_s* cmd = NULL;
1241 cmd = (vc_cmd_s*)vc_command;
1245 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1247 return VC_ERROR_NONE;
1250 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1252 if (0 != __vc_cmd_get_feature_enabled()) {
1253 return VC_ERROR_NOT_SUPPORTED;
1255 if (0 != __vc_cmd_check_privilege()) {
1256 return VC_ERROR_PERMISSION_DENIED;
1259 if (NULL == vc_command) {
1260 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1261 return VC_ERROR_INVALID_PARAMETER;
1264 vc_cmd_s* cmd = NULL;
1265 cmd = (vc_cmd_s*)vc_command;
1267 cmd->domain = domain;
1269 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1271 return VC_ERROR_NONE;
1274 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1276 if (0 != __vc_cmd_get_feature_enabled()) {
1277 return VC_ERROR_NOT_SUPPORTED;
1279 if (0 != __vc_cmd_check_privilege()) {
1280 return VC_ERROR_PERMISSION_DENIED;
1283 if (NULL == vc_command || NULL == domain) {
1284 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1285 return VC_ERROR_INVALID_PARAMETER;
1288 vc_cmd_s* cmd = NULL;
1289 cmd = (vc_cmd_s*)vc_command;
1291 *domain = cmd->domain;
1293 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1295 return VC_ERROR_NONE;
1299 * @brief Sets key value of command.
1301 * @param[in] vc_command Command handle
1302 * @param[in] key key value
1303 * @param[in] modifier modifier value
1305 * @return 0 on success, otherwise a negative error value
1306 * @retval #VC_ERROR_NONE Successful
1307 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1309 * @see vc_cmd_get_result_key()
1311 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1313 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1315 if (NULL == vc_command) {
1316 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1317 return VC_ERROR_INVALID_PARAMETER;
1320 vc_cmd_s* cmd = NULL;
1321 cmd = (vc_cmd_s*)vc_command;
1323 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1326 cmd->modifier = modifier;
1328 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1330 return VC_ERROR_NONE;
1334 * @brief Gets key value of command.
1336 * @param[in] vc_command Command handle
1337 * @param[out] key key value
1338 * @param[out] modifier modifier value
1340 * @return 0 on success, otherwise a negative error value
1341 * @retval #VC_ERROR_NONE Successful
1342 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1344 * @see vc_cmd_add_result_key()
1346 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1348 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1350 if (NULL == vc_command || NULL == key || NULL == modifier) {
1351 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1352 return VC_ERROR_INVALID_PARAMETER;
1355 vc_cmd_s* cmd = NULL;
1356 cmd = (vc_cmd_s*)vc_command;
1359 *modifier = cmd->modifier;
1361 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1363 return VC_ERROR_NONE;
1366 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1368 if (NULL == vc_cmd_list) {
1372 vc_cmd_list_s* list = NULL;
1373 list = (vc_cmd_list_s*)vc_cmd_list;
1375 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1376 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1379 GSList *iter = NULL;
1380 iter = g_slist_nth(list->list, 0);
1381 while (NULL != iter) {
1382 vc_cmd_s *cmd = NULL;
1385 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
1386 return VC_ERROR_OPERATION_FAILED;
1388 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)",
1389 i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1391 iter = g_slist_next(iter);
1394 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1396 return VC_ERROR_NONE;
1399 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1401 if (0 != __vc_cmd_get_feature_enabled()) {
1402 return VC_ERROR_NOT_SUPPORTED;
1405 if (NULL == vc_cmd || NULL == json) {
1406 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1407 return VC_ERROR_INVALID_PARAMETER;
1410 vc_cmd_s* cmd = NULL;
1411 cmd = (vc_cmd_s*)vc_cmd;
1413 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1414 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1415 return VC_ERROR_INVALID_PARAMETER;
1418 if (0 != vc_info_parser_get_nlu_result(json)) {
1419 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1420 return VC_ERROR_OPERATION_FAILED;
1423 return VC_ERROR_NONE;
1426 static void __vc_cmd_regex_deinit(int num_regex)
1428 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1431 for (i = 0; num_regex > i; i++) {
1435 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1438 static int __vc_cmd_regex_init()
1440 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1442 int cflags = REG_EXTENDED | REG_ICASE;
1448 vc_config_mgr_get_default_language(&lang);
1450 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1451 return VC_ERROR_OPERATION_FAILED;
1454 if (!strcmp("en_US", lang)) {
1456 } else if (!strcmp("ko_KR", lang)) {
1462 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1463 return VC_ERROR_INVALID_LANGUAGE;
1469 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1471 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1473 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1474 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1476 regerror(ret, ®[0], errStr, sizeof(errStr));
1478 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1479 return VC_ERROR_OPERATION_FAILED;
1482 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1483 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1485 regerror(ret, ®[1], errStr, sizeof(errStr));
1486 __vc_cmd_regex_deinit(1);
1488 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1489 return VC_ERROR_OPERATION_FAILED;
1492 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1493 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1495 regerror(ret, ®[2], errStr, sizeof(errStr));
1496 __vc_cmd_regex_deinit(2);
1498 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1499 return VC_ERROR_OPERATION_FAILED;
1502 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1503 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1505 regerror(ret, ®[3], errStr, sizeof(errStr));
1506 __vc_cmd_regex_deinit(3);
1508 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1509 return VC_ERROR_OPERATION_FAILED;
1512 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1513 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1515 regerror(ret, ®[4], errStr, sizeof(errStr));
1516 __vc_cmd_regex_deinit(4);
1518 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1519 return VC_ERROR_OPERATION_FAILED;
1522 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1523 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1525 regerror(ret, ®[5], errStr, sizeof(errStr));
1526 __vc_cmd_regex_deinit(5);
1528 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1529 return VC_ERROR_OPERATION_FAILED;
1532 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1533 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1535 regerror(ret, ®[6], errStr, sizeof(errStr));
1536 __vc_cmd_regex_deinit(6);
1538 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1539 return VC_ERROR_OPERATION_FAILED;
1542 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1543 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1545 regerror(ret, ®[7], errStr, sizeof(errStr));
1546 __vc_cmd_regex_deinit(7);
1548 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1549 return VC_ERROR_OPERATION_FAILED;
1552 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1553 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1555 regerror(ret, ®[8], errStr, sizeof(errStr));
1556 __vc_cmd_regex_deinit(8);
1558 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1559 return VC_ERROR_OPERATION_FAILED;
1562 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1563 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1565 regerror(ret, ®[9], errStr, sizeof(errStr));
1566 __vc_cmd_regex_deinit(9);
1568 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1569 return VC_ERROR_OPERATION_FAILED;
1572 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1573 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1575 regerror(ret, ®[10], errStr, sizeof(errStr));
1576 __vc_cmd_regex_deinit(10);
1578 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1579 return VC_ERROR_OPERATION_FAILED;
1582 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1583 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1585 regerror(ret, ®[11], errStr, sizeof(errStr));
1586 __vc_cmd_regex_deinit(11);
1588 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1589 return VC_ERROR_OPERATION_FAILED;
1592 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1594 return VC_ERROR_NONE;
1597 static void __vc_cmd_add_year(struct tm *td, int year)
1599 td->tm_year += year;
1602 static void __vc_cmd_add_mon(struct tm *td, int mon)
1606 mon = td->tm_mon + mon;
1610 __vc_cmd_add_year(td, year);
1613 td->tm_mon = mon % 12;
1616 static void __vc_cmd_add_mday(struct tm *td, int mday)
1618 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1619 int year = td->tm_year + 1900;
1623 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1625 mday = td->tm_mday + mday;
1627 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1628 mday -= max_day[mon % 12];
1630 if (11 == mon % 12) {
1633 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1641 mon = mon - td->tm_mon;
1644 __vc_cmd_add_mon(td, mon);
1650 static void __vc_cmd_add_hour(struct tm *td, int hour)
1654 hour = td->tm_hour + hour;
1658 __vc_cmd_add_mday(td, day);
1661 td->tm_hour = hour % 24;
1664 static void __vc_cmd_add_min(struct tm *td, int min)
1668 min = td->tm_min + min;
1672 __vc_cmd_add_hour(td, hour);
1675 td->tm_min = min % 60;
1678 static void __copy_struct_tm(struct tm *des, struct tm *src)
1680 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1682 des->tm_sec = src->tm_sec;
1683 des->tm_min = src->tm_min;
1684 des->tm_hour = src->tm_hour;
1685 des->tm_mday = src->tm_mday;
1686 des->tm_mon = src->tm_mon;
1687 des->tm_year = src->tm_year;
1688 des->tm_wday = src->tm_wday;
1689 des->tm_yday = src->tm_yday;
1690 des->tm_isdst = src->tm_isdst;
1692 des->tm_gmtoff = src->tm_gmtoff;
1693 des->tm_zone = src->tm_zone;
1696 static void __update_data_sidx(int idx)
1698 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1701 static void __update_data_eidx(int idx)
1703 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1706 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1708 regmatch_t pmatch[3];
1714 ret = regexec(®[6], str, 3, pmatch, 0);
1717 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1719 if (12 < td->tm_hour) {
1720 __vc_cmd_add_mday(td, 1);
1726 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1728 __vc_cmd_add_mday(td, 1);
1733 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1735 __update_data_sidx(pmatch[0].rm_so);
1736 __update_data_eidx(pmatch[0].rm_eo);
1739 return VC_ERROR_NONE;
1742 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1743 return VC_ERROR_NONE;
1746 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1748 regmatch_t pmatch[2];
1756 char *tempstr = NULL;
1759 ret = regexec(®[3], str, 1, pmatch, 0);
1761 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1764 sidx = pmatch[0].rm_so;
1765 eidx = pmatch[0].rm_eo;
1767 ret = regexec(®[4], str, 2, pmatch, 0);
1769 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1772 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1773 return VC_ERROR_OPERATION_FAILED;
1775 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1777 if (NULL == tempstr) {
1778 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1779 return VC_ERROR_OUT_OF_MEMORY;
1782 hour = atoi(tempstr);
1787 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1789 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1790 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1793 ret = regexec(®[5], str, 2, pmatch, 0);
1795 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1798 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1799 return VC_ERROR_OPERATION_FAILED;
1801 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1803 if (NULL == tempstr) {
1804 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1805 return VC_ERROR_OUT_OF_MEMORY;
1808 min = atoi(tempstr);
1813 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1815 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1816 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1819 if (hour < 0 && min < 0) {
1820 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1821 return VC_ERROR_NONE;
1824 hour = 0 > hour ? 0 : hour;
1825 min = 0 > min ? 0 : min;
1827 min = min + (hour * 60);
1829 __vc_cmd_add_min(td, min);
1832 __update_data_sidx(sidx);
1833 __update_data_eidx(eidx);
1836 return VC_ERROR_NONE;
1839 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1840 return VC_ERROR_NONE;
1843 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1845 regmatch_t pmatch[5];
1854 char *tempstr = NULL;
1857 ret = regexec(®[0], str, 5, pmatch, 0);
1859 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1863 sidx = pmatch[0].rm_so;
1864 eidx = pmatch[0].rm_eo;
1867 ret = regexec(®[1], str, 2, pmatch, 0);
1869 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1872 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1873 return VC_ERROR_OPERATION_FAILED;
1875 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1877 if (NULL == tempstr) {
1878 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1879 return VC_ERROR_OUT_OF_MEMORY;
1882 hour = atoi(tempstr);
1885 hour = hour + 12 * flag;
1887 if (12 == hour) hour = 0;
1888 else if (24 == hour) hour = 12;
1891 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1892 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1895 return VC_ERROR_NONE;
1901 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1903 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1904 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1905 } else if (0 < flag) {
1906 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1907 return VC_ERROR_NONE;
1910 ret = regexec(®[2], str, 2, pmatch, 0);
1913 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1915 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1917 if (NULL == tempstr) {
1918 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1919 return VC_ERROR_OUT_OF_MEMORY;
1922 min = atoi(tempstr);
1924 if (0 > min || 60 <= min) {
1925 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1928 return VC_ERROR_NONE;
1940 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1941 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1942 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1945 if (0 > hour && 0 > min) {
1946 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1947 return VC_ERROR_NONE;
1950 if (0 <= min && 0 <= hour) {
1951 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1955 } else if (0 <= min) {
1957 vc_config_mgr_get_default_language(&lang);
1959 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1960 return VC_ERROR_OPERATION_FAILED;
1963 if (!strcmp("en_US", lang)) {
1964 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1967 return VC_ERROR_NONE;
1969 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1976 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1984 __update_data_sidx(sidx);
1985 __update_data_eidx(eidx);
1988 return VC_ERROR_NONE;
1991 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1993 regmatch_t pmatch[10];
1999 ret = regexec(®[10], str, 5, pmatch, 0);
2001 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
2003 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2005 td->tm_year = td_now.tm_year;
2006 td->tm_mon = td_now.tm_mon;
2007 td->tm_mday = td_now.tm_mday;
2009 __vc_cmd_add_mday(td, idx - 1);
2011 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2013 __update_data_sidx(pmatch[0].rm_so);
2014 __update_data_eidx(pmatch[0].rm_eo);
2017 return VC_ERROR_NONE;
2020 ret = regexec(®[11], str, 10, pmatch, 0);
2022 for (idx = 1; 10 > idx; idx++) {
2023 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2028 td->tm_year = td_now.tm_year;
2029 td->tm_mon = td_now.tm_mon;
2030 td->tm_mday = td_now.tm_mday;
2032 __vc_cmd_add_mday(td, idx + 1);
2034 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2036 __update_data_sidx(pmatch[0].rm_so);
2037 __update_data_eidx(pmatch[0].rm_eo);
2040 return VC_ERROR_NONE;
2043 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2044 return VC_ERROR_NONE;
2047 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2049 regmatch_t pmatch[13];
2060 char *tempstr = NULL;
2063 ret = regexec(®[9], str, 2, pmatch, 0);
2065 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2068 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2069 return VC_ERROR_OPERATION_FAILED;
2071 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2073 if (NULL == tempstr) {
2074 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2075 return VC_ERROR_OUT_OF_MEMORY;
2078 day = atoi(tempstr);
2083 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2085 sidx = pmatch[0].rm_so;
2086 eidx = pmatch[0].rm_eo;
2088 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2089 return VC_ERROR_NONE;
2092 ret = regexec(®[8], str, 13, pmatch, 0);
2094 for (idx = 1; 13 > idx; idx++) {
2095 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2105 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2107 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2108 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2111 vc_config_mgr_get_default_language(&lang);
2113 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2114 return VC_ERROR_OPERATION_FAILED;
2117 if (!strcmp("en_US", lang)) {
2118 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2121 return VC_ERROR_NONE;
2130 ret = regexec(®[7], str, 3, pmatch, 0);
2132 if (!m_flag) return -1;
2134 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2137 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2138 return VC_ERROR_OPERATION_FAILED;
2140 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2142 if (NULL == tempstr) {
2143 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2144 return VC_ERROR_OUT_OF_MEMORY;
2147 year = atoi(tempstr);
2148 year = 1900 < year ? year - 1900 : year + 100;
2154 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2156 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2157 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2162 if (0 > g_time_flag) {
2166 } else if (2 == g_time_flag) {
2167 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2168 return VC_ERROR_NONE;
2171 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2172 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2174 if (max_day[mon] < day || 1 > day) {
2175 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2176 return VC_ERROR_NONE;
2185 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2187 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2188 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2192 __update_data_sidx(sidx);
2193 __update_data_eidx(eidx);
2196 return VC_ERROR_NONE;
2199 static int __vc_cmd_time_check(const char *str, struct tm *td)
2201 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2206 ret = __vc_cmd_tphrase_check(str, td, &exist);
2210 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2212 } else if (VC_ERROR_NONE != ret) {
2213 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2217 ret = __vc_cmd_trelative_check(str, td, &exist);
2221 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2223 } else if (VC_ERROR_NONE != ret) {
2224 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2228 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2232 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2234 } else if (VC_ERROR_NONE != ret) {
2235 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2239 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2240 return VC_ERROR_NONE;
2243 static int __vc_cmd_date_check(const char *str, struct tm *td)
2245 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2250 ret = __vc_cmd_dphrase_check(str, td, &exist);
2254 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2256 } else if (VC_ERROR_NONE != ret) {
2257 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2261 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2265 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2267 } else if (VC_ERROR_NONE != ret) {
2268 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2272 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2273 return VC_ERROR_NONE;
2276 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2278 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2281 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2284 if (NULL == text || NULL == result || NULL == remain) {
2285 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2286 return VC_ERROR_INVALID_PARAMETER;
2290 ret = __vc_cmd_regex_init();
2291 if (VC_ERROR_NONE != ret) {
2292 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2296 g_data_sidx = g_data_eidx = -1;
2299 localtime_r(&t_now, &td_now);
2300 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2302 __copy_struct_tm(&td, &td_now);
2303 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2304 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);
2306 g_time_flag = g_date_flag = -1;
2308 ret = __vc_cmd_time_check(text, &td);
2309 if (VC_ERROR_NONE != ret) {
2310 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2314 ret = __vc_cmd_date_check(text, &td);
2315 if (VC_ERROR_NONE != ret) {
2316 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2320 __vc_cmd_regex_deinit(12);
2322 if (g_time_flag > 0 || g_date_flag > 0) {
2323 *result = mktime(&td);
2325 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2326 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2327 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);
2329 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2331 if (NULL == *remain) {
2332 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2333 return VC_ERROR_OUT_OF_MEMORY;
2336 strncpy(*remain, text, g_data_sidx);
2337 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2339 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2342 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2344 return VC_ERROR_NONE;