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;
38 static int g_privilege_allowed = 1; /* Always True */
39 static cynara *p_cynara = NULL;
41 // For getting timestamp using regular expression
42 static regex_t reg[MAX_NUM_REGEX];
43 static time_t t_now; //time_t is based on UTC
44 static struct tm td_now; //if use localtime function, the value follows the local time zone, otherwise it follows the UTC.
46 static int g_time_flag;
47 static int g_date_flag;
49 static int g_data_sidx;
50 static int g_data_eidx;
52 static int __vc_cmd_get_feature_enabled()
54 if (0 == g_feature_enabled) {
55 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
56 return VC_ERROR_NOT_SUPPORTED;
57 } else if (-1 == g_feature_enabled) {
58 bool vc_supported = false;
59 bool mic_supported = false;
60 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
61 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
62 if (false == vc_supported || false == mic_supported) {
63 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
64 g_feature_enabled = 0;
65 return VC_ERROR_NOT_SUPPORTED;
68 g_feature_enabled = 1;
70 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
71 return VC_ERROR_NOT_SUPPORTED;
74 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
75 return VC_ERROR_NOT_SUPPORTED;
82 static int __check_privilege_initialize()
84 int ret = cynara_initialize(&p_cynara, NULL);
85 if (CYNARA_API_SUCCESS != ret)
86 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
88 return ret == CYNARA_API_SUCCESS;
91 static int __check_privilege(const char* uid, const char * privilege)
94 char label_path[1024] = "/proc/self/attr/current";
95 char smack_label[1024] = {'\0',};
101 fp = fopen(label_path, "r");
103 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
104 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
109 pid_t pid = getpid();
110 char *session = cynara_session_from_pid(pid);
111 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
112 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
116 if (ret != CYNARA_API_ACCESS_ALLOWED)
121 static void __check_privilege_deinitialize()
124 cynara_finish(p_cynara);
128 static int __vc_cmd_check_privilege()
132 if (0 == g_privilege_allowed) {
133 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
134 return VC_ERROR_PERMISSION_DENIED;
135 } else if (-1 == g_privilege_allowed) {
136 if (false == __check_privilege_initialize()) {
137 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
138 return VC_ERROR_PERMISSION_DENIED;
140 snprintf(uid, 16, "%d", getuid());
141 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
142 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
143 g_privilege_allowed = 0;
144 __check_privilege_deinitialize();
145 return VC_ERROR_PERMISSION_DENIED;
147 __check_privilege_deinitialize();
150 g_privilege_allowed = 1;
152 return VC_ERROR_NONE;
155 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
157 if (0 != __vc_cmd_get_feature_enabled()) {
158 return VC_ERROR_NOT_SUPPORTED;
160 if (0 != __vc_cmd_check_privilege()) {
161 return VC_ERROR_PERMISSION_DENIED;
164 if (NULL == vc_cmd_list) {
165 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
166 return VC_ERROR_INVALID_PARAMETER;
169 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
172 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
173 return VC_ERROR_OUT_OF_MEMORY;
179 *vc_cmd_list = (vc_cmd_list_h)list;
181 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
183 return VC_ERROR_NONE;
186 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
188 if (0 != __vc_cmd_get_feature_enabled()) {
189 return VC_ERROR_NOT_SUPPORTED;
191 if (0 != __vc_cmd_check_privilege()) {
192 return VC_ERROR_PERMISSION_DENIED;
195 if (NULL == vc_cmd_list) {
196 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
197 return VC_ERROR_INVALID_PARAMETER;
200 vc_cmd_list_remove_all(vc_cmd_list, release_command);
202 vc_cmd_list_s* list = NULL;
203 list = (vc_cmd_list_s*)vc_cmd_list;
205 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
212 return VC_ERROR_NONE;
215 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
217 if (0 != __vc_cmd_get_feature_enabled()) {
218 return VC_ERROR_NOT_SUPPORTED;
220 if (0 != __vc_cmd_check_privilege()) {
221 return VC_ERROR_PERMISSION_DENIED;
224 if (NULL == vc_cmd_list || NULL == count) {
225 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
226 return VC_ERROR_INVALID_PARAMETER;
229 vc_cmd_list_s* list = NULL;
230 list = (vc_cmd_list_s*)vc_cmd_list;
232 *count = g_slist_length(list->list);
234 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
236 return VC_ERROR_NONE;
239 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
241 if (0 != __vc_cmd_get_feature_enabled()) {
242 return VC_ERROR_NOT_SUPPORTED;
244 if (0 != __vc_cmd_check_privilege()) {
245 return VC_ERROR_PERMISSION_DENIED;
248 if (NULL == vc_cmd_list || NULL == vc_command) {
249 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
250 return VC_ERROR_INVALID_PARAMETER;
253 vc_cmd_list_s* list = NULL;
254 list = (vc_cmd_list_s*)vc_cmd_list;
256 vc_cmd_s* cmd = NULL;
257 cmd = (vc_cmd_s*)vc_command;
259 list->list = g_slist_append(list->list, cmd);
261 if (1 == g_slist_length(list->list)) {
265 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
267 return VC_ERROR_NONE;
270 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
272 if (0 != __vc_cmd_get_feature_enabled()) {
273 return VC_ERROR_NOT_SUPPORTED;
275 if (0 != __vc_cmd_check_privilege()) {
276 return VC_ERROR_PERMISSION_DENIED;
279 if (NULL == vc_cmd_list || NULL == vc_command) {
280 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
281 return VC_ERROR_INVALID_PARAMETER;
284 vc_cmd_list_s* list = NULL;
285 list = (vc_cmd_list_s*)vc_cmd_list;
287 vc_cmd_s* cmd = NULL;
288 cmd = (vc_cmd_s*)vc_command;
290 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
292 vc_cmd_s* temp_cmd = NULL;
295 iter = g_slist_nth(list->list, 0);
297 while (NULL != iter) {
298 temp_cmd = iter->data;
300 if (NULL != temp_cmd && cmd == temp_cmd) {
301 list->list = g_slist_remove(list->list, temp_cmd);
303 if (true == release_command) {
304 SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data");
305 if (NULL != temp_cmd->command) free(temp_cmd->command);
306 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
313 iter = g_slist_next(iter);
316 int count = g_slist_length(list->list);
320 } else if (list->index == count) {
321 list->index = count - 1;
324 return VC_ERROR_NONE;
327 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
329 if (0 != __vc_cmd_get_feature_enabled()) {
330 return VC_ERROR_NOT_SUPPORTED;
332 if (0 != __vc_cmd_check_privilege()) {
333 return VC_ERROR_PERMISSION_DENIED;
336 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Destroy all command");
338 if (NULL == vc_cmd_list) {
339 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
340 return VC_ERROR_INVALID_PARAMETER;
343 vc_cmd_list_s* list = NULL;
344 list = (vc_cmd_list_s*)vc_cmd_list;
346 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
347 , list, release_command ? "true" : "false");
349 int count = g_slist_length(list->list);
354 for (i = 0; i < count ; i++) {
355 temp_cmd = g_slist_nth_data(list->list, 0);
357 if (NULL != temp_cmd) {
358 list->list = g_slist_remove(list->list, temp_cmd);
360 if (true == release_command) {
361 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd);
362 if (NULL != temp_cmd->command) free(temp_cmd->command);
363 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
364 if (NULL != temp_cmd->appid) free(temp_cmd->appid);
365 if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name);
366 if (NULL != temp_cmd->fixed) free(temp_cmd->fixed);
375 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
376 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
378 return VC_ERROR_NONE;
381 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
383 if (0 != __vc_cmd_get_feature_enabled()) {
384 return VC_ERROR_NOT_SUPPORTED;
386 if (0 != __vc_cmd_check_privilege()) {
387 return VC_ERROR_PERMISSION_DENIED;
390 if (NULL == vc_cmd_list) {
391 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
392 return VC_ERROR_INVALID_PARAMETER;
395 vc_cmd_list_s* list = NULL;
396 list = (vc_cmd_list_s*)vc_cmd_list;
398 int count = g_slist_length(list->list);
404 iter = g_slist_nth(list->list, 0);
406 for (i = 0; i < count; i++) {
408 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
409 return VC_ERROR_OPERATION_FAILED;
412 temp_cmd = iter->data;
414 if (NULL != temp_cmd) {
415 if (false == callback((vc_cmd_h)temp_cmd, user_data)) {
420 iter = g_slist_next(iter);
423 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Foreach commands Done");
425 return VC_ERROR_NONE;
428 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
430 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Filter by type");
432 if (0 != __vc_cmd_get_feature_enabled()) {
433 return VC_ERROR_NOT_SUPPORTED;
435 if (0 != __vc_cmd_check_privilege()) {
436 return VC_ERROR_PERMISSION_DENIED;
439 if (NULL == original) {
440 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
441 return VC_ERROR_INVALID_PARAMETER;
444 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
445 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
446 return VC_ERROR_INVALID_PARAMETER;
449 vc_cmd_list_s* list = NULL;
450 list = (vc_cmd_list_s*)original;
452 vc_cmd_list_h temp_list;
453 if (0 != vc_cmd_list_create(&temp_list)) {
454 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
455 return VC_ERROR_OPERATION_FAILED;
458 int count = g_slist_length(list->list);
464 iter = g_slist_nth(list->list, 0);
466 for (i = 0; i < count; i++) {
468 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
469 return VC_ERROR_OPERATION_FAILED;
471 if (NULL != iter->data) {
472 iter_cmd = iter->data;
474 if (NULL != iter_cmd) {
476 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
477 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
481 if (iter_type == type) {
483 if (0 != vc_cmd_create(&temp_cmd)) {
484 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
488 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
489 if (NULL != iter_cmd->command) {
490 ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
492 if (NULL != iter_cmd->parameter) {
493 ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
496 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
497 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
498 vc_cmd_destroy(temp_cmd);
504 iter = g_slist_next(iter);
508 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
509 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
511 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
514 *filtered = temp_list;
516 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
518 return VC_ERROR_NONE;
521 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
523 if (0 != __vc_cmd_get_feature_enabled()) {
524 return VC_ERROR_NOT_SUPPORTED;
526 if (0 != __vc_cmd_check_privilege()) {
527 return VC_ERROR_PERMISSION_DENIED;
530 if (NULL == vc_cmd_list) {
531 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
532 return VC_ERROR_INVALID_PARAMETER;
535 vc_cmd_list_s* list = NULL;
536 list = (vc_cmd_list_s*)vc_cmd_list;
538 if (0 == g_slist_length(list->list)) {
539 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
540 return VC_ERROR_EMPTY;
545 return VC_ERROR_NONE;
548 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
550 if (0 != __vc_cmd_get_feature_enabled()) {
551 return VC_ERROR_NOT_SUPPORTED;
553 if (0 != __vc_cmd_check_privilege()) {
554 return VC_ERROR_PERMISSION_DENIED;
557 if (NULL == vc_cmd_list) {
558 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
559 return VC_ERROR_INVALID_PARAMETER;
562 vc_cmd_list_s* list = NULL;
563 list = (vc_cmd_list_s*)vc_cmd_list;
565 int count = g_slist_length(list->list);
568 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
569 return VC_ERROR_EMPTY;
571 list->index = count - 1;
572 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
575 return VC_ERROR_NONE;
578 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
580 if (0 != __vc_cmd_get_feature_enabled()) {
581 return VC_ERROR_NOT_SUPPORTED;
583 if (0 != __vc_cmd_check_privilege()) {
584 return VC_ERROR_PERMISSION_DENIED;
587 if (NULL == vc_cmd_list) {
588 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
589 return VC_ERROR_INVALID_PARAMETER;
592 vc_cmd_list_s* list = NULL;
593 list = (vc_cmd_list_s*)vc_cmd_list;
595 int count = g_slist_length(list->list);
597 if (list->index < count - 1) {
598 list->index = list->index + 1;
599 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
601 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
602 return VC_ERROR_ITERATION_END;
605 return VC_ERROR_NONE;
608 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
610 if (0 != __vc_cmd_get_feature_enabled()) {
611 return VC_ERROR_NOT_SUPPORTED;
613 if (0 != __vc_cmd_check_privilege()) {
614 return VC_ERROR_PERMISSION_DENIED;
617 if (NULL == vc_cmd_list) {
618 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
619 return VC_ERROR_INVALID_PARAMETER;
622 vc_cmd_list_s* list = NULL;
623 list = (vc_cmd_list_s*)vc_cmd_list;
625 if (list->index > 0) {
626 list->index = list->index - 1;
627 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
629 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
630 return VC_ERROR_ITERATION_END;
633 return VC_ERROR_NONE;
636 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
638 if (0 != __vc_cmd_get_feature_enabled()) {
639 return VC_ERROR_NOT_SUPPORTED;
641 if (0 != __vc_cmd_check_privilege()) {
642 return VC_ERROR_PERMISSION_DENIED;
645 if (NULL == vc_cmd_list || NULL == vc_command) {
646 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
647 return VC_ERROR_INVALID_PARAMETER;
650 vc_cmd_list_s* list = NULL;
651 list = (vc_cmd_list_s*)vc_cmd_list;
653 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
655 if (0 == g_slist_length(list->list)) {
656 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
658 return VC_ERROR_EMPTY;
661 vc_cmd_s *temp_cmd = NULL;
662 temp_cmd = g_slist_nth_data(list->list, list->index);
664 *vc_command = (vc_cmd_h)temp_cmd;
666 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
668 return VC_ERROR_NONE;
672 int vc_cmd_create(vc_cmd_h* vc_command)
674 if (0 != __vc_cmd_get_feature_enabled()) {
675 return VC_ERROR_NOT_SUPPORTED;
677 if (0 != __vc_cmd_check_privilege()) {
678 return VC_ERROR_PERMISSION_DENIED;
681 if (NULL == vc_command) {
682 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
683 return VC_ERROR_INVALID_PARAMETER;
686 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
688 if (NULL == command) {
689 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
690 return VC_ERROR_OUT_OF_MEMORY;
696 command->type = VC_COMMAND_TYPE_NONE;
697 command->format = VC_CMD_FORMAT_FIXED;
698 command->command = NULL;
699 command->parameter = NULL;
701 command->priority = 0;
702 command->key = VC_KEY_NONE;
703 command->modifier = VC_MODIFIER_NONE;
704 command->invocation_name = NULL;
705 command->appid = NULL;
706 command->fixed = NULL;
708 *vc_command = (vc_cmd_h)command;
710 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
712 return VC_ERROR_NONE;
715 int vc_cmd_destroy(vc_cmd_h vc_command)
717 if (0 != __vc_cmd_get_feature_enabled()) {
718 return VC_ERROR_NOT_SUPPORTED;
720 if (0 != __vc_cmd_check_privilege()) {
721 return VC_ERROR_PERMISSION_DENIED;
724 if (NULL == vc_command) {
725 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
726 return VC_ERROR_INVALID_PARAMETER;
729 vc_cmd_s* command = NULL;
730 command = (vc_cmd_s*)vc_command;
732 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
734 if (NULL != command) {
735 if (NULL != command->command) {
736 free(command->command);
737 command->command = NULL;
739 if (NULL != command->parameter) {
740 free(command->parameter);
741 command->parameter = NULL;
743 if (NULL != command->invocation_name) {
744 free(command->invocation_name);
745 command->invocation_name = NULL;
747 if (NULL != command->appid) {
748 free(command->appid);
749 command->appid = NULL;
751 if (NULL != command->fixed) {
752 free(command->fixed);
753 command->fixed = 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;
781 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
787 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
789 if (0 != __vc_cmd_get_feature_enabled()) {
790 return VC_ERROR_NOT_SUPPORTED;
792 if (0 != __vc_cmd_check_privilege()) {
793 return VC_ERROR_PERMISSION_DENIED;
796 if (NULL == vc_command || NULL == id) {
797 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
798 return VC_ERROR_INVALID_PARAMETER;
801 vc_cmd_s* cmd = NULL;
802 cmd = (vc_cmd_s*)vc_command;
806 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
812 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
814 if (0 != __vc_cmd_get_feature_enabled()) {
815 return VC_ERROR_NOT_SUPPORTED;
818 if (NULL == vc_command) {
819 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
820 return VC_ERROR_INVALID_PARAMETER;
824 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
825 return VC_ERROR_INVALID_PARAMETER;
828 vc_cmd_s* cmd = NULL;
829 cmd = (vc_cmd_s*)vc_command;
831 if (NULL != cmd->appid) {
836 cmd->appid = strdup(appid);
838 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
842 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
844 if (0 != __vc_cmd_get_feature_enabled()) {
845 return VC_ERROR_NOT_SUPPORTED;
848 if (NULL == vc_command || NULL == appid) {
849 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
850 return VC_ERROR_INVALID_PARAMETER;
853 vc_cmd_s* cmd = NULL;
854 cmd = (vc_cmd_s*)vc_command;
856 if (NULL != cmd->appid) {
857 *appid = strdup(gettext(cmd->appid));
860 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
864 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
866 if (0 != __vc_cmd_get_feature_enabled()) {
867 return VC_ERROR_NOT_SUPPORTED;
869 if (0 != __vc_cmd_check_privilege()) {
870 return VC_ERROR_PERMISSION_DENIED;
873 if (NULL == vc_command) {
874 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
875 return VC_ERROR_INVALID_PARAMETER;
878 vc_cmd_s* cmd = NULL;
879 cmd = (vc_cmd_s*)vc_command;
881 if (NULL != cmd->command) {
887 if (NULL != command) {
888 cmd->command = strdup(command);
891 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
896 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
898 if (0 != __vc_cmd_get_feature_enabled()) {
899 return VC_ERROR_NOT_SUPPORTED;
901 if (0 != __vc_cmd_check_privilege()) {
902 return VC_ERROR_PERMISSION_DENIED;
905 if (NULL == vc_command || NULL == command) {
906 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
907 return VC_ERROR_INVALID_PARAMETER;
910 vc_cmd_s* cmd = NULL;
911 cmd = (vc_cmd_s*)vc_command;
913 if (NULL != cmd->command) {
914 *command = strdup(gettext(cmd->command));
917 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
922 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
924 if (0 != __vc_cmd_get_feature_enabled()) {
925 return VC_ERROR_NOT_SUPPORTED;
927 if (0 != __vc_cmd_check_privilege()) {
928 return VC_ERROR_PERMISSION_DENIED;
931 if (NULL == vc_command) {
932 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
933 return VC_ERROR_INVALID_PARAMETER;
936 vc_cmd_s* cmd = NULL;
937 cmd = (vc_cmd_s*)vc_command;
939 if (NULL != cmd->parameter) {
940 free(cmd->parameter);
943 cmd->parameter = NULL;
945 if (NULL != command) {
946 cmd->parameter = strdup(command);
947 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
953 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
955 if (0 != __vc_cmd_get_feature_enabled()) {
956 return VC_ERROR_NOT_SUPPORTED;
959 if (NULL == vc_command || NULL == command) {
960 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
961 return VC_ERROR_INVALID_PARAMETER;
964 vc_cmd_s* cmd = NULL;
965 cmd = (vc_cmd_s*)vc_command;
967 if (NULL != cmd->parameter) {
968 *command = strdup(gettext(cmd->parameter));
969 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
975 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
977 if (0 != __vc_cmd_get_feature_enabled()) {
978 return VC_ERROR_NOT_SUPPORTED;
981 if (NULL == vc_command) {
982 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
983 return VC_ERROR_INVALID_PARAMETER;
987 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
988 return VC_ERROR_INVALID_PARAMETER;
991 vc_cmd_s* cmd = NULL;
992 cmd = (vc_cmd_s*)vc_command;
994 if (NULL != cmd->fixed) {
999 cmd->fixed = strdup(fixed);
1001 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1005 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1007 if (0 != __vc_cmd_get_feature_enabled()) {
1008 return VC_ERROR_NOT_SUPPORTED;
1011 if (NULL == vc_command || NULL == fixed) {
1012 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1013 return VC_ERROR_INVALID_PARAMETER;
1016 vc_cmd_s* cmd = NULL;
1017 cmd = (vc_cmd_s*)vc_command;
1019 if (NULL != cmd->fixed) {
1020 *fixed = strdup(gettext(cmd->fixed));
1021 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1027 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1029 if (0 != __vc_cmd_get_feature_enabled()) {
1030 return VC_ERROR_NOT_SUPPORTED;
1033 if (NULL == vc_command) {
1034 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1035 return VC_ERROR_INVALID_PARAMETER;
1038 if (NULL == invocation_name) {
1039 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1040 return VC_ERROR_INVALID_PARAMETER;
1043 vc_cmd_s* cmd = NULL;
1044 cmd = (vc_cmd_s*)vc_command;
1046 if (NULL != cmd->invocation_name) {
1047 free(cmd->invocation_name);
1048 cmd->invocation_name = NULL;
1051 cmd->invocation_name = strdup(invocation_name);
1053 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1057 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1059 if (0 != __vc_cmd_get_feature_enabled()) {
1060 return VC_ERROR_NOT_SUPPORTED;
1063 if (NULL == vc_command || NULL == invocation_name) {
1064 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1065 return VC_ERROR_INVALID_PARAMETER;
1068 vc_cmd_s* cmd = NULL;
1069 cmd = (vc_cmd_s*)vc_command;
1071 if (NULL != cmd->invocation_name) {
1072 *invocation_name = strdup(gettext(cmd->invocation_name));
1075 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1079 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1081 if (0 != __vc_cmd_get_feature_enabled()) {
1082 return VC_ERROR_NOT_SUPPORTED;
1084 if (0 != __vc_cmd_check_privilege()) {
1085 return VC_ERROR_PERMISSION_DENIED;
1088 if (NULL == vc_command) {
1089 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1090 return VC_ERROR_INVALID_PARAMETER;
1093 vc_cmd_s* cmd = NULL;
1094 cmd = (vc_cmd_s*)vc_command;
1098 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1103 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1105 if (0 != __vc_cmd_get_feature_enabled()) {
1106 return VC_ERROR_NOT_SUPPORTED;
1108 if (0 != __vc_cmd_check_privilege()) {
1109 return VC_ERROR_PERMISSION_DENIED;
1112 if (NULL == vc_command || NULL == type) {
1113 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1114 return VC_ERROR_INVALID_PARAMETER;
1117 vc_cmd_s* cmd = NULL;
1118 cmd = (vc_cmd_s*)vc_command;
1122 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1127 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1129 if (0 != __vc_cmd_get_feature_enabled()) {
1130 return VC_ERROR_NOT_SUPPORTED;
1133 if (NULL == vc_command) {
1134 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1135 return VC_ERROR_INVALID_PARAMETER;
1138 vc_cmd_s* cmd = NULL;
1139 cmd = (vc_cmd_s*)vc_command;
1141 cmd->format = format;
1143 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1148 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1150 if (0 != __vc_cmd_get_feature_enabled()) {
1151 return VC_ERROR_NOT_SUPPORTED;
1154 if (NULL == vc_command || NULL == format) {
1155 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1156 return VC_ERROR_INVALID_PARAMETER;
1159 vc_cmd_s* cmd = NULL;
1160 cmd = (vc_cmd_s*)vc_command;
1162 *format = cmd->format;
1164 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1169 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1171 if (0 != __vc_cmd_get_feature_enabled()) {
1172 return VC_ERROR_NOT_SUPPORTED;
1174 if (0 != __vc_cmd_check_privilege()) {
1175 return VC_ERROR_PERMISSION_DENIED;
1178 if (NULL == vc_command) {
1179 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1180 return VC_ERROR_INVALID_PARAMETER;
1183 vc_cmd_s* cmd = NULL;
1184 cmd = (vc_cmd_s*)vc_command;
1188 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1193 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1195 if (0 != __vc_cmd_get_feature_enabled()) {
1196 return VC_ERROR_NOT_SUPPORTED;
1198 if (0 != __vc_cmd_check_privilege()) {
1199 return VC_ERROR_PERMISSION_DENIED;
1202 if (NULL == vc_command || NULL == pid) {
1203 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1204 return VC_ERROR_INVALID_PARAMETER;
1207 vc_cmd_s* cmd = NULL;
1208 cmd = (vc_cmd_s*)vc_command;
1212 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1217 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1219 if (0 != __vc_cmd_get_feature_enabled()) {
1220 return VC_ERROR_NOT_SUPPORTED;
1222 if (0 != __vc_cmd_check_privilege()) {
1223 return VC_ERROR_PERMISSION_DENIED;
1226 if (NULL == vc_command) {
1227 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1228 return VC_ERROR_INVALID_PARAMETER;
1231 vc_cmd_s* cmd = NULL;
1232 cmd = (vc_cmd_s*)vc_command;
1234 cmd->domain = domain;
1236 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1241 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1243 if (0 != __vc_cmd_get_feature_enabled()) {
1244 return VC_ERROR_NOT_SUPPORTED;
1246 if (0 != __vc_cmd_check_privilege()) {
1247 return VC_ERROR_PERMISSION_DENIED;
1250 if (NULL == vc_command || NULL == domain) {
1251 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1252 return VC_ERROR_INVALID_PARAMETER;
1255 vc_cmd_s* cmd = NULL;
1256 cmd = (vc_cmd_s*)vc_command;
1258 *domain = cmd->domain;
1260 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1266 * @brief Sets key value of command.
1268 * @param[in] vc_command Command handle
1269 * @param[in] key key value
1270 * @param[in] modifier modifier value
1272 * @return 0 on success, otherwise a negative error value
1273 * @retval #VC_ERROR_NONE Successful
1274 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1276 * @see vc_cmd_get_result_key()
1278 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1280 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Set result key");
1282 if (NULL == vc_command) {
1283 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1284 return VC_ERROR_INVALID_PARAMETER;
1287 vc_cmd_s* cmd = NULL;
1288 cmd = (vc_cmd_s*)vc_command;
1290 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1293 cmd->modifier = modifier;
1295 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1296 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1302 * @brief Gets key value of command.
1304 * @param[in] vc_command Command handle
1305 * @param[out] key key value
1306 * @param[out] modifier modifier value
1308 * @return 0 on success, otherwise a negative error value
1309 * @retval #VC_ERROR_NONE Successful
1310 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1312 * @see vc_cmd_add_result_key()
1314 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1316 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Get result key");
1318 if (NULL == vc_command || NULL == key || NULL == modifier) {
1319 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1320 return VC_ERROR_INVALID_PARAMETER;
1323 vc_cmd_s* cmd = NULL;
1324 cmd = (vc_cmd_s*)vc_command;
1327 *modifier = cmd->modifier;
1329 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1330 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1335 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1337 if (NULL == vc_cmd_list) {
1341 vc_cmd_list_s* list = NULL;
1342 list = (vc_cmd_list_s*)vc_cmd_list;
1344 SLOG(LOG_DEBUG, TAG_VCCMD, "=== Command List ===");
1345 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1347 int count = g_slist_length(list->list);
1350 vc_cmd_s *cmd = NULL;
1352 for (i = 0; i < count ; i++) {
1353 cmd = g_slist_nth_data(list->list, i);
1356 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)",
1357 i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1361 SLOG(LOG_DEBUG, TAG_VCCMD, "==================");
1362 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1367 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1369 if (0 != __vc_cmd_get_feature_enabled()) {
1370 return VC_ERROR_NOT_SUPPORTED;
1373 if (NULL == vc_cmd || NULL == json) {
1374 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1375 return VC_ERROR_INVALID_PARAMETER;
1378 vc_cmd_s* cmd = NULL;
1379 cmd = (vc_cmd_s*)vc_cmd;
1381 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1382 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1383 return VC_ERROR_INVALID_PARAMETER;
1386 if (0 != vc_info_parser_get_nlu_result(json)) {
1387 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1388 return VC_ERROR_OPERATION_FAILED;
1394 static void __vc_cmd_regex_deinit(int num_regex)
1396 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Start Deinitialize regex ====");
1399 for (i = 0; num_regex > i; i++) {
1403 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
1404 SLOG(LOG_DEBUG, TAG_VCCMD, "");
1407 static int __vc_cmd_regex_init()
1409 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Initialize regular expression ====");
1411 int cflags = REG_EXTENDED | REG_ICASE;
1417 vc_config_mgr_get_default_language(&lang);
1419 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1420 return VC_ERROR_OPERATION_FAILED;
1423 if (!strcmp("en_US", lang)) {
1425 } else if (!strcmp("ko_KR", lang)) {
1431 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1432 return VC_ERROR_INVALID_LANGUAGE;
1438 SLOG(LOG_DEBUG, TAG_VCCMD, "==== lang type > %d ====", lang_type);
1440 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1442 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1443 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1445 regerror(ret, ®[0], errStr, sizeof(errStr));
1447 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1448 return VC_ERROR_OPERATION_FAILED;
1451 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1452 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1454 regerror(ret, ®[1], errStr, sizeof(errStr));
1455 __vc_cmd_regex_deinit(1);
1457 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1458 return VC_ERROR_OPERATION_FAILED;
1461 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1462 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1464 regerror(ret, ®[2], errStr, sizeof(errStr));
1465 __vc_cmd_regex_deinit(2);
1467 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1468 return VC_ERROR_OPERATION_FAILED;
1471 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1472 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1474 regerror(ret, ®[3], errStr, sizeof(errStr));
1475 __vc_cmd_regex_deinit(3);
1477 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1478 return VC_ERROR_OPERATION_FAILED;
1481 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1482 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1484 regerror(ret, ®[4], errStr, sizeof(errStr));
1485 __vc_cmd_regex_deinit(4);
1487 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1488 return VC_ERROR_OPERATION_FAILED;
1491 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1492 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1494 regerror(ret, ®[5], errStr, sizeof(errStr));
1495 __vc_cmd_regex_deinit(5);
1497 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1498 return VC_ERROR_OPERATION_FAILED;
1501 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1502 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1504 regerror(ret, ®[6], errStr, sizeof(errStr));
1505 __vc_cmd_regex_deinit(6);
1507 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1508 return VC_ERROR_OPERATION_FAILED;
1511 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1512 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1514 regerror(ret, ®[7], errStr, sizeof(errStr));
1515 __vc_cmd_regex_deinit(7);
1517 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1518 return VC_ERROR_OPERATION_FAILED;
1521 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1522 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1524 regerror(ret, ®[8], errStr, sizeof(errStr));
1525 __vc_cmd_regex_deinit(8);
1527 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1528 return VC_ERROR_OPERATION_FAILED;
1531 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1532 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1534 regerror(ret, ®[9], errStr, sizeof(errStr));
1535 __vc_cmd_regex_deinit(9);
1537 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1538 return VC_ERROR_OPERATION_FAILED;
1541 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1542 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1544 regerror(ret, ®[10], errStr, sizeof(errStr));
1545 __vc_cmd_regex_deinit(10);
1547 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1548 return VC_ERROR_OPERATION_FAILED;
1551 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1552 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1554 regerror(ret, ®[11], errStr, sizeof(errStr));
1555 __vc_cmd_regex_deinit(11);
1557 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1558 return VC_ERROR_OPERATION_FAILED;
1561 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
1562 SLOG(LOG_DEBUG, TAG_VCCMD, "");
1564 return VC_ERROR_NONE;
1567 static void __vc_cmd_add_year(struct tm *td, int year)
1569 td->tm_year += year;
1572 static void __vc_cmd_add_mon(struct tm *td, int mon)
1576 mon = td->tm_mon + mon;
1580 __vc_cmd_add_year(td, year);
1583 td->tm_mon = mon % 12;
1586 static void __vc_cmd_add_mday(struct tm *td, int mday)
1588 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1589 int year = td->tm_year + 1900;
1593 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1595 mday = td->tm_mday + mday;
1597 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1598 mday -= max_day[mon % 12];
1600 if (11 == mon % 12) {
1603 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1611 mon = mon - td->tm_mon;
1614 __vc_cmd_add_mon(td, mon);
1620 static void __vc_cmd_add_hour(struct tm *td, int hour)
1624 hour = td->tm_hour + hour;
1628 __vc_cmd_add_mday(td, day);
1631 td->tm_hour = hour % 24;
1634 static void __vc_cmd_add_min(struct tm *td, int min)
1638 min = td->tm_min + min;
1642 __vc_cmd_add_hour(td, hour);
1645 td->tm_min = min % 60;
1648 static void __copy_struct_tm(struct tm *des, struct tm *src)
1650 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Start to copy struct tm ====");
1652 des->tm_sec = src->tm_sec;
1653 des->tm_min = src->tm_min;
1654 des->tm_hour = src->tm_hour;
1655 des->tm_mday = src->tm_mday;
1656 des->tm_mon = src->tm_mon;
1657 des->tm_year = src->tm_year;
1658 des->tm_wday = src->tm_wday;
1659 des->tm_yday = src->tm_yday;
1660 des->tm_isdst = src->tm_isdst;
1662 des->tm_gmtoff = src->tm_gmtoff;
1663 des->tm_zone = src->tm_zone;
1666 static void __update_data_sidx(int idx)
1668 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1671 static void __update_data_eidx(int idx)
1673 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1676 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1678 regmatch_t pmatch[3];
1684 ret = regexec(®[6], str, 3, pmatch, 0);
1687 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1689 if (12 < td->tm_hour) {
1690 __vc_cmd_add_mday(td, 1);
1696 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1698 __vc_cmd_add_mday(td, 1);
1703 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1705 __update_data_sidx(pmatch[0].rm_so);
1706 __update_data_eidx(pmatch[0].rm_eo);
1709 return VC_ERROR_NONE;
1712 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1713 return VC_ERROR_NONE;
1716 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1718 regmatch_t pmatch[2];
1726 char *tempstr = NULL;
1729 ret = regexec(®[3], str, 1, pmatch, 0);
1731 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1734 sidx = pmatch[0].rm_so;
1735 eidx = pmatch[0].rm_eo;
1737 ret = regexec(®[4], str, 2, pmatch, 0);
1739 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1742 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1743 return VC_ERROR_OPERATION_FAILED;
1745 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1747 if (NULL == tempstr) {
1748 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1749 return VC_ERROR_OUT_OF_MEMORY;
1752 hour = atoi(tempstr);
1757 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1759 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1760 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1763 ret = regexec(®[5], str, 2, pmatch, 0);
1765 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1768 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1769 return VC_ERROR_OPERATION_FAILED;
1771 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1773 if (NULL == tempstr) {
1774 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1775 return VC_ERROR_OUT_OF_MEMORY;
1778 min = atoi(tempstr);
1783 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1785 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1786 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1789 if (hour < 0 && min < 0) {
1790 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1791 return VC_ERROR_NONE;
1794 hour = 0 > hour ? 0 : hour;
1795 min = 0 > min ? 0 : min;
1797 min = min + (hour * 60);
1799 __vc_cmd_add_min(td, min);
1802 __update_data_sidx(sidx);
1803 __update_data_eidx(eidx);
1806 return VC_ERROR_NONE;
1809 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1810 return VC_ERROR_NONE;
1813 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1815 regmatch_t pmatch[5];
1824 char *tempstr = NULL;
1827 ret = regexec(®[0], str, 5, pmatch, 0);
1829 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1833 sidx = pmatch[0].rm_so;
1834 eidx = pmatch[0].rm_eo;
1837 ret = regexec(®[1], str, 2, pmatch, 0);
1839 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1842 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1843 return VC_ERROR_OPERATION_FAILED;
1845 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1847 if (NULL == tempstr) {
1848 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1849 return VC_ERROR_OUT_OF_MEMORY;
1852 hour = atoi(tempstr);
1855 hour = hour + 12 * flag;
1857 if (12 == hour) hour = 0;
1858 else if (24 == hour) hour = 12;
1861 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1862 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1863 return VC_ERROR_NONE;
1869 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1871 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1872 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1873 } else if (0 < flag) {
1874 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1875 return VC_ERROR_NONE;
1878 ret = regexec(®[2], str, 2, pmatch, 0);
1881 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1883 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1885 if (NULL == tempstr) {
1886 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1887 return VC_ERROR_OUT_OF_MEMORY;
1890 min = atoi(tempstr);
1892 if (0 > min || 60 <= min) {
1893 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1894 return VC_ERROR_NONE;
1906 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1907 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1908 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1911 if (0 > hour && 0 > min) {
1912 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1913 return VC_ERROR_NONE;
1916 if (0 <= min && 0 <= hour) {
1917 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1921 } else if (0 <= min) {
1923 vc_config_mgr_get_default_language(&lang);
1925 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1926 return VC_ERROR_OPERATION_FAILED;
1929 if (!strcmp("en_US", lang)) {
1930 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1933 return VC_ERROR_NONE;
1935 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1942 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1950 __update_data_sidx(sidx);
1951 __update_data_eidx(eidx);
1954 return VC_ERROR_NONE;
1957 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1959 regmatch_t pmatch[10];
1965 ret = regexec(®[10], str, 5, pmatch, 0);
1967 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1969 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1971 td->tm_year = td_now.tm_year;
1972 td->tm_mon = td_now.tm_mon;
1973 td->tm_mday = td_now.tm_mday;
1975 __vc_cmd_add_mday(td, idx - 1);
1977 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1979 __update_data_sidx(pmatch[0].rm_so);
1980 __update_data_eidx(pmatch[0].rm_eo);
1983 return VC_ERROR_NONE;
1986 ret = regexec(®[11], str, 10, pmatch, 0);
1988 for (idx = 1; 10 > idx; idx++) {
1989 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1994 td->tm_year = td_now.tm_year;
1995 td->tm_mon = td_now.tm_mon;
1996 td->tm_mday = td_now.tm_mday;
1998 __vc_cmd_add_mday(td, idx + 1);
2000 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2002 __update_data_sidx(pmatch[0].rm_so);
2003 __update_data_eidx(pmatch[0].rm_eo);
2006 return VC_ERROR_NONE;
2009 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2010 return VC_ERROR_NONE;
2013 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2015 regmatch_t pmatch[13];
2026 char *tempstr = NULL;
2029 ret = regexec(®[9], str, 2, pmatch, 0);
2031 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2034 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2035 return VC_ERROR_OPERATION_FAILED;
2037 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2039 if (NULL == tempstr) {
2040 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2041 return VC_ERROR_OUT_OF_MEMORY;
2044 day = atoi(tempstr);
2049 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2051 sidx = pmatch[0].rm_so;
2052 eidx = pmatch[0].rm_eo;
2054 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2055 return VC_ERROR_NONE;
2058 ret = regexec(®[8], str, 13, pmatch, 0);
2060 for (idx = 1; 13 > idx; idx++) {
2061 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2071 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2073 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2074 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2077 vc_config_mgr_get_default_language(&lang);
2079 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2080 return VC_ERROR_OPERATION_FAILED;
2083 if (!strcmp("en_US", lang)) {
2084 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2087 return VC_ERROR_NONE;
2096 ret = regexec(®[7], str, 3, pmatch, 0);
2098 if (!m_flag) return -1;
2100 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2103 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2104 return VC_ERROR_OPERATION_FAILED;
2106 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2108 if (NULL == tempstr) {
2109 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2110 return VC_ERROR_OUT_OF_MEMORY;
2113 year = atoi(tempstr);
2114 year = 1900 < year ? year - 1900 : year + 100;
2120 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2122 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2123 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2128 if (0 > g_time_flag) {
2132 } else if (2 == g_time_flag) {
2133 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2134 return VC_ERROR_NONE;
2137 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2138 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2140 if (max_day[mon] < day || 1 > day) {
2141 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2142 return VC_ERROR_NONE;
2151 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2153 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2154 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2158 __update_data_sidx(sidx);
2159 __update_data_eidx(eidx);
2162 return VC_ERROR_NONE;
2165 static int __vc_cmd_time_check(const char *str, struct tm *td)
2167 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Check time value in string \"%s\"", str);
2172 ret = __vc_cmd_tphrase_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 occured > (%d)", ret);
2183 ret = __vc_cmd_trelative_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 occured > (%d)", ret);
2194 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2198 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Time value is exist");
2200 } else if (VC_ERROR_NONE != ret) {
2201 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2205 SLOG(LOG_DEBUG, TAG_VCCMD, "==== There is no time value");
2206 return VC_ERROR_NONE;
2209 static int __vc_cmd_date_check(const char *str, struct tm *td)
2211 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Check date value in string \"%s\"", str);
2216 ret = __vc_cmd_dphrase_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 occured > (%d)", ret);
2227 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2231 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Date value is exist");
2233 } else if (VC_ERROR_NONE != ret) {
2234 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2238 SLOG(LOG_DEBUG, TAG_VCCMD, "==== There is no date value");
2239 return VC_ERROR_NONE;
2242 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2244 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Get timestamp data");
2247 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2250 if (NULL == text || NULL == result || NULL == remain) {
2251 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2252 return VC_ERROR_INVALID_PARAMETER;
2256 ret = __vc_cmd_regex_init();
2257 if (VC_ERROR_NONE != ret) {
2258 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2262 g_data_sidx = g_data_eidx = -1;
2265 localtime_r(&t_now, &td_now);
2266 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2268 __copy_struct_tm(&td, &td_now);
2269 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2270 td.tm_year + 1900, td.tm_mon + 1, td.tm_mday, day_name[td.tm_wday], td.tm_hour, td.tm_min, td.tm_sec);
2272 g_time_flag = g_date_flag = -1;
2274 ret = __vc_cmd_time_check(text, &td);
2275 if (VC_ERROR_NONE != ret) {
2276 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured in the check > (%d)", ret);
2280 ret = __vc_cmd_date_check(text, &td);
2281 if (VC_ERROR_NONE != ret) {
2282 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured in the check > (%d)", ret);
2286 __vc_cmd_regex_deinit(12);
2288 if (g_time_flag > 0 || g_date_flag > 0) {
2289 *result = mktime(&td);
2291 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %d", *result);
2292 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2293 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, td.tm_yday);
2295 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2297 if (NULL == *remain) {
2298 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2299 return VC_ERROR_OUT_OF_MEMORY;
2302 strncpy(*remain, text, g_data_sidx);
2303 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2305 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2308 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
2309 SLOG(LOG_DEBUG, TAG_VCCMD, "");
2311 return VC_ERROR_NONE;