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 pthread_mutex_lock(&g_cynara_mutex);
140 if (false == g_privilege_allowed) {
142 ret = __check_privilege_initialize();
144 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
145 g_privilege_allowed = false;
146 pthread_mutex_unlock(&g_cynara_mutex);
147 return VC_ERROR_PERMISSION_DENIED;
151 snprintf(uid, 16, "%d", getuid());
153 ret = __check_privilege(uid, VC_PRIVILEGE);
154 __check_privilege_deinitialize();
156 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
157 g_privilege_allowed = false;
158 pthread_mutex_unlock(&g_cynara_mutex);
159 return VC_ERROR_PERMISSION_DENIED;
163 g_privilege_allowed = true;
164 pthread_mutex_unlock(&g_cynara_mutex);
165 return VC_ERROR_NONE;
168 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
170 if (0 != __vc_cmd_get_feature_enabled()) {
171 return VC_ERROR_NOT_SUPPORTED;
173 if (0 != __vc_cmd_check_privilege()) {
174 return VC_ERROR_PERMISSION_DENIED;
177 if (NULL == vc_cmd_list) {
178 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
179 return VC_ERROR_INVALID_PARAMETER;
182 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
185 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
186 return VC_ERROR_OUT_OF_MEMORY;
192 *vc_cmd_list = (vc_cmd_list_h)list;
194 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
196 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
198 return VC_ERROR_NONE;
201 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
203 if (0 != __vc_cmd_get_feature_enabled()) {
204 return VC_ERROR_NOT_SUPPORTED;
206 if (0 != __vc_cmd_check_privilege()) {
207 return VC_ERROR_PERMISSION_DENIED;
210 if (NULL == vc_cmd_list) {
211 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
212 return VC_ERROR_INVALID_PARAMETER;
215 vc_cmd_list_remove_all(vc_cmd_list, release_command);
217 vc_cmd_list_s* list = NULL;
218 list = (vc_cmd_list_s*)vc_cmd_list;
220 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
223 iter = g_list_find(g_cmdlist_list, list);
225 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
226 return VC_ERROR_INVALID_PARAMETER;
229 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
234 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
235 return VC_ERROR_NONE;
238 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
240 if (0 != __vc_cmd_get_feature_enabled()) {
241 return VC_ERROR_NOT_SUPPORTED;
243 if (0 != __vc_cmd_check_privilege()) {
244 return VC_ERROR_PERMISSION_DENIED;
247 if (NULL == vc_cmd_list || NULL == count) {
248 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
249 return VC_ERROR_INVALID_PARAMETER;
252 vc_cmd_list_s* list = NULL;
253 list = (vc_cmd_list_s*)vc_cmd_list;
255 *count = g_slist_length(list->list);
257 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
259 return VC_ERROR_NONE;
262 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
264 if (0 != __vc_cmd_get_feature_enabled()) {
265 return VC_ERROR_NOT_SUPPORTED;
267 if (0 != __vc_cmd_check_privilege()) {
268 return VC_ERROR_PERMISSION_DENIED;
271 if (NULL == vc_cmd_list || NULL == vc_command) {
272 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
273 return VC_ERROR_INVALID_PARAMETER;
276 vc_cmd_list_s* list = NULL;
277 list = (vc_cmd_list_s*)vc_cmd_list;
279 vc_cmd_s* cmd = NULL;
280 cmd = (vc_cmd_s*)vc_command;
282 list->list = g_slist_append(list->list, cmd);
284 if (1 == g_slist_length(list->list)) {
288 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
290 return VC_ERROR_NONE;
293 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
295 if (0 != __vc_cmd_get_feature_enabled()) {
296 return VC_ERROR_NOT_SUPPORTED;
298 if (0 != __vc_cmd_check_privilege()) {
299 return VC_ERROR_PERMISSION_DENIED;
302 if (NULL == vc_cmd_list || NULL == vc_command) {
303 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
304 return VC_ERROR_INVALID_PARAMETER;
307 vc_cmd_list_s* list = NULL;
308 list = (vc_cmd_list_s*)vc_cmd_list;
310 vc_cmd_s* cmd = NULL;
311 cmd = (vc_cmd_s*)vc_command;
313 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
316 iter = g_slist_find(list->list, cmd);
318 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy command : handle is not valid");
319 return VC_ERROR_INVALID_PARAMETER;
322 list->list = g_slist_remove_link(list->list, iter);
323 SLOG(LOG_DEBUG, TAG_VCCMD, "destroy command");
325 int len = g_slist_length(list->list);
328 else if (list->index == len)
329 list->index = len - 1;
331 return VC_ERROR_NONE;
334 static void __vc_cmd_list_remove_all_foreach(gpointer data, gpointer user_data)
336 vc_cmd_s *temp = NULL;
339 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp);
342 temp->command = NULL;
344 free(temp->parameter);
345 temp->parameter = NULL;
349 if (temp->invocation_name)
350 free(temp->invocation_name);
351 temp->invocation_name = NULL;
361 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
363 if (0 != __vc_cmd_get_feature_enabled()) {
364 return VC_ERROR_NOT_SUPPORTED;
366 if (0 != __vc_cmd_check_privilege()) {
367 return VC_ERROR_PERMISSION_DENIED;
370 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Destroy all command");
372 if (NULL == vc_cmd_list) {
373 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
374 return VC_ERROR_INVALID_PARAMETER;
377 vc_cmd_list_s* list = NULL;
378 list = (vc_cmd_list_s*)vc_cmd_list;
380 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
381 , list, release_command ? "true" : "false");
383 if (true == release_command)
384 g_slist_foreach(list->list, __vc_cmd_list_remove_all_foreach, NULL);
385 g_slist_free(list->list);
389 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
391 return VC_ERROR_NONE;
394 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
396 if (0 != __vc_cmd_get_feature_enabled()) {
397 return VC_ERROR_NOT_SUPPORTED;
399 if (0 != __vc_cmd_check_privilege()) {
400 return VC_ERROR_PERMISSION_DENIED;
403 if (NULL == vc_cmd_list) {
404 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
405 return VC_ERROR_INVALID_PARAMETER;
408 vc_cmd_list_s* list = NULL;
409 list = (vc_cmd_list_s*)vc_cmd_list;
412 iter = g_slist_nth(list->list, 0);
413 while (NULL != iter) {
414 vc_cmd_s *temp_cmd = NULL;
415 temp_cmd = iter->data;
416 if (NULL == temp_cmd) {
417 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
418 return VC_ERROR_OPERATION_FAILED;
420 if (false == callback((vc_cmd_h)temp_cmd, user_data))
423 iter = g_slist_next(iter);
426 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Foreach commands Done");
428 return VC_ERROR_NONE;
431 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
433 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Filter by type");
435 if (0 != __vc_cmd_get_feature_enabled()) {
436 return VC_ERROR_NOT_SUPPORTED;
438 if (0 != __vc_cmd_check_privilege()) {
439 return VC_ERROR_PERMISSION_DENIED;
442 if (NULL == original) {
443 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
444 return VC_ERROR_INVALID_PARAMETER;
447 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
448 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
449 return VC_ERROR_INVALID_PARAMETER;
452 vc_cmd_list_s* list = NULL;
453 list = (vc_cmd_list_s*)original;
455 vc_cmd_list_h temp_list;
456 if (0 != vc_cmd_list_create(&temp_list)) {
457 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
458 return VC_ERROR_OPERATION_FAILED;
462 iter = g_slist_nth(list->list, 0);
463 while (NULL != iter) {
464 vc_cmd_s *iter_cmd = NULL;
465 iter_cmd = iter->data;
466 if (NULL == iter_cmd) {
467 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
468 return VC_ERROR_OPERATION_FAILED;
472 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
473 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
477 if (iter_type == type) {
479 if (0 != vc_cmd_create(&temp_cmd)) {
480 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
484 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
485 if (NULL != iter_cmd->command)
486 ((vc_cmd_s *)temp_cmd)->command = strdup(iter_cmd->command);
487 if (NULL != iter_cmd->parameter)
488 ((vc_cmd_s *)temp_cmd)->parameter = strdup(iter_cmd->parameter);
490 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
491 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
492 vc_cmd_destroy(temp_cmd);
496 iter = g_slist_next(iter);
500 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
501 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
503 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
506 *filtered = temp_list;
508 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
510 return VC_ERROR_NONE;
513 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
515 if (0 != __vc_cmd_get_feature_enabled()) {
516 return VC_ERROR_NOT_SUPPORTED;
518 if (0 != __vc_cmd_check_privilege()) {
519 return VC_ERROR_PERMISSION_DENIED;
522 if (NULL == vc_cmd_list) {
523 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
524 return VC_ERROR_INVALID_PARAMETER;
527 vc_cmd_list_s* list = NULL;
528 list = (vc_cmd_list_s*)vc_cmd_list;
530 if (0 == g_slist_length(list->list)) {
531 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
532 return VC_ERROR_EMPTY;
537 return VC_ERROR_NONE;
540 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
542 if (0 != __vc_cmd_get_feature_enabled()) {
543 return VC_ERROR_NOT_SUPPORTED;
545 if (0 != __vc_cmd_check_privilege()) {
546 return VC_ERROR_PERMISSION_DENIED;
549 if (NULL == vc_cmd_list) {
550 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
551 return VC_ERROR_INVALID_PARAMETER;
554 vc_cmd_list_s* list = NULL;
555 list = (vc_cmd_list_s*)vc_cmd_list;
557 int count = g_slist_length(list->list);
560 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
561 return VC_ERROR_EMPTY;
563 list->index = count - 1;
564 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
567 return VC_ERROR_NONE;
570 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
572 if (0 != __vc_cmd_get_feature_enabled()) {
573 return VC_ERROR_NOT_SUPPORTED;
575 if (0 != __vc_cmd_check_privilege()) {
576 return VC_ERROR_PERMISSION_DENIED;
579 if (NULL == vc_cmd_list) {
580 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
581 return VC_ERROR_INVALID_PARAMETER;
584 vc_cmd_list_s* list = NULL;
585 list = (vc_cmd_list_s*)vc_cmd_list;
587 int count = g_slist_length(list->list);
589 if (list->index < count - 1) {
590 list->index = list->index + 1;
591 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
593 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
594 return VC_ERROR_ITERATION_END;
597 return VC_ERROR_NONE;
600 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
602 if (0 != __vc_cmd_get_feature_enabled()) {
603 return VC_ERROR_NOT_SUPPORTED;
605 if (0 != __vc_cmd_check_privilege()) {
606 return VC_ERROR_PERMISSION_DENIED;
609 if (NULL == vc_cmd_list) {
610 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
611 return VC_ERROR_INVALID_PARAMETER;
614 vc_cmd_list_s* list = NULL;
615 list = (vc_cmd_list_s*)vc_cmd_list;
617 if (list->index > 0) {
618 list->index = list->index - 1;
619 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
621 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
622 return VC_ERROR_ITERATION_END;
625 return VC_ERROR_NONE;
628 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
630 if (0 != __vc_cmd_get_feature_enabled()) {
631 return VC_ERROR_NOT_SUPPORTED;
633 if (0 != __vc_cmd_check_privilege()) {
634 return VC_ERROR_PERMISSION_DENIED;
637 if (NULL == vc_cmd_list || NULL == vc_command) {
638 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
639 return VC_ERROR_INVALID_PARAMETER;
642 vc_cmd_list_s* list = NULL;
643 list = (vc_cmd_list_s*)vc_cmd_list;
645 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
647 if (0 == g_slist_length(list->list)) {
648 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
650 return VC_ERROR_EMPTY;
653 vc_cmd_s *temp_cmd = NULL;
654 temp_cmd = g_slist_nth_data(list->list, list->index);
656 *vc_command = (vc_cmd_h)temp_cmd;
658 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
660 return VC_ERROR_NONE;
664 int vc_cmd_create(vc_cmd_h* vc_command)
666 if (0 != __vc_cmd_get_feature_enabled()) {
667 return VC_ERROR_NOT_SUPPORTED;
669 if (0 != __vc_cmd_check_privilege()) {
670 return VC_ERROR_PERMISSION_DENIED;
673 if (NULL == vc_command) {
674 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
675 return VC_ERROR_INVALID_PARAMETER;
678 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
680 if (NULL == command) {
681 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
682 return VC_ERROR_OUT_OF_MEMORY;
688 command->type = VC_COMMAND_TYPE_NONE;
689 command->format = VC_CMD_FORMAT_FIXED;
690 command->command = NULL;
691 command->parameter = NULL;
693 command->priority = 0;
694 command->key = VC_KEY_NONE;
695 command->modifier = VC_MODIFIER_NONE;
696 command->invocation_name = NULL;
697 command->appid = NULL;
698 command->fixed = NULL;
699 command->coordinates = NULL;
701 *vc_command = (vc_cmd_h)command;
703 g_cmd_list = g_list_append(g_cmd_list, command);
705 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
707 return VC_ERROR_NONE;
710 int vc_cmd_destroy(vc_cmd_h vc_command)
712 if (0 != __vc_cmd_get_feature_enabled()) {
713 return VC_ERROR_NOT_SUPPORTED;
715 if (0 != __vc_cmd_check_privilege()) {
716 return VC_ERROR_PERMISSION_DENIED;
719 if (NULL == vc_command) {
720 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
721 return VC_ERROR_INVALID_PARAMETER;
724 vc_cmd_s* command = NULL;
725 command = (vc_cmd_s*)vc_command;
727 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
730 iter = g_list_find(g_cmd_list, command);
732 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to command destroy : handle is not valid");
733 return VC_ERROR_INVALID_PARAMETER;
736 g_cmd_list = g_list_remove_link(g_cmd_list, iter);
738 if (command->command)
739 free(command->command);
740 command->command = NULL;
741 if (command->parameter)
742 free(command->parameter);
743 command->parameter = NULL;
744 if (command->invocation_name)
745 free(command->invocation_name);
746 command->invocation_name = NULL;
748 free(command->appid);
749 command->appid = NULL;
751 free(command->fixed);
752 command->fixed = NULL;
753 if (command->coordinates)
754 free(command->coordinates);
755 command->coordinates = NULL;
759 return VC_ERROR_NONE;
762 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
764 if (0 != __vc_cmd_get_feature_enabled()) {
765 return VC_ERROR_NOT_SUPPORTED;
767 if (0 != __vc_cmd_check_privilege()) {
768 return VC_ERROR_PERMISSION_DENIED;
771 if (NULL == vc_command) {
772 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
773 return VC_ERROR_INVALID_PARAMETER;
776 vc_cmd_s* cmd = NULL;
777 cmd = (vc_cmd_s*)vc_command;
780 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
785 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
787 if (0 != __vc_cmd_get_feature_enabled()) {
788 return VC_ERROR_NOT_SUPPORTED;
790 if (0 != __vc_cmd_check_privilege()) {
791 return VC_ERROR_PERMISSION_DENIED;
794 if (NULL == vc_command || NULL == id) {
795 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
796 return VC_ERROR_INVALID_PARAMETER;
799 vc_cmd_s* cmd = NULL;
800 cmd = (vc_cmd_s*)vc_command;
803 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
808 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
810 if (0 != __vc_cmd_get_feature_enabled()) {
811 return VC_ERROR_NOT_SUPPORTED;
814 if (NULL == vc_command) {
815 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
816 return VC_ERROR_INVALID_PARAMETER;
820 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
821 return VC_ERROR_INVALID_PARAMETER;
824 vc_cmd_s* cmd = NULL;
825 cmd = (vc_cmd_s*)vc_command;
830 cmd->appid = strdup(appid);
832 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
836 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
838 if (0 != __vc_cmd_get_feature_enabled()) {
839 return VC_ERROR_NOT_SUPPORTED;
842 if (NULL == vc_command || NULL == appid) {
843 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
844 return VC_ERROR_INVALID_PARAMETER;
847 vc_cmd_s* cmd = NULL;
848 cmd = (vc_cmd_s*)vc_command;
851 *appid = strdup(gettext(cmd->appid));
855 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
860 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
862 if (0 != __vc_cmd_get_feature_enabled()) {
863 return VC_ERROR_NOT_SUPPORTED;
865 if (0 != __vc_cmd_check_privilege()) {
866 return VC_ERROR_PERMISSION_DENIED;
869 if (NULL == vc_command) {
870 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
871 return VC_ERROR_INVALID_PARAMETER;
874 vc_cmd_s* cmd = NULL;
875 cmd = (vc_cmd_s*)vc_command;
880 cmd->command = strdup(command);
882 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
887 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
889 if (0 != __vc_cmd_get_feature_enabled()) {
890 return VC_ERROR_NOT_SUPPORTED;
892 if (0 != __vc_cmd_check_privilege()) {
893 return VC_ERROR_PERMISSION_DENIED;
896 if (NULL == vc_command || NULL == command) {
897 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
898 return VC_ERROR_INVALID_PARAMETER;
901 vc_cmd_s* cmd = NULL;
902 cmd = (vc_cmd_s*)vc_command;
905 *command = strdup(gettext(cmd->command));
909 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
914 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
916 if (0 != __vc_cmd_get_feature_enabled()) {
917 return VC_ERROR_NOT_SUPPORTED;
919 if (0 != __vc_cmd_check_privilege()) {
920 return VC_ERROR_PERMISSION_DENIED;
923 if (NULL == vc_command || NULL == command) {
924 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
925 return VC_ERROR_INVALID_PARAMETER;
928 vc_cmd_s* cmd = NULL;
929 cmd = (vc_cmd_s*)vc_command;
932 free(cmd->parameter);
933 cmd->parameter = NULL;
934 cmd->parameter = strdup(command);
935 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
940 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
942 if (0 != __vc_cmd_get_feature_enabled()) {
943 return VC_ERROR_NOT_SUPPORTED;
946 if (NULL == vc_command || NULL == command) {
947 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
948 return VC_ERROR_INVALID_PARAMETER;
951 vc_cmd_s* cmd = NULL;
952 cmd = (vc_cmd_s*)vc_command;
955 *command = strdup(gettext(cmd->parameter));
959 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
964 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
966 if (0 != __vc_cmd_get_feature_enabled()) {
967 return VC_ERROR_NOT_SUPPORTED;
970 if (NULL == vc_command) {
971 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
972 return VC_ERROR_INVALID_PARAMETER;
976 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
977 return VC_ERROR_INVALID_PARAMETER;
980 vc_cmd_s* cmd = NULL;
981 cmd = (vc_cmd_s*)vc_command;
986 cmd->fixed = strdup(fixed);
988 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
992 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
994 if (0 != __vc_cmd_get_feature_enabled()) {
995 return VC_ERROR_NOT_SUPPORTED;
998 if (NULL == vc_command || NULL == fixed) {
999 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1000 return VC_ERROR_INVALID_PARAMETER;
1003 vc_cmd_s* cmd = NULL;
1004 cmd = (vc_cmd_s*)vc_command;
1007 *fixed = strdup(gettext(cmd->fixed));
1011 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1016 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1018 if (0 != __vc_cmd_get_feature_enabled()) {
1019 return VC_ERROR_NOT_SUPPORTED;
1022 if (NULL == vc_command) {
1023 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1024 return VC_ERROR_INVALID_PARAMETER;
1027 if (NULL == invocation_name) {
1028 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1029 return VC_ERROR_INVALID_PARAMETER;
1032 vc_cmd_s* cmd = NULL;
1033 cmd = (vc_cmd_s*)vc_command;
1035 if (cmd->invocation_name)
1036 free(cmd->invocation_name);
1037 cmd->invocation_name = NULL;
1038 cmd->invocation_name = strdup(invocation_name);
1040 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1044 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1046 if (0 != __vc_cmd_get_feature_enabled()) {
1047 return VC_ERROR_NOT_SUPPORTED;
1050 if (NULL == vc_command || NULL == invocation_name) {
1051 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1052 return VC_ERROR_INVALID_PARAMETER;
1055 vc_cmd_s* cmd = NULL;
1056 cmd = (vc_cmd_s*)vc_command;
1058 if (cmd->invocation_name)
1059 *invocation_name = strdup(gettext(cmd->invocation_name));
1061 *invocation_name = NULL;
1063 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1067 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1069 if (0 != __vc_cmd_get_feature_enabled()) {
1070 return VC_ERROR_NOT_SUPPORTED;
1072 if (0 != __vc_cmd_check_privilege()) {
1073 return VC_ERROR_PERMISSION_DENIED;
1076 if (NULL == vc_command) {
1077 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1078 return VC_ERROR_INVALID_PARAMETER;
1081 vc_cmd_s* cmd = NULL;
1082 cmd = (vc_cmd_s*)vc_command;
1086 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1091 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1093 if (0 != __vc_cmd_get_feature_enabled()) {
1094 return VC_ERROR_NOT_SUPPORTED;
1096 if (0 != __vc_cmd_check_privilege()) {
1097 return VC_ERROR_PERMISSION_DENIED;
1100 if (NULL == vc_command || NULL == type) {
1101 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1102 return VC_ERROR_INVALID_PARAMETER;
1105 vc_cmd_s* cmd = NULL;
1106 cmd = (vc_cmd_s*)vc_command;
1110 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1115 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1117 if (0 != __vc_cmd_get_feature_enabled()) {
1118 return VC_ERROR_NOT_SUPPORTED;
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;
1129 cmd->format = format;
1131 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1136 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1138 if (0 != __vc_cmd_get_feature_enabled()) {
1139 return VC_ERROR_NOT_SUPPORTED;
1142 if (NULL == vc_command || NULL == format) {
1143 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1144 return VC_ERROR_INVALID_PARAMETER;
1147 vc_cmd_s* cmd = NULL;
1148 cmd = (vc_cmd_s*)vc_command;
1150 *format = cmd->format;
1152 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1157 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1159 if (0 != __vc_cmd_get_feature_enabled()) {
1160 return VC_ERROR_NOT_SUPPORTED;
1162 if (0 != __vc_cmd_check_privilege()) {
1163 return VC_ERROR_PERMISSION_DENIED;
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;
1176 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1181 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1183 if (0 != __vc_cmd_get_feature_enabled()) {
1184 return VC_ERROR_NOT_SUPPORTED;
1186 if (0 != __vc_cmd_check_privilege()) {
1187 return VC_ERROR_PERMISSION_DENIED;
1190 if (NULL == vc_command || NULL == pid) {
1191 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1192 return VC_ERROR_INVALID_PARAMETER;
1195 vc_cmd_s* cmd = NULL;
1196 cmd = (vc_cmd_s*)vc_command;
1200 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1205 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1207 if (0 != __vc_cmd_get_feature_enabled()) {
1208 return VC_ERROR_NOT_SUPPORTED;
1210 if (0 != __vc_cmd_check_privilege()) {
1211 return VC_ERROR_PERMISSION_DENIED;
1214 if (NULL == vc_command) {
1215 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1216 return VC_ERROR_INVALID_PARAMETER;
1219 vc_cmd_s* cmd = NULL;
1220 cmd = (vc_cmd_s*)vc_command;
1222 cmd->domain = domain;
1224 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1229 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1231 if (0 != __vc_cmd_get_feature_enabled()) {
1232 return VC_ERROR_NOT_SUPPORTED;
1234 if (0 != __vc_cmd_check_privilege()) {
1235 return VC_ERROR_PERMISSION_DENIED;
1238 if (NULL == vc_command || NULL == domain) {
1239 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1240 return VC_ERROR_INVALID_PARAMETER;
1243 vc_cmd_s* cmd = NULL;
1244 cmd = (vc_cmd_s*)vc_command;
1246 *domain = cmd->domain;
1248 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1254 * @brief Sets key value of command.
1256 * @param[in] vc_command Command handle
1257 * @param[in] key key value
1258 * @param[in] modifier modifier value
1260 * @return 0 on success, otherwise a negative error value
1261 * @retval #VC_ERROR_NONE Successful
1262 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1264 * @see vc_cmd_get_result_key()
1266 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1268 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Set result key");
1270 if (NULL == vc_command) {
1271 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1272 return VC_ERROR_INVALID_PARAMETER;
1275 vc_cmd_s* cmd = NULL;
1276 cmd = (vc_cmd_s*)vc_command;
1278 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1281 cmd->modifier = modifier;
1283 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1289 * @brief Gets key value of command.
1291 * @param[in] vc_command Command handle
1292 * @param[out] key key value
1293 * @param[out] modifier modifier value
1295 * @return 0 on success, otherwise a negative error value
1296 * @retval #VC_ERROR_NONE Successful
1297 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1299 * @see vc_cmd_add_result_key()
1301 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1303 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get result key");
1305 if (NULL == vc_command || NULL == key || NULL == modifier) {
1306 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1307 return VC_ERROR_INVALID_PARAMETER;
1310 vc_cmd_s* cmd = NULL;
1311 cmd = (vc_cmd_s*)vc_command;
1314 *modifier = cmd->modifier;
1316 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1321 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1323 if (NULL == vc_cmd_list) {
1327 vc_cmd_list_s* list = NULL;
1328 list = (vc_cmd_list_s*)vc_cmd_list;
1330 SLOG(LOG_DEBUG, TAG_VCCMD, "@ Command List @");
1331 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1334 GSList *iter = NULL;
1335 iter = g_slist_nth(list->list, 0);
1336 while (NULL != iter) {
1337 vc_cmd_s *cmd = NULL;
1340 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
1341 return VC_ERROR_OPERATION_FAILED;
1343 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)",
1344 i++, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1346 iter = g_slist_next(iter);
1349 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1354 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1356 if (0 != __vc_cmd_get_feature_enabled()) {
1357 return VC_ERROR_NOT_SUPPORTED;
1360 if (NULL == vc_cmd || NULL == json) {
1361 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1362 return VC_ERROR_INVALID_PARAMETER;
1365 vc_cmd_s* cmd = NULL;
1366 cmd = (vc_cmd_s*)vc_cmd;
1368 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1369 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1370 return VC_ERROR_INVALID_PARAMETER;
1373 if (0 != vc_info_parser_get_nlu_result(json)) {
1374 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1375 return VC_ERROR_OPERATION_FAILED;
1381 static void __vc_cmd_regex_deinit(int num_regex)
1383 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start Deinitialize regex @@@");
1386 for (i = 0; num_regex > i; i++) {
1390 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1393 static int __vc_cmd_regex_init()
1395 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Initialize regular expression @@@");
1397 int cflags = REG_EXTENDED | REG_ICASE;
1403 vc_config_mgr_get_default_language(&lang);
1405 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1406 return VC_ERROR_OPERATION_FAILED;
1409 if (!strcmp("en_US", lang)) {
1411 } else if (!strcmp("ko_KR", lang)) {
1417 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1418 return VC_ERROR_INVALID_LANGUAGE;
1424 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ lang type > %d @@@", lang_type);
1426 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1428 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1429 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1431 regerror(ret, ®[0], errStr, sizeof(errStr));
1433 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1434 return VC_ERROR_OPERATION_FAILED;
1437 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1438 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1440 regerror(ret, ®[1], errStr, sizeof(errStr));
1441 __vc_cmd_regex_deinit(1);
1443 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1444 return VC_ERROR_OPERATION_FAILED;
1447 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1448 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1450 regerror(ret, ®[2], errStr, sizeof(errStr));
1451 __vc_cmd_regex_deinit(2);
1453 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1454 return VC_ERROR_OPERATION_FAILED;
1457 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1458 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1460 regerror(ret, ®[3], errStr, sizeof(errStr));
1461 __vc_cmd_regex_deinit(3);
1463 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1464 return VC_ERROR_OPERATION_FAILED;
1467 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1468 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1470 regerror(ret, ®[4], errStr, sizeof(errStr));
1471 __vc_cmd_regex_deinit(4);
1473 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1474 return VC_ERROR_OPERATION_FAILED;
1477 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1478 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1480 regerror(ret, ®[5], errStr, sizeof(errStr));
1481 __vc_cmd_regex_deinit(5);
1483 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1484 return VC_ERROR_OPERATION_FAILED;
1487 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1488 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1490 regerror(ret, ®[6], errStr, sizeof(errStr));
1491 __vc_cmd_regex_deinit(6);
1493 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1494 return VC_ERROR_OPERATION_FAILED;
1497 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1498 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1500 regerror(ret, ®[7], errStr, sizeof(errStr));
1501 __vc_cmd_regex_deinit(7);
1503 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1504 return VC_ERROR_OPERATION_FAILED;
1507 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1508 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1510 regerror(ret, ®[8], errStr, sizeof(errStr));
1511 __vc_cmd_regex_deinit(8);
1513 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1514 return VC_ERROR_OPERATION_FAILED;
1517 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1518 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1520 regerror(ret, ®[9], errStr, sizeof(errStr));
1521 __vc_cmd_regex_deinit(9);
1523 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1524 return VC_ERROR_OPERATION_FAILED;
1527 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1528 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1530 regerror(ret, ®[10], errStr, sizeof(errStr));
1531 __vc_cmd_regex_deinit(10);
1533 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1534 return VC_ERROR_OPERATION_FAILED;
1537 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1538 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1540 regerror(ret, ®[11], errStr, sizeof(errStr));
1541 __vc_cmd_regex_deinit(11);
1543 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1544 return VC_ERROR_OPERATION_FAILED;
1547 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
1549 return VC_ERROR_NONE;
1552 static void __vc_cmd_add_year(struct tm *td, int year)
1554 td->tm_year += year;
1557 static void __vc_cmd_add_mon(struct tm *td, int mon)
1561 mon = td->tm_mon + mon;
1565 __vc_cmd_add_year(td, year);
1568 td->tm_mon = mon % 12;
1571 static void __vc_cmd_add_mday(struct tm *td, int mday)
1573 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1574 int year = td->tm_year + 1900;
1578 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1580 mday = td->tm_mday + mday;
1582 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1583 mday -= max_day[mon % 12];
1585 if (11 == mon % 12) {
1588 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1596 mon = mon - td->tm_mon;
1599 __vc_cmd_add_mon(td, mon);
1605 static void __vc_cmd_add_hour(struct tm *td, int hour)
1609 hour = td->tm_hour + hour;
1613 __vc_cmd_add_mday(td, day);
1616 td->tm_hour = hour % 24;
1619 static void __vc_cmd_add_min(struct tm *td, int min)
1623 min = td->tm_min + min;
1627 __vc_cmd_add_hour(td, hour);
1630 td->tm_min = min % 60;
1633 static void __copy_struct_tm(struct tm *des, struct tm *src)
1635 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Start to copy struct tm @@@");
1637 des->tm_sec = src->tm_sec;
1638 des->tm_min = src->tm_min;
1639 des->tm_hour = src->tm_hour;
1640 des->tm_mday = src->tm_mday;
1641 des->tm_mon = src->tm_mon;
1642 des->tm_year = src->tm_year;
1643 des->tm_wday = src->tm_wday;
1644 des->tm_yday = src->tm_yday;
1645 des->tm_isdst = src->tm_isdst;
1647 des->tm_gmtoff = src->tm_gmtoff;
1648 des->tm_zone = src->tm_zone;
1651 static void __update_data_sidx(int idx)
1653 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1656 static void __update_data_eidx(int idx)
1658 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1661 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1663 regmatch_t pmatch[3];
1669 ret = regexec(®[6], str, 3, pmatch, 0);
1672 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1674 if (12 < td->tm_hour) {
1675 __vc_cmd_add_mday(td, 1);
1681 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1683 __vc_cmd_add_mday(td, 1);
1688 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1690 __update_data_sidx(pmatch[0].rm_so);
1691 __update_data_eidx(pmatch[0].rm_eo);
1694 return VC_ERROR_NONE;
1697 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1698 return VC_ERROR_NONE;
1701 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1703 regmatch_t pmatch[2];
1711 char *tempstr = NULL;
1714 ret = regexec(®[3], str, 1, pmatch, 0);
1716 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1719 sidx = pmatch[0].rm_so;
1720 eidx = pmatch[0].rm_eo;
1722 ret = regexec(®[4], str, 2, pmatch, 0);
1724 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1727 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1728 return VC_ERROR_OPERATION_FAILED;
1730 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1732 if (NULL == tempstr) {
1733 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1734 return VC_ERROR_OUT_OF_MEMORY;
1737 hour = atoi(tempstr);
1742 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1744 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1745 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1748 ret = regexec(®[5], str, 2, pmatch, 0);
1750 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1753 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1754 return VC_ERROR_OPERATION_FAILED;
1756 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1758 if (NULL == tempstr) {
1759 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1760 return VC_ERROR_OUT_OF_MEMORY;
1763 min = atoi(tempstr);
1768 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1770 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1771 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1774 if (hour < 0 && min < 0) {
1775 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1776 return VC_ERROR_NONE;
1779 hour = 0 > hour ? 0 : hour;
1780 min = 0 > min ? 0 : min;
1782 min = min + (hour * 60);
1784 __vc_cmd_add_min(td, min);
1787 __update_data_sidx(sidx);
1788 __update_data_eidx(eidx);
1791 return VC_ERROR_NONE;
1794 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1795 return VC_ERROR_NONE;
1798 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1800 regmatch_t pmatch[5];
1809 char *tempstr = NULL;
1812 ret = regexec(®[0], str, 5, pmatch, 0);
1814 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1818 sidx = pmatch[0].rm_so;
1819 eidx = pmatch[0].rm_eo;
1822 ret = regexec(®[1], str, 2, pmatch, 0);
1824 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1827 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1828 return VC_ERROR_OPERATION_FAILED;
1830 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1832 if (NULL == tempstr) {
1833 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1834 return VC_ERROR_OUT_OF_MEMORY;
1837 hour = atoi(tempstr);
1840 hour = hour + 12 * flag;
1842 if (12 == hour) hour = 0;
1843 else if (24 == hour) hour = 12;
1846 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1847 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1850 return VC_ERROR_NONE;
1856 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1858 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1859 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1860 } else if (0 < flag) {
1861 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1862 return VC_ERROR_NONE;
1865 ret = regexec(®[2], str, 2, pmatch, 0);
1868 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1870 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1872 if (NULL == tempstr) {
1873 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1874 return VC_ERROR_OUT_OF_MEMORY;
1877 min = atoi(tempstr);
1879 if (0 > min || 60 <= min) {
1880 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1883 return VC_ERROR_NONE;
1895 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1896 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1897 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1900 if (0 > hour && 0 > min) {
1901 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1902 return VC_ERROR_NONE;
1905 if (0 <= min && 0 <= hour) {
1906 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1910 } else if (0 <= min) {
1912 vc_config_mgr_get_default_language(&lang);
1914 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1915 return VC_ERROR_OPERATION_FAILED;
1918 if (!strcmp("en_US", lang)) {
1919 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
1922 return VC_ERROR_NONE;
1924 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1931 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1939 __update_data_sidx(sidx);
1940 __update_data_eidx(eidx);
1943 return VC_ERROR_NONE;
1946 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1948 regmatch_t pmatch[10];
1954 ret = regexec(®[10], str, 5, pmatch, 0);
1956 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1958 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1960 td->tm_year = td_now.tm_year;
1961 td->tm_mon = td_now.tm_mon;
1962 td->tm_mday = td_now.tm_mday;
1964 __vc_cmd_add_mday(td, idx - 1);
1966 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1968 __update_data_sidx(pmatch[0].rm_so);
1969 __update_data_eidx(pmatch[0].rm_eo);
1972 return VC_ERROR_NONE;
1975 ret = regexec(®[11], str, 10, pmatch, 0);
1977 for (idx = 1; 10 > idx; idx++) {
1978 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1983 td->tm_year = td_now.tm_year;
1984 td->tm_mon = td_now.tm_mon;
1985 td->tm_mday = td_now.tm_mday;
1987 __vc_cmd_add_mday(td, idx + 1);
1989 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1991 __update_data_sidx(pmatch[0].rm_so);
1992 __update_data_eidx(pmatch[0].rm_eo);
1995 return VC_ERROR_NONE;
1998 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1999 return VC_ERROR_NONE;
2002 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2004 regmatch_t pmatch[13];
2015 char *tempstr = NULL;
2018 ret = regexec(®[9], str, 2, pmatch, 0);
2020 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2023 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2024 return VC_ERROR_OPERATION_FAILED;
2026 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2028 if (NULL == tempstr) {
2029 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2030 return VC_ERROR_OUT_OF_MEMORY;
2033 day = atoi(tempstr);
2038 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2040 sidx = pmatch[0].rm_so;
2041 eidx = pmatch[0].rm_eo;
2043 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2044 return VC_ERROR_NONE;
2047 ret = regexec(®[8], str, 13, pmatch, 0);
2049 for (idx = 1; 13 > idx; idx++) {
2050 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2060 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2062 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2063 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2066 vc_config_mgr_get_default_language(&lang);
2068 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2069 return VC_ERROR_OPERATION_FAILED;
2072 if (!strcmp("en_US", lang)) {
2073 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2076 return VC_ERROR_NONE;
2085 ret = regexec(®[7], str, 3, pmatch, 0);
2087 if (!m_flag) return -1;
2089 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2092 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2093 return VC_ERROR_OPERATION_FAILED;
2095 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2097 if (NULL == tempstr) {
2098 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2099 return VC_ERROR_OUT_OF_MEMORY;
2102 year = atoi(tempstr);
2103 year = 1900 < year ? year - 1900 : year + 100;
2109 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2111 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2112 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2117 if (0 > g_time_flag) {
2121 } else if (2 == g_time_flag) {
2122 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2123 return VC_ERROR_NONE;
2126 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2127 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2129 if (max_day[mon] < day || 1 > day) {
2130 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incoming sentence is weird");
2131 return VC_ERROR_NONE;
2140 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2142 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2143 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2147 __update_data_sidx(sidx);
2148 __update_data_eidx(eidx);
2151 return VC_ERROR_NONE;
2154 static int __vc_cmd_time_check(const char *str, struct tm *td)
2156 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check time value in string \"%s\"", str);
2161 ret = __vc_cmd_tphrase_check(str, td, &exist);
2165 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2167 } else if (VC_ERROR_NONE != ret) {
2168 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2172 ret = __vc_cmd_trelative_check(str, td, &exist);
2176 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2178 } else if (VC_ERROR_NONE != ret) {
2179 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2183 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2187 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Time value is exist");
2189 } else if (VC_ERROR_NONE != ret) {
2190 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2194 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no time value");
2195 return VC_ERROR_NONE;
2198 static int __vc_cmd_date_check(const char *str, struct tm *td)
2200 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Check date value in string \"%s\"", str);
2205 ret = __vc_cmd_dphrase_check(str, td, &exist);
2209 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2211 } else if (VC_ERROR_NONE != ret) {
2212 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2216 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2220 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Date value is exist");
2222 } else if (VC_ERROR_NONE != ret) {
2223 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred > (%d)", ret);
2227 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ There is no date value");
2228 return VC_ERROR_NONE;
2231 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2233 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@ Get timestamp data");
2236 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2239 if (NULL == text || NULL == result || NULL == remain) {
2240 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2241 return VC_ERROR_INVALID_PARAMETER;
2245 ret = __vc_cmd_regex_init();
2246 if (VC_ERROR_NONE != ret) {
2247 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2251 g_data_sidx = g_data_eidx = -1;
2254 localtime_r(&t_now, &td_now);
2255 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2257 __copy_struct_tm(&td, &td_now);
2258 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2259 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);
2261 g_time_flag = g_date_flag = -1;
2263 ret = __vc_cmd_time_check(text, &td);
2264 if (VC_ERROR_NONE != ret) {
2265 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2269 ret = __vc_cmd_date_check(text, &td);
2270 if (VC_ERROR_NONE != ret) {
2271 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occurred in the check > (%d)", ret);
2275 __vc_cmd_regex_deinit(12);
2277 if (g_time_flag > 0 || g_date_flag > 0) {
2278 *result = mktime(&td);
2280 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2281 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2282 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);
2284 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2286 if (NULL == *remain) {
2287 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2288 return VC_ERROR_OUT_OF_MEMORY;
2291 strncpy(*remain, text, g_data_sidx);
2292 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2294 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2297 SLOG(LOG_DEBUG, TAG_VCCMD, "@@@");
2299 return VC_ERROR_NONE;