2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
24 #include <system_info.h>
26 #include "vc_command.h"
27 #include "vc_info_parser.h"
29 #include "vc_regex_rule.h"
30 #include "vc_config_mgr.h"
31 #include "voice_control_command.h"
32 #include "voice_control_command_expand.h"
33 #include "voice_control_common.h"
34 #include "voice_control_key_defines.h"
36 static int g_feature_enabled = -1;
37 static bool g_privilege_allowed = false;
39 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
40 static cynara *p_cynara = NULL;
41 static GList *g_cmd_list = NULL;
42 static GList *g_cmdlist_list = NULL;
45 // For getting timestamp using regular expression
46 static regex_t reg[MAX_NUM_REGEX];
47 static time_t t_now; //time_t is based on UTC
48 static struct tm td_now; //if use localtime function, the value follows the local time zone, otherwise it follows the UTC.
50 static int g_time_flag;
51 static int g_date_flag;
53 static int g_data_sidx;
54 static int g_data_eidx;
56 static int __vc_cmd_get_feature_enabled()
58 if (0 == g_feature_enabled) {
59 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
60 return VC_ERROR_NOT_SUPPORTED;
61 } else if (-1 == g_feature_enabled) {
62 bool vc_supported = false;
63 bool mic_supported = false;
64 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
65 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
66 if (false == vc_supported || false == mic_supported) {
67 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
68 g_feature_enabled = 0;
69 return VC_ERROR_NOT_SUPPORTED;
72 g_feature_enabled = 1;
74 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
75 return VC_ERROR_NOT_SUPPORTED;
78 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
79 return VC_ERROR_NOT_SUPPORTED;
86 static int __check_privilege_initialize()
88 int ret = cynara_initialize(&p_cynara, NULL);
89 if (CYNARA_API_SUCCESS != ret)
90 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
92 return ret == CYNARA_API_SUCCESS;
95 static int __check_privilege(const char* uid, const char * privilege)
98 char label_path[1024] = "/proc/self/attr/current";
99 char smack_label[1024] = {'\0',};
105 fp = fopen(label_path, "r");
107 if (0 >= fread(smack_label, 1, sizeof(smack_label), fp))
108 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
113 pid_t pid = getpid();
114 char *session = cynara_session_from_pid(pid);
115 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
116 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
120 if (ret != CYNARA_API_ACCESS_ALLOWED)
125 static void __check_privilege_deinitialize()
129 int ret = cynara_finish(p_cynara);
130 if (ret != CYNARA_API_SUCCESS)
131 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] cynara finish %d", ret);
136 static int __vc_cmd_check_privilege()
138 if (true == g_privilege_allowed)
139 return VC_ERROR_NONE;
141 pthread_mutex_lock(&g_cynara_mutex);
143 if (false == g_privilege_allowed) {
145 ret = __check_privilege_initialize();
147 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
148 g_privilege_allowed = false;
149 pthread_mutex_unlock(&g_cynara_mutex);
150 return VC_ERROR_PERMISSION_DENIED;
154 snprintf(uid, 16, "%d", getuid());
156 ret = __check_privilege(uid, VC_PRIVILEGE);
157 __check_privilege_deinitialize();
159 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
160 g_privilege_allowed = false;
161 pthread_mutex_unlock(&g_cynara_mutex);
162 return VC_ERROR_PERMISSION_DENIED;
166 g_privilege_allowed = true;
167 pthread_mutex_unlock(&g_cynara_mutex);
168 return VC_ERROR_NONE;
171 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
173 if (0 != __vc_cmd_get_feature_enabled()) {
174 return VC_ERROR_NOT_SUPPORTED;
176 if (0 != __vc_cmd_check_privilege()) {
177 return VC_ERROR_PERMISSION_DENIED;
180 if (NULL == vc_cmd_list) {
181 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
182 return VC_ERROR_INVALID_PARAMETER;
185 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
188 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
189 return VC_ERROR_OUT_OF_MEMORY;
195 *vc_cmd_list = (vc_cmd_list_h)list;
197 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
199 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
201 return VC_ERROR_NONE;
204 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
206 if (0 != __vc_cmd_get_feature_enabled()) {
207 return VC_ERROR_NOT_SUPPORTED;
209 if (0 != __vc_cmd_check_privilege()) {
210 return VC_ERROR_PERMISSION_DENIED;
213 if (NULL == vc_cmd_list) {
214 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
215 return VC_ERROR_INVALID_PARAMETER;
218 vc_cmd_list_remove_all(vc_cmd_list, release_command);
220 vc_cmd_list_s* list = NULL;
221 list = (vc_cmd_list_s*)vc_cmd_list;
223 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
226 iter = g_list_find(g_cmdlist_list, list);
228 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
229 return VC_ERROR_INVALID_PARAMETER;
232 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
237 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
238 return VC_ERROR_NONE;
241 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
243 if (0 != __vc_cmd_get_feature_enabled()) {
244 return VC_ERROR_NOT_SUPPORTED;
246 if (0 != __vc_cmd_check_privilege()) {
247 return VC_ERROR_PERMISSION_DENIED;
250 if (NULL == vc_cmd_list || NULL == count) {
251 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
252 return VC_ERROR_INVALID_PARAMETER;
255 vc_cmd_list_s* list = NULL;
256 list = (vc_cmd_list_s*)vc_cmd_list;
258 *count = g_slist_length(list->list);
260 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
262 return VC_ERROR_NONE;
265 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
267 if (0 != __vc_cmd_get_feature_enabled()) {
268 return VC_ERROR_NOT_SUPPORTED;
270 if (0 != __vc_cmd_check_privilege()) {
271 return VC_ERROR_PERMISSION_DENIED;
274 if (NULL == vc_cmd_list || NULL == vc_command) {
275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
276 return VC_ERROR_INVALID_PARAMETER;
279 vc_cmd_list_s* list = NULL;
280 list = (vc_cmd_list_s*)vc_cmd_list;
282 vc_cmd_s* cmd = NULL;
283 cmd = (vc_cmd_s*)vc_command;
285 list->list = g_slist_append(list->list, cmd);
287 if (1 == g_slist_length(list->list)) {
291 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
293 return VC_ERROR_NONE;
296 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
298 if (0 != __vc_cmd_get_feature_enabled()) {
299 return VC_ERROR_NOT_SUPPORTED;
301 if (0 != __vc_cmd_check_privilege()) {
302 return VC_ERROR_PERMISSION_DENIED;
305 if (NULL == vc_cmd_list || NULL == vc_command) {
306 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
307 return VC_ERROR_INVALID_PARAMETER;
310 vc_cmd_list_s* list = NULL;
311 list = (vc_cmd_list_s*)vc_cmd_list;
313 vc_cmd_s* cmd = NULL;
314 cmd = (vc_cmd_s*)vc_command;
316 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
319 iter = g_slist_find(list->list, cmd);
321 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid");
322 return VC_ERROR_INVALID_PARAMETER;
325 list->list = g_slist_remove_link(list->list, iter);
326 SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command");
328 int len = g_slist_length(list->list);
331 else if (list->index == len)
332 list->index = len - 1;
334 return VC_ERROR_NONE;
337 static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data)
339 vc_cmd_s *temp = NULL;
342 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp);
345 temp->command = NULL;
347 free(temp->parameter);
348 temp->parameter = NULL;
352 if (temp->invocation_name)
353 free(temp->invocation_name);
354 temp->invocation_name = NULL;
364 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
366 if (0 != __vc_cmd_get_feature_enabled()) {
367 return VC_ERROR_NOT_SUPPORTED;
369 if (0 != __vc_cmd_check_privilege()) {
370 return VC_ERROR_PERMISSION_DENIED;
373 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
375 if (NULL == vc_cmd_list) {
376 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
377 return VC_ERROR_INVALID_PARAMETER;
380 vc_cmd_list_s* list = NULL;
381 list = (vc_cmd_list_s*)vc_cmd_list;
383 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
384 , list, release_command ? "true" : "false");
386 if (true == release_command)
387 g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL);
388 g_slist_free(list->list);
392 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
394 return VC_ERROR_NONE;
397 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
399 if (0 != __vc_cmd_get_feature_enabled()) {
400 return VC_ERROR_NOT_SUPPORTED;
402 if (0 != __vc_cmd_check_privilege()) {
403 return VC_ERROR_PERMISSION_DENIED;
406 if (NULL == vc_cmd_list) {
407 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
408 return VC_ERROR_INVALID_PARAMETER;
411 vc_cmd_list_s* list = NULL;
412 list = (vc_cmd_list_s*)vc_cmd_list;
415 iter = g_slist_nth(list->list, 0);
416 while (NULL != iter) {
417 vc_cmd_s *temp_cmd = NULL;
418 temp_cmd = iter->data;
419 if (NULL == temp_cmd) {
420 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
421 return VC_ERROR_OPERATION_FAILED;
423 if (false == callback((vc_cmd_h)temp_cmd, user_data))
426 iter = g_slist_next(iter);
429 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
431 return VC_ERROR_NONE;
434 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
436 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
438 if (0 != __vc_cmd_get_feature_enabled()) {
439 return VC_ERROR_NOT_SUPPORTED;
441 if (0 != __vc_cmd_check_privilege()) {
442 return VC_ERROR_PERMISSION_DENIED;
445 if (NULL == original) {
446 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
447 return VC_ERROR_INVALID_PARAMETER;
450 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
451 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
452 return VC_ERROR_INVALID_PARAMETER;
455 vc_cmd_list_s* list = NULL;
456 list = (vc_cmd_list_s*)original;
458 vc_cmd_list_h temp_list;
459 if (0 != vc_cmd_list_create(&temp_list)) {
460 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
461 return VC_ERROR_OPERATION_FAILED;
465 iter = g_slist_nth(list->list, 0);
466 while (NULL != iter) {
467 vc_cmd_s *iter_cmd = NULL;
468 iter_cmd = iter->data;
469 if (NULL == iter_cmd) {
470 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
471 return VC_ERROR_OPERATION_FAILED;
475 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
476 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
480 if (iter_type == type) {
482 if (0 != vc_cmd_create(&temp_cmd)) {
483 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
487 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
488 if (NULL != iter_cmd->command)
489 ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command);
490 if (NULL != iter_cmd->parameter)
491 ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter);
493 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
494 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
495 vc_cmd_destroy(temp_cmd);
499 iter = g_slist_next(iter);
503 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
504 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
506 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
509 *filtered = temp_list;
511 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
513 return VC_ERROR_NONE;
516 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
518 if (0 != __vc_cmd_get_feature_enabled()) {
519 return VC_ERROR_NOT_SUPPORTED;
521 if (0 != __vc_cmd_check_privilege()) {
522 return VC_ERROR_PERMISSION_DENIED;
525 if (NULL == vc_cmd_list) {
526 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
527 return VC_ERROR_INVALID_PARAMETER;
530 vc_cmd_list_s* list = NULL;
531 list = (vc_cmd_list_s*)vc_cmd_list;
533 if (0 == g_slist_length(list->list)) {
534 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
535 return VC_ERROR_EMPTY;
540 return VC_ERROR_NONE;
543 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
545 if (0 != __vc_cmd_get_feature_enabled()) {
546 return VC_ERROR_NOT_SUPPORTED;
548 if (0 != __vc_cmd_check_privilege()) {
549 return VC_ERROR_PERMISSION_DENIED;
552 if (NULL == vc_cmd_list) {
553 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
554 return VC_ERROR_INVALID_PARAMETER;
557 vc_cmd_list_s* list = NULL;
558 list = (vc_cmd_list_s*)vc_cmd_list;
560 int count = g_slist_length(list->list);
563 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
564 return VC_ERROR_EMPTY;
566 list->index = count - 1;
567 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
570 return VC_ERROR_NONE;
573 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
575 if (0 != __vc_cmd_get_feature_enabled()) {
576 return VC_ERROR_NOT_SUPPORTED;
578 if (0 != __vc_cmd_check_privilege()) {
579 return VC_ERROR_PERMISSION_DENIED;
582 if (NULL == vc_cmd_list) {
583 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
584 return VC_ERROR_INVALID_PARAMETER;
587 vc_cmd_list_s* list = NULL;
588 list = (vc_cmd_list_s*)vc_cmd_list;
590 int count = g_slist_length(list->list);
592 if (list->index < count - 1) {
593 list->index = list->index + 1;
594 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
596 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
597 return VC_ERROR_ITERATION_END;
600 return VC_ERROR_NONE;
603 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
605 if (0 != __vc_cmd_get_feature_enabled()) {
606 return VC_ERROR_NOT_SUPPORTED;
608 if (0 != __vc_cmd_check_privilege()) {
609 return VC_ERROR_PERMISSION_DENIED;
612 if (NULL == vc_cmd_list) {
613 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
614 return VC_ERROR_INVALID_PARAMETER;
617 vc_cmd_list_s* list = NULL;
618 list = (vc_cmd_list_s*)vc_cmd_list;
620 if (list->index > 0) {
621 list->index = list->index - 1;
622 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
624 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
625 return VC_ERROR_ITERATION_END;
628 return VC_ERROR_NONE;
631 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
633 if (0 != __vc_cmd_get_feature_enabled()) {
634 return VC_ERROR_NOT_SUPPORTED;
636 if (0 != __vc_cmd_check_privilege()) {
637 return VC_ERROR_PERMISSION_DENIED;
640 if (NULL == vc_cmd_list || NULL == vc_command) {
641 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
642 return VC_ERROR_INVALID_PARAMETER;
645 vc_cmd_list_s* list = NULL;
646 list = (vc_cmd_list_s*)vc_cmd_list;
648 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
650 if (0 == g_slist_length(list->list)) {
651 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
653 return VC_ERROR_EMPTY;
656 vc_cmd_s *temp_cmd = NULL;
657 temp_cmd = g_slist_nth_data(list->list, list->index);
659 *vc_command = (vc_cmd_h)temp_cmd;
661 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
663 return VC_ERROR_NONE;
667 int vc_cmd_create(vc_cmd_h* vc_command)
669 if (0 != __vc_cmd_get_feature_enabled()) {
670 return VC_ERROR_NOT_SUPPORTED;
672 if (0 != __vc_cmd_check_privilege()) {
673 return VC_ERROR_PERMISSION_DENIED;
676 if (NULL == vc_command) {
677 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
678 return VC_ERROR_INVALID_PARAMETER;
681 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
683 if (NULL == command) {
684 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
685 return VC_ERROR_OUT_OF_MEMORY;
691 command->type = VC_COMMAND_TYPE_NONE;
692 command->format = VC_CMD_FORMAT_FIXED;
693 command->command = NULL;
694 command->parameter = NULL;
696 command->priority = 0;
697 command->key = VC_KEY_NONE;
698 command->modifier = VC_MODIFIER_NONE;
699 command->invocation_name = NULL;
700 command->appid = NULL;
701 command->fixed = NULL;
702 command->coordinates = NULL;
704 *vc_command = (vc_cmd_h)command;
706 g_cmd_list = g_list_append(g_cmd_list, command);
708 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
710 return VC_ERROR_NONE;
713 int vc_cmd_destroy(vc_cmd_h vc_command)
715 if (0 != __vc_cmd_get_feature_enabled()) {
716 return VC_ERROR_NOT_SUPPORTED;
718 if (0 != __vc_cmd_check_privilege()) {
719 return VC_ERROR_PERMISSION_DENIED;
722 if (NULL == vc_command) {
723 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
724 return VC_ERROR_INVALID_PARAMETER;
727 vc_cmd_s* command = NULL;
728 command = (vc_cmd_s*)vc_command;
730 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
733 iter = g_list_find(g_cmd_list, command);
735 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid");
736 return VC_ERROR_INVALID_PARAMETER;
739 g_cmd_list = g_list_remove_link(g_cmd_list, iter);
741 if (command->command)
742 free(command->command);
743 command->command = NULL;
744 if (command->parameter)
745 free(command->parameter);
746 command->parameter = NULL;
747 if (command->invocation_name)
748 free(command->invocation_name);
749 command->invocation_name = NULL;
751 free(command->appid);
752 command->appid = NULL;
754 free(command->fixed);
755 command->fixed = NULL;
756 if (command->coordinates)
757 free(command->coordinates);
758 command->coordinates = NULL;
762 return VC_ERROR_NONE;
765 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
767 if (0 != __vc_cmd_get_feature_enabled()) {
768 return VC_ERROR_NOT_SUPPORTED;
770 if (0 != __vc_cmd_check_privilege()) {
771 return VC_ERROR_PERMISSION_DENIED;
774 if (NULL == vc_command) {
775 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
776 return VC_ERROR_INVALID_PARAMETER;
779 vc_cmd_s* cmd = NULL;
780 cmd = (vc_cmd_s*)vc_command;
783 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
788 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
790 if (0 != __vc_cmd_get_feature_enabled()) {
791 return VC_ERROR_NOT_SUPPORTED;
793 if (0 != __vc_cmd_check_privilege()) {
794 return VC_ERROR_PERMISSION_DENIED;
797 if (NULL == vc_command || NULL == id) {
798 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
799 return VC_ERROR_INVALID_PARAMETER;
802 vc_cmd_s* cmd = NULL;
803 cmd = (vc_cmd_s*)vc_command;
806 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
811 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
813 if (0 != __vc_cmd_get_feature_enabled()) {
814 return VC_ERROR_NOT_SUPPORTED;
817 if (NULL == vc_command) {
818 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
819 return VC_ERROR_INVALID_PARAMETER;
823 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
824 return VC_ERROR_INVALID_PARAMETER;
827 vc_cmd_s* cmd = NULL;
828 cmd = (vc_cmd_s*)vc_command;
833 cmd->appid = strdup(appid);
835 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
839 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
841 if (0 != __vc_cmd_get_feature_enabled()) {
842 return VC_ERROR_NOT_SUPPORTED;
845 if (NULL == vc_command || NULL == appid) {
846 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
847 return VC_ERROR_INVALID_PARAMETER;
850 vc_cmd_s* cmd = NULL;
851 cmd = (vc_cmd_s*)vc_command;
854 *appid = strdup(gettext(cmd->appid));
858 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
863 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
865 if (0 != __vc_cmd_get_feature_enabled()) {
866 return VC_ERROR_NOT_SUPPORTED;
868 if (0 != __vc_cmd_check_privilege()) {
869 return VC_ERROR_PERMISSION_DENIED;
872 if (NULL == vc_command) {
873 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
874 return VC_ERROR_INVALID_PARAMETER;
877 vc_cmd_s* cmd = NULL;
878 cmd = (vc_cmd_s*)vc_command;
883 cmd->command = strdup(command);
885 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
890 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
892 if (0 != __vc_cmd_get_feature_enabled()) {
893 return VC_ERROR_NOT_SUPPORTED;
895 if (0 != __vc_cmd_check_privilege()) {
896 return VC_ERROR_PERMISSION_DENIED;
899 if (NULL == vc_command || NULL == command) {
900 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
901 return VC_ERROR_INVALID_PARAMETER;
904 vc_cmd_s* cmd = NULL;
905 cmd = (vc_cmd_s*)vc_command;
908 *command = strdup(gettext(cmd->command));
912 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
917 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
919 if (0 != __vc_cmd_get_feature_enabled()) {
920 return VC_ERROR_NOT_SUPPORTED;
922 if (0 != __vc_cmd_check_privilege()) {
923 return VC_ERROR_PERMISSION_DENIED;
926 if (NULL == vc_command || NULL == command) {
927 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
928 return VC_ERROR_INVALID_PARAMETER;
931 vc_cmd_s* cmd = NULL;
932 cmd = (vc_cmd_s*)vc_command;
935 free(cmd->parameter);
936 cmd->parameter = NULL;
937 cmd->parameter = strdup(command);
938 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
943 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
945 if (0 != __vc_cmd_get_feature_enabled()) {
946 return VC_ERROR_NOT_SUPPORTED;
949 if (NULL == vc_command || NULL == command) {
950 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
951 return VC_ERROR_INVALID_PARAMETER;
954 vc_cmd_s* cmd = NULL;
955 cmd = (vc_cmd_s*)vc_command;
958 *command = strdup(gettext(cmd->parameter));
962 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
967 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
969 if (0 != __vc_cmd_get_feature_enabled()) {
970 return VC_ERROR_NOT_SUPPORTED;
973 if (NULL == vc_command) {
974 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
975 return VC_ERROR_INVALID_PARAMETER;
979 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
980 return VC_ERROR_INVALID_PARAMETER;
983 vc_cmd_s* cmd = NULL;
984 cmd = (vc_cmd_s*)vc_command;
989 cmd->fixed = strdup(fixed);
991 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
995 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
997 if (0 != __vc_cmd_get_feature_enabled()) {
998 return VC_ERROR_NOT_SUPPORTED;
1001 if (NULL == vc_command || NULL == fixed) {
1002 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1003 return VC_ERROR_INVALID_PARAMETER;
1006 vc_cmd_s* cmd = NULL;
1007 cmd = (vc_cmd_s*)vc_command;
1010 *fixed = strdup(gettext(cmd->fixed));
1014 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1019 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1021 if (0 != __vc_cmd_get_feature_enabled()) {
1022 return VC_ERROR_NOT_SUPPORTED;
1025 if (NULL == vc_command) {
1026 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1027 return VC_ERROR_INVALID_PARAMETER;
1030 if (NULL == invocation_name) {
1031 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1032 return VC_ERROR_INVALID_PARAMETER;
1035 vc_cmd_s* cmd = NULL;
1036 cmd = (vc_cmd_s*)vc_command;
1038 if (cmd->invocation_name)
1039 free(cmd->invocation_name);
1040 cmd->invocation_name = NULL;
1041 cmd->invocation_name = strdup(invocation_name);
1043 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1047 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1049 if (0 != __vc_cmd_get_feature_enabled()) {
1050 return VC_ERROR_NOT_SUPPORTED;
1053 if (NULL == vc_command || NULL == invocation_name) {
1054 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1055 return VC_ERROR_INVALID_PARAMETER;
1058 vc_cmd_s* cmd = NULL;
1059 cmd = (vc_cmd_s*)vc_command;
1061 if (cmd->invocation_name)
1062 *invocation_name = strdup(gettext(cmd->invocation_name));
1064 *invocation_name = NULL;
1066 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1070 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1072 if (0 != __vc_cmd_get_feature_enabled()) {
1073 return VC_ERROR_NOT_SUPPORTED;
1075 if (0 != __vc_cmd_check_privilege()) {
1076 return VC_ERROR_PERMISSION_DENIED;
1079 if (NULL == vc_command) {
1080 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1081 return VC_ERROR_INVALID_PARAMETER;
1084 vc_cmd_s* cmd = NULL;
1085 cmd = (vc_cmd_s*)vc_command;
1089 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1094 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1096 if (0 != __vc_cmd_get_feature_enabled()) {
1097 return VC_ERROR_NOT_SUPPORTED;
1099 if (0 != __vc_cmd_check_privilege()) {
1100 return VC_ERROR_PERMISSION_DENIED;
1103 if (NULL == vc_command || NULL == type) {
1104 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1105 return VC_ERROR_INVALID_PARAMETER;
1108 vc_cmd_s* cmd = NULL;
1109 cmd = (vc_cmd_s*)vc_command;
1113 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1118 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1120 if (0 != __vc_cmd_get_feature_enabled()) {
1121 return VC_ERROR_NOT_SUPPORTED;
1124 if (NULL == vc_command) {
1125 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1126 return VC_ERROR_INVALID_PARAMETER;
1129 vc_cmd_s* cmd = NULL;
1130 cmd = (vc_cmd_s*)vc_command;
1132 cmd->format = format;
1134 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1139 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1141 if (0 != __vc_cmd_get_feature_enabled()) {
1142 return VC_ERROR_NOT_SUPPORTED;
1145 if (NULL == vc_command || NULL == format) {
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;
1153 *format = cmd->format;
1155 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1160 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1162 if (0 != __vc_cmd_get_feature_enabled()) {
1163 return VC_ERROR_NOT_SUPPORTED;
1165 if (0 != __vc_cmd_check_privilege()) {
1166 return VC_ERROR_PERMISSION_DENIED;
1169 if (NULL == vc_command) {
1170 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1171 return VC_ERROR_INVALID_PARAMETER;
1174 vc_cmd_s* cmd = NULL;
1175 cmd = (vc_cmd_s*)vc_command;
1179 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1184 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1186 if (0 != __vc_cmd_get_feature_enabled()) {
1187 return VC_ERROR_NOT_SUPPORTED;
1189 if (0 != __vc_cmd_check_privilege()) {
1190 return VC_ERROR_PERMISSION_DENIED;
1193 if (NULL == vc_command || NULL == pid) {
1194 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1195 return VC_ERROR_INVALID_PARAMETER;
1198 vc_cmd_s* cmd = NULL;
1199 cmd = (vc_cmd_s*)vc_command;
1203 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1208 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1210 if (0 != __vc_cmd_get_feature_enabled()) {
1211 return VC_ERROR_NOT_SUPPORTED;
1213 if (0 != __vc_cmd_check_privilege()) {
1214 return VC_ERROR_PERMISSION_DENIED;
1217 if (NULL == vc_command) {
1218 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1219 return VC_ERROR_INVALID_PARAMETER;
1222 vc_cmd_s* cmd = NULL;
1223 cmd = (vc_cmd_s*)vc_command;
1225 cmd->domain = domain;
1227 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1232 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1234 if (0 != __vc_cmd_get_feature_enabled()) {
1235 return VC_ERROR_NOT_SUPPORTED;
1237 if (0 != __vc_cmd_check_privilege()) {
1238 return VC_ERROR_PERMISSION_DENIED;
1241 if (NULL == vc_command || NULL == domain) {
1242 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1243 return VC_ERROR_INVALID_PARAMETER;
1246 vc_cmd_s* cmd = NULL;
1247 cmd = (vc_cmd_s*)vc_command;
1249 *domain = cmd->domain;
1251 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1257 * @brief Sets key value of command.
1259 * @param[in] vc_command Command handle
1260 * @param[in] key key value
1261 * @param[in] modifier modifier value
1263 * @return 0 on success, otherwise a negative error value
1264 * @retval #VC_ERROR_NONE Successful
1265 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1267 * @see vc_cmd_get_result_key()
1269 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1271 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1273 if (NULL == vc_command) {
1274 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1275 return VC_ERROR_INVALID_PARAMETER;
1278 vc_cmd_s* cmd = NULL;
1279 cmd = (vc_cmd_s*)vc_command;
1281 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1284 cmd->modifier = modifier;
1286 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1292 * @brief Gets key value of command.
1294 * @param[in] vc_command Command handle
1295 * @param[out] key key value
1296 * @param[out] modifier modifier value
1298 * @return 0 on success, otherwise a negative error value
1299 * @retval #VC_ERROR_NONE Successful
1300 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1302 * @see vc_cmd_add_result_key()
1304 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1306 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1308 if (NULL == vc_command || NULL == key || NULL == modifier) {
1309 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1310 return VC_ERROR_INVALID_PARAMETER;
1313 vc_cmd_s* cmd = NULL;
1314 cmd = (vc_cmd_s*)vc_command;
1317 *modifier = cmd->modifier;
1319 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1324 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1326 if (NULL == vc_cmd_list) {
1330 vc_cmd_list_s* list = NULL;
1331 list = (vc_cmd_list_s*)vc_cmd_list;
1333 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1334 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1337 GSList *iter = NULL;
1338 iter = g_slist_nth(list->list, 0);
1339 while (NULL != iter) {
1340 vc_cmd_s *cmd = NULL;
1343 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
1344 return VC_ERROR_OPERATION_FAILED;
1346 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)",
1347 i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1349 iter = g_slist_next(iter);
1352 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1357 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1359 if (0 != __vc_cmd_get_feature_enabled()) {
1360 return VC_ERROR_NOT_SUPPORTED;
1363 if (NULL == vc_cmd || NULL == json) {
1364 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1365 return VC_ERROR_INVALID_PARAMETER;
1368 vc_cmd_s* cmd = NULL;
1369 cmd = (vc_cmd_s*)vc_cmd;
1371 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1372 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1373 return VC_ERROR_INVALID_PARAMETER;
1376 if (0 != vc_info_parser_get_nlu_result(json)) {
1377 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1378 return VC_ERROR_OPERATION_FAILED;
1384 static void __vc_cmd_regex_deinit(int num_regex)
1386 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1389 for (i = 0; num_regex > i; i++) {
1393 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1396 static int __vc_cmd_regex_init()
1398 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1400 int cflags = REG_EXTENDED | REG_ICASE;
1406 vc_config_mgr_get_default_language(&lang);
1408 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1409 return VC_ERROR_OPERATION_FAILED;
1412 if (!strcmp("en_US", lang)) {
1414 } else if (!strcmp("ko_KR", lang)) {
1420 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1421 return VC_ERROR_INVALID_LANGUAGE;
1427 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1429 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1431 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1432 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1434 regerror(ret, ®[0], errStr, sizeof(errStr));
1436 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1437 return VC_ERROR_OPERATION_FAILED;
1440 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1441 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1443 regerror(ret, ®[1], errStr, sizeof(errStr));
1444 __vc_cmd_regex_deinit(1);
1446 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1447 return VC_ERROR_OPERATION_FAILED;
1450 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1451 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1453 regerror(ret, ®[2], errStr, sizeof(errStr));
1454 __vc_cmd_regex_deinit(2);
1456 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1457 return VC_ERROR_OPERATION_FAILED;
1460 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1461 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1463 regerror(ret, ®[3], errStr, sizeof(errStr));
1464 __vc_cmd_regex_deinit(3);
1466 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1467 return VC_ERROR_OPERATION_FAILED;
1470 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1471 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1473 regerror(ret, ®[4], errStr, sizeof(errStr));
1474 __vc_cmd_regex_deinit(4);
1476 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1477 return VC_ERROR_OPERATION_FAILED;
1480 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1481 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1483 regerror(ret, ®[5], errStr, sizeof(errStr));
1484 __vc_cmd_regex_deinit(5);
1486 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1487 return VC_ERROR_OPERATION_FAILED;
1490 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1491 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1493 regerror(ret, ®[6], errStr, sizeof(errStr));
1494 __vc_cmd_regex_deinit(6);
1496 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1497 return VC_ERROR_OPERATION_FAILED;
1500 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1501 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1503 regerror(ret, ®[7], errStr, sizeof(errStr));
1504 __vc_cmd_regex_deinit(7);
1506 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1507 return VC_ERROR_OPERATION_FAILED;
1510 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1511 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1513 regerror(ret, ®[8], errStr, sizeof(errStr));
1514 __vc_cmd_regex_deinit(8);
1516 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1517 return VC_ERROR_OPERATION_FAILED;
1520 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1521 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1523 regerror(ret, ®[9], errStr, sizeof(errStr));
1524 __vc_cmd_regex_deinit(9);
1526 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1527 return VC_ERROR_OPERATION_FAILED;
1530 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1531 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1533 regerror(ret, ®[10], errStr, sizeof(errStr));
1534 __vc_cmd_regex_deinit(10);
1536 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1537 return VC_ERROR_OPERATION_FAILED;
1540 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1541 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1543 regerror(ret, ®[11], errStr, sizeof(errStr));
1544 __vc_cmd_regex_deinit(11);
1546 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1547 return VC_ERROR_OPERATION_FAILED;
1550 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1552 return VC_ERROR_NONE;
1555 static void __vc_cmd_add_year(struct tm *td, int year)
1557 td->tm_year += year;
1560 static void __vc_cmd_add_mon(struct tm *td, int mon)
1564 mon = td->tm_mon + mon;
1568 __vc_cmd_add_year(td, year);
1571 td->tm_mon = mon % 12;
1574 static void __vc_cmd_add_mday(struct tm *td, int mday)
1576 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1577 int year = td->tm_year + 1900;
1581 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1583 mday = td->tm_mday + mday;
1585 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1586 mday -= max_day[mon % 12];
1588 if (11 == mon % 12) {
1591 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1599 mon = mon - td->tm_mon;
1602 __vc_cmd_add_mon(td, mon);
1608 static void __vc_cmd_add_hour(struct tm *td, int hour)
1612 hour = td->tm_hour + hour;
1616 __vc_cmd_add_mday(td, day);
1619 td->tm_hour = hour % 24;
1622 static void __vc_cmd_add_min(struct tm *td, int min)
1626 min = td->tm_min + min;
1630 __vc_cmd_add_hour(td, hour);
1633 td->tm_min = min % 60;
1636 static void __copy_struct_tm(struct tm *des, struct tm *src)
1638 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1640 des->tm_sec = src->tm_sec;
1641 des->tm_min = src->tm_min;
1642 des->tm_hour = src->tm_hour;
1643 des->tm_mday = src->tm_mday;
1644 des->tm_mon = src->tm_mon;
1645 des->tm_year = src->tm_year;
1646 des->tm_wday = src->tm_wday;
1647 des->tm_yday = src->tm_yday;
1648 des->tm_isdst = src->tm_isdst;
1650 des->tm_gmtoff = src->tm_gmtoff;
1651 des->tm_zone = src->tm_zone;
1654 static void __update_data_sidx(int idx)
1656 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1659 static void __update_data_eidx(int idx)
1661 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1664 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1666 regmatch_t pmatch[3];
1672 ret = regexec(®[6], str, 3, pmatch, 0);
1675 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1677 if (12 < td->tm_hour) {
1678 __vc_cmd_add_mday(td, 1);
1684 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1686 __vc_cmd_add_mday(td, 1);
1691 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1693 __update_data_sidx(pmatch[0].rm_so);
1694 __update_data_eidx(pmatch[0].rm_eo);
1697 return VC_ERROR_NONE;
1700 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1701 return VC_ERROR_NONE;
1704 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1706 regmatch_t pmatch[2];
1714 char *tempstr = NULL;
1717 ret = regexec(®[3], str, 1, pmatch, 0);
1719 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1722 sidx = pmatch[0].rm_so;
1723 eidx = pmatch[0].rm_eo;
1725 ret = regexec(®[4], str, 2, pmatch, 0);
1727 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1730 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1731 return VC_ERROR_OPERATION_FAILED;
1733 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1735 if (NULL == tempstr) {
1736 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1737 return VC_ERROR_OUT_OF_MEMORY;
1740 hour = atoi(tempstr);
1745 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1747 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1748 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1751 ret = regexec(®[5], str, 2, pmatch, 0);
1753 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1756 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1757 return VC_ERROR_OPERATION_FAILED;
1759 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1761 if (NULL == tempstr) {
1762 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1763 return VC_ERROR_OUT_OF_MEMORY;
1766 min = atoi(tempstr);
1771 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1773 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1774 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1777 if (hour < 0 && min < 0) {
1778 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1779 return VC_ERROR_NONE;
1782 hour = 0 > hour ? 0 : hour;
1783 min = 0 > min ? 0 : min;
1785 min = min + (hour * 60);
1787 __vc_cmd_add_min(td, min);
1790 __update_data_sidx(sidx);
1791 __update_data_eidx(eidx);
1794 return VC_ERROR_NONE;
1797 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1798 return VC_ERROR_NONE;
1801 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1803 regmatch_t pmatch[5];
1812 char *tempstr = NULL;
1815 ret = regexec(®[0], str, 5, pmatch, 0);
1817 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1821 sidx = pmatch[0].rm_so;
1822 eidx = pmatch[0].rm_eo;
1825 ret = regexec(®[1], str, 2, pmatch, 0);
1827 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1830 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1831 return VC_ERROR_OPERATION_FAILED;
1833 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1835 if (NULL == tempstr) {
1836 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1837 return VC_ERROR_OUT_OF_MEMORY;
1840 hour = atoi(tempstr);
1843 hour = hour + 12 * flag;
1845 if (12 == hour) hour = 0;
1846 else if (24 == hour) hour = 12;
1849 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1850 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1853 return VC_ERROR_NONE;
1859 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1861 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1862 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1863 } else if (0 < flag) {
1864 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1865 return VC_ERROR_NONE;
1868 ret = regexec(®[2], str, 2, pmatch, 0);
1871 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1873 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1875 if (NULL == tempstr) {
1876 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1877 return VC_ERROR_OUT_OF_MEMORY;
1880 min = atoi(tempstr);
1882 if (0 > min || 60 <= min) {
1883 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1886 return VC_ERROR_NONE;
1898 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1899 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1900 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1903 if (0 > hour && 0 > min) {
1904 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1905 return VC_ERROR_NONE;
1908 if (0 <= min && 0 <= hour) {
1909 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1913 } else if (0 <= min) {
1915 vc_config_mgr_get_default_language(&lang);
1917 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1918 return VC_ERROR_OPERATION_FAILED;
1921 if (!strcmp("en_US", lang)) {
1922 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1925 return VC_ERROR_NONE;
1927 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1934 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1942 __update_data_sidx(sidx);
1943 __update_data_eidx(eidx);
1946 return VC_ERROR_NONE;
1949 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1951 regmatch_t pmatch[10];
1957 ret = regexec(®[10], str, 5, pmatch, 0);
1959 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1961 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1963 td->tm_year = td_now.tm_year;
1964 td->tm_mon = td_now.tm_mon;
1965 td->tm_mday = td_now.tm_mday;
1967 __vc_cmd_add_mday(td, idx - 1);
1969 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1971 __update_data_sidx(pmatch[0].rm_so);
1972 __update_data_eidx(pmatch[0].rm_eo);
1975 return VC_ERROR_NONE;
1978 ret = regexec(®[11], str, 10, pmatch, 0);
1980 for (idx = 1; 10 > idx; idx++) {
1981 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1986 td->tm_year = td_now.tm_year;
1987 td->tm_mon = td_now.tm_mon;
1988 td->tm_mday = td_now.tm_mday;
1990 __vc_cmd_add_mday(td, idx + 1);
1992 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1994 __update_data_sidx(pmatch[0].rm_so);
1995 __update_data_eidx(pmatch[0].rm_eo);
1998 return VC_ERROR_NONE;
2001 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2002 return VC_ERROR_NONE;
2005 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2007 regmatch_t pmatch[13];
2018 char *tempstr = NULL;
2021 ret = regexec(®[9], str, 2, pmatch, 0);
2023 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2026 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2027 return VC_ERROR_OPERATION_FAILED;
2029 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2031 if (NULL == tempstr) {
2032 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2033 return VC_ERROR_OUT_OF_MEMORY;
2036 day = atoi(tempstr);
2041 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2043 sidx = pmatch[0].rm_so;
2044 eidx = pmatch[0].rm_eo;
2046 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2047 return VC_ERROR_NONE;
2050 ret = regexec(®[8], str, 13, pmatch, 0);
2052 for (idx = 1; 13 > idx; idx++) {
2053 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2063 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2065 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2066 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2069 vc_config_mgr_get_default_language(&lang);
2071 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2072 return VC_ERROR_OPERATION_FAILED;
2075 if (!strcmp("en_US", lang)) {
2076 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2079 return VC_ERROR_NONE;
2088 ret = regexec(®[7], str, 3, pmatch, 0);
2090 if (!m_flag) return -1;
2092 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2095 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2096 return VC_ERROR_OPERATION_FAILED;
2098 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2100 if (NULL == tempstr) {
2101 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2102 return VC_ERROR_OUT_OF_MEMORY;
2105 year = atoi(tempstr);
2106 year = 1900 < year ? year - 1900 : year + 100;
2112 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2114 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2115 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2120 if (0 > g_time_flag) {
2124 } else if (2 == g_time_flag) {
2125 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2126 return VC_ERROR_NONE;
2129 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2130 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2132 if (max_day[mon] < day || 1 > day) {
2133 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2134 return VC_ERROR_NONE;
2143 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2145 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2146 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2150 __update_data_sidx(sidx);
2151 __update_data_eidx(eidx);
2154 return VC_ERROR_NONE;
2157 static int __vc_cmd_time_check(const char *str, struct tm *td)
2159 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2164 ret = __vc_cmd_tphrase_check(str, td, &exist);
2168 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2170 } else if (VC_ERROR_NONE != ret) {
2171 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2175 ret = __vc_cmd_trelative_check(str, td, &exist);
2179 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2181 } else if (VC_ERROR_NONE != ret) {
2182 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2186 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2190 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2192 } else if (VC_ERROR_NONE != ret) {
2193 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2197 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2198 return VC_ERROR_NONE;
2201 static int __vc_cmd_date_check(const char *str, struct tm *td)
2203 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2208 ret = __vc_cmd_dphrase_check(str, td, &exist);
2212 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2214 } else if (VC_ERROR_NONE != ret) {
2215 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2219 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2223 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2225 } else if (VC_ERROR_NONE != ret) {
2226 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2230 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2231 return VC_ERROR_NONE;
2234 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2236 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2239 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2242 if (NULL == text || NULL == result || NULL == remain) {
2243 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2244 return VC_ERROR_INVALID_PARAMETER;
2248 ret = __vc_cmd_regex_init();
2249 if (VC_ERROR_NONE != ret) {
2250 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2254 g_data_sidx = g_data_eidx = -1;
2257 localtime_r(&t_now, &td_now);
2258 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2260 __copy_struct_tm(&td, &td_now);
2261 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2262 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);
2264 g_time_flag = g_date_flag = -1;
2266 ret = __vc_cmd_time_check(text, &td);
2267 if (VC_ERROR_NONE != ret) {
2268 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2272 ret = __vc_cmd_date_check(text, &td);
2273 if (VC_ERROR_NONE != ret) {
2274 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2278 __vc_cmd_regex_deinit(12);
2280 if (g_time_flag > 0 || g_date_flag > 0) {
2281 *result = mktime(&td);
2283 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2284 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2285 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);
2287 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2289 if (NULL == *remain) {
2290 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2291 return VC_ERROR_OUT_OF_MEMORY;
2294 strncpy(*remain, text, g_data_sidx);
2295 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2297 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2300 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2302 return VC_ERROR_NONE;