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;
40 static GList *g_cmdlist_list = NULL;
43 // For getting timestamp using regular expression
44 static regex_t reg[MAX_NUM_REGEX];
45 static time_t t_now; //time_t is based on UTC
46 static struct tm td_now; //if use localtime function, the value follows the local time zone, otherwise it follows the UTC.
48 static int g_time_flag;
49 static int g_date_flag;
51 static int g_data_sidx;
52 static int g_data_eidx;
54 static int __vc_cmd_get_feature_enabled()
56 if (0 == g_feature_enabled) {
57 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
58 return VC_ERROR_NOT_SUPPORTED;
59 } else if (-1 == g_feature_enabled) {
60 bool vc_supported = false;
61 bool mic_supported = false;
62 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
63 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
64 if (false == vc_supported || false == mic_supported) {
65 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Voice control feature NOT supported");
66 g_feature_enabled = 0;
67 return VC_ERROR_NOT_SUPPORTED;
70 g_feature_enabled = 1;
72 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
73 return VC_ERROR_NOT_SUPPORTED;
76 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get feature value");
77 return VC_ERROR_NOT_SUPPORTED;
84 static int __check_privilege_initialize()
86 int ret = cynara_initialize(&p_cynara, NULL);
87 if (CYNARA_API_SUCCESS != ret)
88 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to initialize");
90 return ret == CYNARA_API_SUCCESS;
93 static int __check_privilege(const char* uid, const char * privilege)
96 char label_path[1024] = "/proc/self/attr/current";
97 char smack_label[1024] = {'\0',};
103 fp = fopen(label_path, "r");
105 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
106 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] fail to fread");
111 pid_t pid = getpid();
112 char *session = cynara_session_from_pid(pid);
113 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
114 SLOG(LOG_DEBUG, TAG_VCCMD, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
118 if (ret != CYNARA_API_ACCESS_ALLOWED)
123 static void __check_privilege_deinitialize()
126 cynara_finish(p_cynara);
130 static int __vc_cmd_check_privilege()
134 if (0 == g_privilege_allowed) {
135 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
136 return VC_ERROR_PERMISSION_DENIED;
137 } else if (-1 == g_privilege_allowed) {
138 if (false == __check_privilege_initialize()) {
139 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] privilege initialize is failed");
140 return VC_ERROR_PERMISSION_DENIED;
142 snprintf(uid, 16, "%d", getuid());
143 if (false == __check_privilege(uid, VC_PRIVILEGE)) {
144 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Permission is denied");
145 g_privilege_allowed = 0;
146 __check_privilege_deinitialize();
147 return VC_ERROR_PERMISSION_DENIED;
149 __check_privilege_deinitialize();
152 g_privilege_allowed = 1;
154 return VC_ERROR_NONE;
157 int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list)
159 if (0 != __vc_cmd_get_feature_enabled()) {
160 return VC_ERROR_NOT_SUPPORTED;
162 if (0 != __vc_cmd_check_privilege()) {
163 return VC_ERROR_PERMISSION_DENIED;
166 if (NULL == vc_cmd_list) {
167 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
168 return VC_ERROR_INVALID_PARAMETER;
171 vc_cmd_list_s* list = (vc_cmd_list_s*)calloc(1, sizeof(vc_cmd_list_s));
174 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
175 return VC_ERROR_OUT_OF_MEMORY;
181 *vc_cmd_list = (vc_cmd_list_h)list;
183 g_cmdlist_list = g_list_append(g_cmdlist_list, list);
185 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list);
187 return VC_ERROR_NONE;
190 int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command)
192 if (0 != __vc_cmd_get_feature_enabled()) {
193 return VC_ERROR_NOT_SUPPORTED;
195 if (0 != __vc_cmd_check_privilege()) {
196 return VC_ERROR_PERMISSION_DENIED;
199 if (NULL == vc_cmd_list) {
200 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
201 return VC_ERROR_INVALID_PARAMETER;
204 vc_cmd_list_remove_all(vc_cmd_list, release_command);
206 vc_cmd_list_s* list = NULL;
207 list = (vc_cmd_list_s*)vc_cmd_list;
209 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list);
212 vc_cmd_list_s *data = NULL;
214 /* if list have item */
215 if (g_list_length(g_cmdlist_list) > 0) {
216 /* Get a first item */
217 iter = g_list_first(g_cmdlist_list);
219 while (NULL != iter) {
221 if (data && list == data) {
222 g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter);
227 SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy");
230 return VC_ERROR_NONE;
233 iter = g_list_next(iter);
236 SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid");
238 return VC_ERROR_INVALID_PARAMETER;
241 int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count)
243 if (0 != __vc_cmd_get_feature_enabled()) {
244 return VC_ERROR_NOT_SUPPORTED;
246 if (0 != __vc_cmd_check_privilege()) {
247 return VC_ERROR_PERMISSION_DENIED;
250 if (NULL == vc_cmd_list || NULL == count) {
251 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Get command count : Input parameter is NULL");
252 return VC_ERROR_INVALID_PARAMETER;
255 vc_cmd_list_s* list = NULL;
256 list = (vc_cmd_list_s*)vc_cmd_list;
258 *count = g_slist_length(list->list);
260 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), count(%d)", list, *count);
262 return VC_ERROR_NONE;
265 int vc_cmd_list_add(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
267 if (0 != __vc_cmd_get_feature_enabled()) {
268 return VC_ERROR_NOT_SUPPORTED;
270 if (0 != __vc_cmd_check_privilege()) {
271 return VC_ERROR_PERMISSION_DENIED;
274 if (NULL == vc_cmd_list || NULL == vc_command) {
275 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
276 return VC_ERROR_INVALID_PARAMETER;
279 vc_cmd_list_s* list = NULL;
280 list = (vc_cmd_list_s*)vc_cmd_list;
282 vc_cmd_s* cmd = NULL;
283 cmd = (vc_cmd_s*)vc_command;
285 list->list = g_slist_append(list->list, cmd);
287 if (1 == g_slist_length(list->list)) {
291 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
293 return VC_ERROR_NONE;
296 int vc_cmd_list_remove(vc_cmd_list_h vc_cmd_list, vc_cmd_h vc_command)
298 if (0 != __vc_cmd_get_feature_enabled()) {
299 return VC_ERROR_NOT_SUPPORTED;
301 if (0 != __vc_cmd_check_privilege()) {
302 return VC_ERROR_PERMISSION_DENIED;
305 if (NULL == vc_cmd_list || NULL == vc_command) {
306 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
307 return VC_ERROR_INVALID_PARAMETER;
310 vc_cmd_list_s* list = NULL;
311 list = (vc_cmd_list_s*)vc_cmd_list;
313 vc_cmd_s* cmd = NULL;
314 cmd = (vc_cmd_s*)vc_command;
316 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p), command(%p)", list, cmd);
318 vc_cmd_s* temp_cmd = NULL;
321 iter = g_slist_nth(list->list, 0);
323 while (NULL != iter) {
324 temp_cmd = iter->data;
326 if (NULL != temp_cmd && cmd == temp_cmd) {
327 list->list = g_slist_remove(list->list, temp_cmd);
329 if (true == release_command) {
330 SLOG(LOG_DEBUG, TAG_VCCMD, "Release command data");
331 if (NULL != temp_cmd->command) free(temp_cmd->command);
332 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
339 iter = g_slist_next(iter);
342 int count = g_slist_length(list->list);
346 } else if (list->index == count) {
347 list->index = count - 1;
350 return VC_ERROR_NONE;
353 int vc_cmd_list_remove_all(vc_cmd_list_h vc_cmd_list, bool release_command)
355 if (0 != __vc_cmd_get_feature_enabled()) {
356 return VC_ERROR_NOT_SUPPORTED;
358 if (0 != __vc_cmd_check_privilege()) {
359 return VC_ERROR_PERMISSION_DENIED;
362 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Destroy all command");
364 if (NULL == vc_cmd_list) {
365 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
366 return VC_ERROR_INVALID_PARAMETER;
369 vc_cmd_list_s* list = NULL;
370 list = (vc_cmd_list_s*)vc_cmd_list;
372 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), release command (%s)"
373 , list, release_command ? "true" : "false");
375 int count = g_slist_length(list->list);
380 for (i = 0; i < count ; i++) {
381 temp_cmd = g_slist_nth_data(list->list, 0);
383 if (NULL != temp_cmd) {
384 list->list = g_slist_remove(list->list, temp_cmd);
386 if (true == release_command) {
387 SLOG(LOG_DEBUG, TAG_VCCMD, "Free command(%p)", temp_cmd);
388 if (NULL != temp_cmd->command) free(temp_cmd->command);
389 if (NULL != temp_cmd->parameter) free(temp_cmd->parameter);
390 if (NULL != temp_cmd->appid) free(temp_cmd->appid);
391 if (NULL != temp_cmd->invocation_name) free(temp_cmd->invocation_name);
392 if (NULL != temp_cmd->fixed) free(temp_cmd->fixed);
401 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
402 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
404 return VC_ERROR_NONE;
407 int vc_cmd_list_foreach_commands(vc_cmd_list_h vc_cmd_list, vc_cmd_list_cb callback, void* user_data)
409 if (0 != __vc_cmd_get_feature_enabled()) {
410 return VC_ERROR_NOT_SUPPORTED;
412 if (0 != __vc_cmd_check_privilege()) {
413 return VC_ERROR_PERMISSION_DENIED;
416 if (NULL == vc_cmd_list) {
417 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
418 return VC_ERROR_INVALID_PARAMETER;
421 vc_cmd_list_s* list = NULL;
422 list = (vc_cmd_list_s*)vc_cmd_list;
424 int count = g_slist_length(list->list);
430 iter = g_slist_nth(list->list, 0);
432 for (i = 0; i < count; i++) {
434 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
435 return VC_ERROR_OPERATION_FAILED;
438 temp_cmd = iter->data;
440 if (NULL != temp_cmd) {
441 if (false == callback((vc_cmd_h)temp_cmd, user_data)) {
446 iter = g_slist_next(iter);
449 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Foreach commands Done");
451 return VC_ERROR_NONE;
454 int vc_cmd_list_filter_by_type(vc_cmd_list_h original, int type, vc_cmd_list_h* filtered)
456 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Filter by type");
458 if (0 != __vc_cmd_get_feature_enabled()) {
459 return VC_ERROR_NOT_SUPPORTED;
461 if (0 != __vc_cmd_check_privilege()) {
462 return VC_ERROR_PERMISSION_DENIED;
465 if (NULL == original) {
466 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
467 return VC_ERROR_INVALID_PARAMETER;
470 if (VC_COMMAND_TYPE_NONE >= type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
471 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid type");
472 return VC_ERROR_INVALID_PARAMETER;
475 vc_cmd_list_s* list = NULL;
476 list = (vc_cmd_list_s*)original;
478 vc_cmd_list_h temp_list;
479 if (0 != vc_cmd_list_create(&temp_list)) {
480 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to list create");
481 return VC_ERROR_OPERATION_FAILED;
484 int count = g_slist_length(list->list);
490 iter = g_slist_nth(list->list, 0);
492 for (i = 0; i < count; i++) {
494 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] No command in list");
495 return VC_ERROR_OPERATION_FAILED;
497 if (NULL != iter->data) {
498 iter_cmd = iter->data;
500 if (NULL != iter_cmd) {
502 if (0 != vc_cmd_get_type((vc_cmd_h)iter_cmd, &iter_type)) {
503 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get command type");
507 if (iter_type == type) {
509 if (0 != vc_cmd_create(&temp_cmd)) {
510 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to create cmd");
514 memcpy(temp_cmd, iter_cmd, sizeof(vc_cmd_s));
515 if (NULL != iter_cmd->command) {
516 ((vc_cmd_s*)temp_cmd)->command = strdup(iter_cmd->command);
518 if (NULL != iter_cmd->parameter) {
519 ((vc_cmd_s*)temp_cmd)->parameter = strdup(iter_cmd->parameter);
522 if (0 != vc_cmd_list_add(temp_list, temp_cmd)) {
523 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to cmd list add");
524 vc_cmd_destroy(temp_cmd);
530 iter = g_slist_next(iter);
534 if (0 != vc_cmd_list_get_count(temp_list, &count)) {
535 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get count");
537 SLOG(LOG_DEBUG, TAG_VCCMD, "Filtering result : (%d) command", count);
540 *filtered = temp_list;
542 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
544 return VC_ERROR_NONE;
547 int vc_cmd_list_first(vc_cmd_list_h vc_cmd_list)
549 if (0 != __vc_cmd_get_feature_enabled()) {
550 return VC_ERROR_NOT_SUPPORTED;
552 if (0 != __vc_cmd_check_privilege()) {
553 return VC_ERROR_PERMISSION_DENIED;
556 if (NULL == vc_cmd_list) {
557 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
558 return VC_ERROR_INVALID_PARAMETER;
561 vc_cmd_list_s* list = NULL;
562 list = (vc_cmd_list_s*)vc_cmd_list;
564 if (0 == g_slist_length(list->list)) {
565 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
566 return VC_ERROR_EMPTY;
571 return VC_ERROR_NONE;
574 int vc_cmd_list_last(vc_cmd_list_h vc_cmd_list)
576 if (0 != __vc_cmd_get_feature_enabled()) {
577 return VC_ERROR_NOT_SUPPORTED;
579 if (0 != __vc_cmd_check_privilege()) {
580 return VC_ERROR_PERMISSION_DENIED;
583 if (NULL == vc_cmd_list) {
584 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
585 return VC_ERROR_INVALID_PARAMETER;
588 vc_cmd_list_s* list = NULL;
589 list = (vc_cmd_list_s*)vc_cmd_list;
591 int count = g_slist_length(list->list);
594 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] List is empty");
595 return VC_ERROR_EMPTY;
597 list->index = count - 1;
598 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
601 return VC_ERROR_NONE;
604 int vc_cmd_list_next(vc_cmd_list_h vc_cmd_list)
606 if (0 != __vc_cmd_get_feature_enabled()) {
607 return VC_ERROR_NOT_SUPPORTED;
609 if (0 != __vc_cmd_check_privilege()) {
610 return VC_ERROR_PERMISSION_DENIED;
613 if (NULL == vc_cmd_list) {
614 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
615 return VC_ERROR_INVALID_PARAMETER;
618 vc_cmd_list_s* list = NULL;
619 list = (vc_cmd_list_s*)vc_cmd_list;
621 int count = g_slist_length(list->list);
623 if (list->index < count - 1) {
624 list->index = list->index + 1;
625 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
627 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
628 return VC_ERROR_ITERATION_END;
631 return VC_ERROR_NONE;
634 int vc_cmd_list_prev(vc_cmd_list_h vc_cmd_list)
636 if (0 != __vc_cmd_get_feature_enabled()) {
637 return VC_ERROR_NOT_SUPPORTED;
639 if (0 != __vc_cmd_check_privilege()) {
640 return VC_ERROR_PERMISSION_DENIED;
643 if (NULL == vc_cmd_list) {
644 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
645 return VC_ERROR_INVALID_PARAMETER;
648 vc_cmd_list_s* list = NULL;
649 list = (vc_cmd_list_s*)vc_cmd_list;
651 if (list->index > 0) {
652 list->index = list->index - 1;
653 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
655 SLOG(LOG_DEBUG, TAG_VCCMD, "[DEBUG] List index : %d", list->index);
656 return VC_ERROR_ITERATION_END;
659 return VC_ERROR_NONE;
662 int vc_cmd_list_get_current(vc_cmd_list_h vc_cmd_list, vc_cmd_h* vc_command)
664 if (0 != __vc_cmd_get_feature_enabled()) {
665 return VC_ERROR_NOT_SUPPORTED;
667 if (0 != __vc_cmd_check_privilege()) {
668 return VC_ERROR_PERMISSION_DENIED;
671 if (NULL == vc_cmd_list || NULL == vc_command) {
672 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
673 return VC_ERROR_INVALID_PARAMETER;
676 vc_cmd_list_s* list = NULL;
677 list = (vc_cmd_list_s*)vc_cmd_list;
679 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list (%p), index (%d)", list, list->index);
681 if (0 == g_slist_length(list->list)) {
682 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list is empty");
684 return VC_ERROR_EMPTY;
687 vc_cmd_s *temp_cmd = NULL;
688 temp_cmd = g_slist_nth_data(list->list, list->index);
690 *vc_command = (vc_cmd_h)temp_cmd;
692 SLOG(LOG_DEBUG, TAG_VCCMD, "[List] Get current command (%p)", *vc_command);
694 return VC_ERROR_NONE;
698 int vc_cmd_create(vc_cmd_h* vc_command)
700 if (0 != __vc_cmd_get_feature_enabled()) {
701 return VC_ERROR_NOT_SUPPORTED;
703 if (0 != __vc_cmd_check_privilege()) {
704 return VC_ERROR_PERMISSION_DENIED;
707 if (NULL == vc_command) {
708 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
709 return VC_ERROR_INVALID_PARAMETER;
712 vc_cmd_s* command = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s));
714 if (NULL == command) {
715 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not enough memory");
716 return VC_ERROR_OUT_OF_MEMORY;
722 command->type = VC_COMMAND_TYPE_NONE;
723 command->format = VC_CMD_FORMAT_FIXED;
724 command->command = NULL;
725 command->parameter = NULL;
727 command->priority = 0;
728 command->key = VC_KEY_NONE;
729 command->modifier = VC_MODIFIER_NONE;
730 command->invocation_name = NULL;
731 command->appid = NULL;
732 command->fixed = NULL;
733 command->coordinates = NULL;
735 *vc_command = (vc_cmd_h)command;
737 SLOG(LOG_DEBUG, TAG_VCCMD, "[Create command][%p]", *vc_command);
739 return VC_ERROR_NONE;
742 int vc_cmd_destroy(vc_cmd_h vc_command)
744 if (0 != __vc_cmd_get_feature_enabled()) {
745 return VC_ERROR_NOT_SUPPORTED;
747 if (0 != __vc_cmd_check_privilege()) {
748 return VC_ERROR_PERMISSION_DENIED;
751 if (NULL == vc_command) {
752 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Input parameter is NULL");
753 return VC_ERROR_INVALID_PARAMETER;
756 vc_cmd_s* command = NULL;
757 command = (vc_cmd_s*)vc_command;
759 SLOG(LOG_DEBUG, TAG_VCCMD, "[Destroy command][%p]", command);
761 if (NULL != command) {
762 if (NULL != command->command) {
763 free(command->command);
764 command->command = NULL;
766 if (NULL != command->parameter) {
767 free(command->parameter);
768 command->parameter = NULL;
770 if (NULL != command->invocation_name) {
771 free(command->invocation_name);
772 command->invocation_name = NULL;
774 if (NULL != command->appid) {
775 free(command->appid);
776 command->appid = NULL;
778 if (NULL != command->fixed) {
779 free(command->fixed);
780 command->fixed = NULL;
782 if (NULL != command->coordinates) {
783 free(command->coordinates);
784 command->coordinates = NULL;
790 return VC_ERROR_NONE;
793 int vc_cmd_set_id(vc_cmd_h vc_command, int id)
795 if (0 != __vc_cmd_get_feature_enabled()) {
796 return VC_ERROR_NOT_SUPPORTED;
798 if (0 != __vc_cmd_check_privilege()) {
799 return VC_ERROR_PERMISSION_DENIED;
802 if (NULL == vc_command) {
803 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
804 return VC_ERROR_INVALID_PARAMETER;
807 vc_cmd_s* cmd = NULL;
808 cmd = (vc_cmd_s*)vc_command;
812 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set id][%p] id(%d)", vc_command, cmd->id);
818 int vc_cmd_get_id(vc_cmd_h vc_command, int* id)
820 if (0 != __vc_cmd_get_feature_enabled()) {
821 return VC_ERROR_NOT_SUPPORTED;
823 if (0 != __vc_cmd_check_privilege()) {
824 return VC_ERROR_PERMISSION_DENIED;
827 if (NULL == vc_command || NULL == id) {
828 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
829 return VC_ERROR_INVALID_PARAMETER;
832 vc_cmd_s* cmd = NULL;
833 cmd = (vc_cmd_s*)vc_command;
837 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get id][%p] id(%d)", vc_command, *id);
843 int vc_cmd_set_appid(vc_cmd_h vc_command, const char* appid)
845 if (0 != __vc_cmd_get_feature_enabled()) {
846 return VC_ERROR_NOT_SUPPORTED;
849 if (NULL == vc_command) {
850 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
851 return VC_ERROR_INVALID_PARAMETER;
855 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, appid is NULL");
856 return VC_ERROR_INVALID_PARAMETER;
859 vc_cmd_s* cmd = NULL;
860 cmd = (vc_cmd_s*)vc_command;
862 if (NULL != cmd->appid) {
867 cmd->appid = strdup(appid);
869 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set appid][%p] appid(%s)", vc_command, cmd->appid);
873 int vc_cmd_get_appid(vc_cmd_h vc_command, char** appid)
875 if (0 != __vc_cmd_get_feature_enabled()) {
876 return VC_ERROR_NOT_SUPPORTED;
879 if (NULL == vc_command || NULL == appid) {
880 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
881 return VC_ERROR_INVALID_PARAMETER;
884 vc_cmd_s* cmd = NULL;
885 cmd = (vc_cmd_s*)vc_command;
887 if (NULL != cmd->appid) {
888 *appid = strdup(gettext(cmd->appid));
891 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get appid][%p] appid(%s)", vc_command, *appid);
895 int vc_cmd_set_command(vc_cmd_h vc_command, const char* command)
897 if (0 != __vc_cmd_get_feature_enabled()) {
898 return VC_ERROR_NOT_SUPPORTED;
900 if (0 != __vc_cmd_check_privilege()) {
901 return VC_ERROR_PERMISSION_DENIED;
904 if (NULL == vc_command) {
905 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
906 return VC_ERROR_INVALID_PARAMETER;
909 vc_cmd_s* cmd = NULL;
910 cmd = (vc_cmd_s*)vc_command;
912 if (NULL != cmd->command) {
918 if (NULL != command) {
919 cmd->command = strdup(command);
922 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set command][%p] Command(%s)", vc_command, cmd->command);
927 int vc_cmd_get_command(vc_cmd_h vc_command, char** command)
929 if (0 != __vc_cmd_get_feature_enabled()) {
930 return VC_ERROR_NOT_SUPPORTED;
932 if (0 != __vc_cmd_check_privilege()) {
933 return VC_ERROR_PERMISSION_DENIED;
936 if (NULL == vc_command || NULL == command) {
937 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
938 return VC_ERROR_INVALID_PARAMETER;
941 vc_cmd_s* cmd = NULL;
942 cmd = (vc_cmd_s*)vc_command;
944 if (NULL != cmd->command) {
945 *command = strdup(gettext(cmd->command));
948 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get command][%p] Command(%s)", vc_command, *command);
953 int vc_cmd_set_unfixed_command(vc_cmd_h vc_command, const char* command)
955 if (0 != __vc_cmd_get_feature_enabled()) {
956 return VC_ERROR_NOT_SUPPORTED;
958 if (0 != __vc_cmd_check_privilege()) {
959 return VC_ERROR_PERMISSION_DENIED;
962 if (NULL == vc_command) {
963 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
964 return VC_ERROR_INVALID_PARAMETER;
967 vc_cmd_s* cmd = NULL;
968 cmd = (vc_cmd_s*)vc_command;
970 if (NULL != cmd->parameter) {
971 free(cmd->parameter);
974 cmd->parameter = NULL;
976 if (NULL != command) {
977 cmd->parameter = strdup(command);
978 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set unfixed command][%p] unfixed command(%s)", vc_command, cmd->parameter);
984 int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command)
986 if (0 != __vc_cmd_get_feature_enabled()) {
987 return VC_ERROR_NOT_SUPPORTED;
990 if (NULL == vc_command || NULL == command) {
991 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
992 return VC_ERROR_INVALID_PARAMETER;
995 vc_cmd_s* cmd = NULL;
996 cmd = (vc_cmd_s*)vc_command;
998 if (NULL != cmd->parameter) {
999 *command = strdup(gettext(cmd->parameter));
1000 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get unfixed command][%p] unfixed command(%s)", vc_command, *command);
1006 int vc_cmd_set_fixed_command(vc_cmd_h vc_command, const char* fixed)
1008 if (0 != __vc_cmd_get_feature_enabled()) {
1009 return VC_ERROR_NOT_SUPPORTED;
1012 if (NULL == vc_command) {
1013 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1014 return VC_ERROR_INVALID_PARAMETER;
1017 if (NULL == fixed) {
1018 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, fixed is NULL");
1019 return VC_ERROR_INVALID_PARAMETER;
1022 vc_cmd_s* cmd = NULL;
1023 cmd = (vc_cmd_s*)vc_command;
1025 if (NULL != cmd->fixed) {
1030 cmd->fixed = strdup(fixed);
1032 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set parameter][%p] fixed command(%s)", vc_command, cmd->fixed);
1036 int vc_cmd_get_fixed_command(vc_cmd_h vc_command, char** fixed)
1038 if (0 != __vc_cmd_get_feature_enabled()) {
1039 return VC_ERROR_NOT_SUPPORTED;
1042 if (NULL == vc_command || NULL == fixed) {
1043 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1044 return VC_ERROR_INVALID_PARAMETER;
1047 vc_cmd_s* cmd = NULL;
1048 cmd = (vc_cmd_s*)vc_command;
1050 if (NULL != cmd->fixed) {
1051 *fixed = strdup(gettext(cmd->fixed));
1052 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get fixed command][%p] fixed command(%s)", vc_command, *fixed);
1058 int vc_cmd_set_invocation_name(vc_cmd_h vc_command, const char* invocation_name)
1060 if (0 != __vc_cmd_get_feature_enabled()) {
1061 return VC_ERROR_NOT_SUPPORTED;
1064 if (NULL == vc_command) {
1065 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, vc_command is NULL");
1066 return VC_ERROR_INVALID_PARAMETER;
1069 if (NULL == invocation_name) {
1070 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter, invocation_name is NULL");
1071 return VC_ERROR_INVALID_PARAMETER;
1074 vc_cmd_s* cmd = NULL;
1075 cmd = (vc_cmd_s*)vc_command;
1077 if (NULL != cmd->invocation_name) {
1078 free(cmd->invocation_name);
1079 cmd->invocation_name = NULL;
1082 cmd->invocation_name = strdup(invocation_name);
1084 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set invocation name][%p] invocation_name(%s)", vc_command, cmd->invocation_name);
1088 int vc_cmd_get_invocation_name(vc_cmd_h vc_command, char** invocation_name)
1090 if (0 != __vc_cmd_get_feature_enabled()) {
1091 return VC_ERROR_NOT_SUPPORTED;
1094 if (NULL == vc_command || NULL == invocation_name) {
1095 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid handle ");
1096 return VC_ERROR_INVALID_PARAMETER;
1099 vc_cmd_s* cmd = NULL;
1100 cmd = (vc_cmd_s*)vc_command;
1102 if (NULL != cmd->invocation_name) {
1103 *invocation_name = strdup(gettext(cmd->invocation_name));
1106 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get invocation name][%p] invocation_name(%s)", vc_command, *invocation_name);
1110 int vc_cmd_set_type(vc_cmd_h vc_command, int type)
1112 if (0 != __vc_cmd_get_feature_enabled()) {
1113 return VC_ERROR_NOT_SUPPORTED;
1115 if (0 != __vc_cmd_check_privilege()) {
1116 return VC_ERROR_PERMISSION_DENIED;
1119 if (NULL == vc_command) {
1120 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1121 return VC_ERROR_INVALID_PARAMETER;
1124 vc_cmd_s* cmd = NULL;
1125 cmd = (vc_cmd_s*)vc_command;
1129 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set type][%p] type(%d)", vc_command, cmd->type);
1134 int vc_cmd_get_type(vc_cmd_h vc_command, int* type)
1136 if (0 != __vc_cmd_get_feature_enabled()) {
1137 return VC_ERROR_NOT_SUPPORTED;
1139 if (0 != __vc_cmd_check_privilege()) {
1140 return VC_ERROR_PERMISSION_DENIED;
1143 if (NULL == vc_command || NULL == type) {
1144 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1145 return VC_ERROR_INVALID_PARAMETER;
1148 vc_cmd_s* cmd = NULL;
1149 cmd = (vc_cmd_s*)vc_command;
1153 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get type][%p] type(%d)", vc_command, *type);
1158 int vc_cmd_set_format(vc_cmd_h vc_command, int format)
1160 if (0 != __vc_cmd_get_feature_enabled()) {
1161 return VC_ERROR_NOT_SUPPORTED;
1164 if (NULL == vc_command) {
1165 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1166 return VC_ERROR_INVALID_PARAMETER;
1169 vc_cmd_s* cmd = NULL;
1170 cmd = (vc_cmd_s*)vc_command;
1172 cmd->format = format;
1174 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set format][%p] format(%d)", vc_command, format);
1179 int vc_cmd_get_format(vc_cmd_h vc_command, int* format)
1181 if (0 != __vc_cmd_get_feature_enabled()) {
1182 return VC_ERROR_NOT_SUPPORTED;
1185 if (NULL == vc_command || NULL == format) {
1186 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1187 return VC_ERROR_INVALID_PARAMETER;
1190 vc_cmd_s* cmd = NULL;
1191 cmd = (vc_cmd_s*)vc_command;
1193 *format = cmd->format;
1195 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get format][%p] format(%d)", vc_command, *format);
1200 int vc_cmd_set_pid(vc_cmd_h vc_command, int pid)
1202 if (0 != __vc_cmd_get_feature_enabled()) {
1203 return VC_ERROR_NOT_SUPPORTED;
1205 if (0 != __vc_cmd_check_privilege()) {
1206 return VC_ERROR_PERMISSION_DENIED;
1209 if (NULL == vc_command) {
1210 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1211 return VC_ERROR_INVALID_PARAMETER;
1214 vc_cmd_s* cmd = NULL;
1215 cmd = (vc_cmd_s*)vc_command;
1219 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set pid][%p] pid(%d)", vc_command, cmd->pid);
1224 int vc_cmd_get_pid(vc_cmd_h vc_command, int* pid)
1226 if (0 != __vc_cmd_get_feature_enabled()) {
1227 return VC_ERROR_NOT_SUPPORTED;
1229 if (0 != __vc_cmd_check_privilege()) {
1230 return VC_ERROR_PERMISSION_DENIED;
1233 if (NULL == vc_command || NULL == pid) {
1234 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1235 return VC_ERROR_INVALID_PARAMETER;
1238 vc_cmd_s* cmd = NULL;
1239 cmd = (vc_cmd_s*)vc_command;
1243 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get pid][%p] pid(%d)", vc_command, *pid);
1248 int vc_cmd_set_domain(vc_cmd_h vc_command, int domain)
1250 if (0 != __vc_cmd_get_feature_enabled()) {
1251 return VC_ERROR_NOT_SUPPORTED;
1253 if (0 != __vc_cmd_check_privilege()) {
1254 return VC_ERROR_PERMISSION_DENIED;
1257 if (NULL == vc_command) {
1258 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1259 return VC_ERROR_INVALID_PARAMETER;
1262 vc_cmd_s* cmd = NULL;
1263 cmd = (vc_cmd_s*)vc_command;
1265 cmd->domain = domain;
1267 SLOG(LOG_DEBUG, TAG_VCCMD, "[Set domain] domain : %d", domain);
1272 int vc_cmd_get_domain(vc_cmd_h vc_command, int* domain)
1274 if (0 != __vc_cmd_get_feature_enabled()) {
1275 return VC_ERROR_NOT_SUPPORTED;
1277 if (0 != __vc_cmd_check_privilege()) {
1278 return VC_ERROR_PERMISSION_DENIED;
1281 if (NULL == vc_command || NULL == domain) {
1282 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1283 return VC_ERROR_INVALID_PARAMETER;
1286 vc_cmd_s* cmd = NULL;
1287 cmd = (vc_cmd_s*)vc_command;
1289 *domain = cmd->domain;
1291 SLOG(LOG_DEBUG, TAG_VCCMD, "[Get domain] domain : %d", *domain);
1297 * @brief Sets key value of command.
1299 * @param[in] vc_command Command handle
1300 * @param[in] key key value
1301 * @param[in] modifier modifier value
1303 * @return 0 on success, otherwise a negative error value
1304 * @retval #VC_ERROR_NONE Successful
1305 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1307 * @see vc_cmd_get_result_key()
1309 int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier)
1311 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Set result key");
1313 if (NULL == vc_command) {
1314 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1315 return VC_ERROR_INVALID_PARAMETER;
1318 vc_cmd_s* cmd = NULL;
1319 cmd = (vc_cmd_s*)vc_command;
1321 SLOG(LOG_DEBUG, TAG_VCCMD, "key : %d, modifier : %d", key, modifier);
1324 cmd->modifier = modifier;
1326 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1327 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1333 * @brief Gets key value of command.
1335 * @param[in] vc_command Command handle
1336 * @param[out] key key value
1337 * @param[out] modifier modifier value
1339 * @return 0 on success, otherwise a negative error value
1340 * @retval #VC_ERROR_NONE Successful
1341 * @retval #VC_ERROR_INVALID_PARAMETER Invalid parameter
1343 * @see vc_cmd_add_result_key()
1345 int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier)
1347 SLOG(LOG_DEBUG, TAG_VCCMD, "===== Get result key");
1349 if (NULL == vc_command || NULL == key || NULL == modifier) {
1350 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter ");
1351 return VC_ERROR_INVALID_PARAMETER;
1354 vc_cmd_s* cmd = NULL;
1355 cmd = (vc_cmd_s*)vc_command;
1358 *modifier = cmd->modifier;
1360 SLOG(LOG_DEBUG, TAG_VCCMD, "=====");
1361 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1366 int vc_cmd_print_list(vc_cmd_list_h vc_cmd_list)
1368 if (NULL == vc_cmd_list) {
1372 vc_cmd_list_s* list = NULL;
1373 list = (vc_cmd_list_s*)vc_cmd_list;
1375 SLOG(LOG_DEBUG, TAG_VCCMD, "=== Command List ===");
1376 SLOG(LOG_DEBUG, TAG_VCCMD, "[List][%p]", list);
1378 int count = g_slist_length(list->list);
1381 vc_cmd_s *cmd = NULL;
1383 for (i = 0; i < count ; i++) {
1384 cmd = g_slist_nth_data(list->list, i);
1387 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)",
1388 i, cmd, cmd->pid, cmd->index, cmd->type, cmd->format, cmd->command, cmd->parameter, cmd->appid, cmd->invocation_name, cmd->fixed);
1392 SLOG(LOG_DEBUG, TAG_VCCMD, "==================");
1393 SLOG(LOG_DEBUG, TAG_VCCMD, " ");
1398 int vc_cmd_get_nlu_json(vc_cmd_h vc_cmd, char** json)
1400 if (0 != __vc_cmd_get_feature_enabled()) {
1401 return VC_ERROR_NOT_SUPPORTED;
1404 if (NULL == vc_cmd || NULL == json) {
1405 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] NULL parameter");
1406 return VC_ERROR_INVALID_PARAMETER;
1409 vc_cmd_s* cmd = NULL;
1410 cmd = (vc_cmd_s*)vc_cmd;
1412 if (VC_CMD_FORMAT_ACTION != cmd->format) {
1413 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not Action format");
1414 return VC_ERROR_INVALID_PARAMETER;
1417 if (0 != vc_info_parser_get_nlu_result(json)) {
1418 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get nlu result");
1419 return VC_ERROR_OPERATION_FAILED;
1425 static void __vc_cmd_regex_deinit(int num_regex)
1427 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Start Deinitialize regex ====");
1430 for (i = 0; num_regex > i; i++) {
1434 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
1435 SLOG(LOG_DEBUG, TAG_VCCMD, "");
1438 static int __vc_cmd_regex_init()
1440 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Initialize regular expression ====");
1442 int cflags = REG_EXTENDED | REG_ICASE;
1448 vc_config_mgr_get_default_language(&lang);
1450 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1451 return VC_ERROR_OPERATION_FAILED;
1454 if (!strcmp("en_US", lang)) {
1456 } else if (!strcmp("ko_KR", lang)) {
1462 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Not supported language type");
1463 return VC_ERROR_INVALID_LANGUAGE;
1469 SLOG(LOG_DEBUG, TAG_VCCMD, "==== lang type > %d ====", lang_type);
1471 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1473 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s" , TIME_ABS1_REGEX[lang_type]);
1474 ret = regcomp(®[0], TIME_ABS1_REGEX[lang_type], cflags);
1476 regerror(ret, ®[0], errStr, sizeof(errStr));
1478 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1479 return VC_ERROR_OPERATION_FAILED;
1482 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS2_REGEX[lang_type]);
1483 ret = regcomp(®[1], TIME_ABS2_REGEX[lang_type], cflags);
1485 regerror(ret, ®[1], errStr, sizeof(errStr));
1486 __vc_cmd_regex_deinit(1);
1488 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1489 return VC_ERROR_OPERATION_FAILED;
1492 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_ABS3_REGEX[lang_type]);
1493 ret = regcomp(®[2], TIME_ABS3_REGEX[lang_type], cflags);
1495 regerror(ret, ®[2], errStr, sizeof(errStr));
1496 __vc_cmd_regex_deinit(2);
1498 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1499 return VC_ERROR_OPERATION_FAILED;
1502 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL1_REGEX[lang_type]);
1503 ret = regcomp(®[3], TIME_REL1_REGEX[lang_type], cflags);
1505 regerror(ret, ®[3], errStr, sizeof(errStr));
1506 __vc_cmd_regex_deinit(3);
1508 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1509 return VC_ERROR_OPERATION_FAILED;
1512 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL2_REGEX[lang_type]);
1513 ret = regcomp(®[4], TIME_REL2_REGEX[lang_type], cflags);
1515 regerror(ret, ®[4], errStr, sizeof(errStr));
1516 __vc_cmd_regex_deinit(4);
1518 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1519 return VC_ERROR_OPERATION_FAILED;
1522 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_REL3_REGEX[lang_type]);
1523 ret = regcomp(®[5], TIME_REL3_REGEX[lang_type], cflags);
1525 regerror(ret, ®[5], errStr, sizeof(errStr));
1526 __vc_cmd_regex_deinit(5);
1528 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1529 return VC_ERROR_OPERATION_FAILED;
1532 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", TIME_PHR_REGEX[lang_type]);
1533 ret = regcomp(®[6], TIME_PHR_REGEX[lang_type], cflags);
1535 regerror(ret, ®[6], errStr, sizeof(errStr));
1536 __vc_cmd_regex_deinit(6);
1538 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1539 return VC_ERROR_OPERATION_FAILED;
1542 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS1_REGEX[lang_type]);
1543 ret = regcomp(®[7], DATE_ABS1_REGEX[lang_type], cflags);
1545 regerror(ret, ®[7], errStr, sizeof(errStr));
1546 __vc_cmd_regex_deinit(7);
1548 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1549 return VC_ERROR_OPERATION_FAILED;
1552 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS2_REGEX[lang_type]);
1553 ret = regcomp(®[8], DATE_ABS2_REGEX[lang_type], cflags);
1555 regerror(ret, ®[8], errStr, sizeof(errStr));
1556 __vc_cmd_regex_deinit(8);
1558 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1559 return VC_ERROR_OPERATION_FAILED;
1562 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_ABS3_REGEX[lang_type]);
1563 ret = regcomp(®[9], DATE_ABS3_REGEX[lang_type], cflags);
1565 regerror(ret, ®[9], errStr, sizeof(errStr));
1566 __vc_cmd_regex_deinit(9);
1568 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1569 return VC_ERROR_OPERATION_FAILED;
1572 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR1_REGEX[lang_type]);
1573 ret = regcomp(®[10], DATE_PHR1_REGEX[lang_type], cflags);
1575 regerror(ret, ®[10], errStr, sizeof(errStr));
1576 __vc_cmd_regex_deinit(10);
1578 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1579 return VC_ERROR_OPERATION_FAILED;
1582 SLOG(LOG_DEBUG, TAG_VCCMD, "Regular expression > %s", DATE_PHR2_REGEX[lang_type]);
1583 ret = regcomp(®[11], DATE_PHR2_REGEX[lang_type], cflags);
1585 regerror(ret, ®[11], errStr, sizeof(errStr));
1586 __vc_cmd_regex_deinit(11);
1588 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] regcomp() error > %s", errStr);
1589 return VC_ERROR_OPERATION_FAILED;
1592 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
1593 SLOG(LOG_DEBUG, TAG_VCCMD, "");
1595 return VC_ERROR_NONE;
1598 static void __vc_cmd_add_year(struct tm *td, int year)
1600 td->tm_year += year;
1603 static void __vc_cmd_add_mon(struct tm *td, int mon)
1607 mon = td->tm_mon + mon;
1611 __vc_cmd_add_year(td, year);
1614 td->tm_mon = mon % 12;
1617 static void __vc_cmd_add_mday(struct tm *td, int mday)
1619 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
1620 int year = td->tm_year + 1900;
1624 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) max_day[1] = 29;
1626 mday = td->tm_mday + mday;
1628 for (mon = td->tm_mon; mday >= max_day[mon % 12]; mon++) {
1629 mday -= max_day[mon % 12];
1631 if (11 == mon % 12) {
1634 if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400) {
1642 mon = mon - td->tm_mon;
1645 __vc_cmd_add_mon(td, mon);
1651 static void __vc_cmd_add_hour(struct tm *td, int hour)
1655 hour = td->tm_hour + hour;
1659 __vc_cmd_add_mday(td, day);
1662 td->tm_hour = hour % 24;
1665 static void __vc_cmd_add_min(struct tm *td, int min)
1669 min = td->tm_min + min;
1673 __vc_cmd_add_hour(td, hour);
1676 td->tm_min = min % 60;
1679 static void __copy_struct_tm(struct tm *des, struct tm *src)
1681 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Start to copy struct tm ====");
1683 des->tm_sec = src->tm_sec;
1684 des->tm_min = src->tm_min;
1685 des->tm_hour = src->tm_hour;
1686 des->tm_mday = src->tm_mday;
1687 des->tm_mon = src->tm_mon;
1688 des->tm_year = src->tm_year;
1689 des->tm_wday = src->tm_wday;
1690 des->tm_yday = src->tm_yday;
1691 des->tm_isdst = src->tm_isdst;
1693 des->tm_gmtoff = src->tm_gmtoff;
1694 des->tm_zone = src->tm_zone;
1697 static void __update_data_sidx(int idx)
1699 if (0 > g_data_sidx || idx < g_data_sidx) g_data_sidx = idx;
1702 static void __update_data_eidx(int idx)
1704 if (0 > g_data_eidx || idx > g_data_eidx) g_data_eidx = idx;
1707 static int __vc_cmd_tphrase_check(const char *str, struct tm *td, int *exist)
1709 regmatch_t pmatch[3];
1715 ret = regexec(®[6], str, 3, pmatch, 0);
1718 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1720 if (12 < td->tm_hour) {
1721 __vc_cmd_add_mday(td, 1);
1727 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1729 __vc_cmd_add_mday(td, 1);
1734 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1736 __update_data_sidx(pmatch[0].rm_so);
1737 __update_data_eidx(pmatch[0].rm_eo);
1740 return VC_ERROR_NONE;
1743 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1744 return VC_ERROR_NONE;
1747 static int __vc_cmd_trelative_check(const char *str, struct tm *td, int *exist)
1749 regmatch_t pmatch[2];
1757 char *tempstr = NULL;
1760 ret = regexec(®[3], str, 1, pmatch, 0);
1762 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str+pmatch[0].rm_so);
1765 sidx = pmatch[0].rm_so;
1766 eidx = pmatch[0].rm_eo;
1768 ret = regexec(®[4], str, 2, pmatch, 0);
1770 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1773 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1774 return VC_ERROR_OPERATION_FAILED;
1776 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1778 if (NULL == tempstr) {
1779 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1780 return VC_ERROR_OUT_OF_MEMORY;
1783 hour = atoi(tempstr);
1788 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1790 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1791 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1794 ret = regexec(®[5], str, 2, pmatch, 0);
1796 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1799 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1800 return VC_ERROR_OPERATION_FAILED;
1802 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1804 if (NULL == tempstr) {
1805 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1806 return VC_ERROR_OUT_OF_MEMORY;
1809 min = atoi(tempstr);
1814 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1816 if (pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1817 if (pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1820 if (hour < 0 && min < 0) {
1821 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1822 return VC_ERROR_NONE;
1825 hour = 0 > hour ? 0 : hour;
1826 min = 0 > min ? 0 : min;
1828 min = min + (hour * 60);
1830 __vc_cmd_add_min(td, min);
1833 __update_data_sidx(sidx);
1834 __update_data_eidx(eidx);
1837 return VC_ERROR_NONE;
1840 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1841 return VC_ERROR_NONE;
1844 static int __vc_cmd_tabsolute_check(const char *str, struct tm *td, int *exist)
1846 regmatch_t pmatch[5];
1855 char *tempstr = NULL;
1858 ret = regexec(®[0], str, 5, pmatch, 0);
1860 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
1864 sidx = pmatch[0].rm_so;
1865 eidx = pmatch[0].rm_eo;
1868 ret = regexec(®[1], str, 2, pmatch, 0);
1870 len = pmatch[1].rm_eo - pmatch[1].rm_so;
1873 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
1874 return VC_ERROR_OPERATION_FAILED;
1876 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
1878 if (NULL == tempstr) {
1879 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1880 return VC_ERROR_OUT_OF_MEMORY;
1883 hour = atoi(tempstr);
1886 hour = hour + 12 * flag;
1888 if (12 == hour) hour = 0;
1889 else if (24 == hour) hour = 12;
1892 if (0 > hour || 24 <= hour || (0 == flag && 12 < hour)) {
1893 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1894 return VC_ERROR_NONE;
1900 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
1902 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1903 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1904 } else if (0 < flag) {
1905 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1906 return VC_ERROR_NONE;
1909 ret = regexec(®[2], str, 2, pmatch, 0);
1912 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
1914 tempstr = strndup(str + pmatch[idx].rm_so, (size_t)len);
1916 if (NULL == tempstr) {
1917 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
1918 return VC_ERROR_OUT_OF_MEMORY;
1921 min = atoi(tempstr);
1923 if (0 > min || 60 <= min) {
1924 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1925 return VC_ERROR_NONE;
1937 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", pmatch[0].rm_eo - pmatch[0].rm_so, str + pmatch[0].rm_so);
1938 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
1939 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
1942 if (0 > hour && 0 > min) {
1943 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
1944 return VC_ERROR_NONE;
1947 if (0 <= min && 0 <= hour) {
1948 if (hour < td->tm_hour || (hour == td->tm_hour && min <= td->tm_min)) __vc_cmd_add_mday(td, 1);
1952 } else if (0 <= min) {
1954 vc_config_mgr_get_default_language(&lang);
1956 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
1957 return VC_ERROR_OPERATION_FAILED;
1960 if (!strcmp("en_US", lang)) {
1961 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
1964 return VC_ERROR_NONE;
1966 if (min <= td->tm_min) __vc_cmd_add_hour(td, 1);
1973 if (hour <= td->tm_hour) __vc_cmd_add_mday(td, 1);
1981 __update_data_sidx(sidx);
1982 __update_data_eidx(eidx);
1985 return VC_ERROR_NONE;
1988 static int __vc_cmd_dphrase_check(const char *str, struct tm *td, int *exist)
1990 regmatch_t pmatch[10];
1996 ret = regexec(®[10], str, 5, pmatch, 0);
1998 for (idx = 1; 5 > idx && 0 >= pmatch[idx].rm_eo - pmatch[idx].rm_so; idx++);
2000 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2002 td->tm_year = td_now.tm_year;
2003 td->tm_mon = td_now.tm_mon;
2004 td->tm_mday = td_now.tm_mday;
2006 __vc_cmd_add_mday(td, idx - 1);
2008 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2010 __update_data_sidx(pmatch[0].rm_so);
2011 __update_data_eidx(pmatch[0].rm_eo);
2014 return VC_ERROR_NONE;
2017 ret = regexec(®[11], str, 10, pmatch, 0);
2019 for (idx = 1; 10 > idx; idx++) {
2020 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2025 td->tm_year = td_now.tm_year;
2026 td->tm_mon = td_now.tm_mon;
2027 td->tm_mday = td_now.tm_mday;
2029 __vc_cmd_add_mday(td, idx + 1);
2031 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2033 __update_data_sidx(pmatch[0].rm_so);
2034 __update_data_eidx(pmatch[0].rm_eo);
2037 return VC_ERROR_NONE;
2040 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no matched string");
2041 return VC_ERROR_NONE;
2044 static int __vc_cmd_dabsolute_check(const char *str, struct tm *td, int *exist)
2046 regmatch_t pmatch[13];
2057 char *tempstr = NULL;
2060 ret = regexec(®[9], str, 2, pmatch, 0);
2062 len = pmatch[1].rm_eo - pmatch[1].rm_so;
2065 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2066 return VC_ERROR_OPERATION_FAILED;
2068 tempstr = strndup(str + pmatch[1].rm_so, (size_t)len);
2070 if (NULL == tempstr) {
2071 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2072 return VC_ERROR_OUT_OF_MEMORY;
2075 day = atoi(tempstr);
2080 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2082 sidx = pmatch[0].rm_so;
2083 eidx = pmatch[0].rm_eo;
2085 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2086 return VC_ERROR_NONE;
2089 ret = regexec(®[8], str, 13, pmatch, 0);
2091 for (idx = 1; 13 > idx; idx++) {
2092 len = pmatch[idx].rm_eo - pmatch[idx].rm_so;
2102 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2104 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2105 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2108 vc_config_mgr_get_default_language(&lang);
2110 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Fail to get current language");
2111 return VC_ERROR_OPERATION_FAILED;
2114 if (!strcmp("en_US", lang)) {
2115 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2118 return VC_ERROR_NONE;
2127 ret = regexec(®[7], str, 3, pmatch, 0);
2129 if (!m_flag) return -1;
2131 len = pmatch[2].rm_eo - pmatch[2].rm_so;
2134 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid string length");
2135 return VC_ERROR_OPERATION_FAILED;
2137 tempstr = strndup(str + pmatch[2].rm_so, (size_t)len);
2139 if (NULL == tempstr) {
2140 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Memory allocation is failed");
2141 return VC_ERROR_OUT_OF_MEMORY;
2144 year = atoi(tempstr);
2145 year = 1900 < year ? year - 1900 : year + 100;
2151 SLOG(LOG_DEBUG, TAG_VCCMD, "Matched string > %.*s", len, str + pmatch[0].rm_so);
2153 if (0 > sidx || pmatch[0].rm_so < sidx) sidx = pmatch[0].rm_so;
2154 if (0 > eidx || pmatch[0].rm_eo > eidx) eidx = pmatch[0].rm_eo;
2159 if (0 > g_time_flag) {
2163 } else if (2 == g_time_flag) {
2164 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2165 return VC_ERROR_NONE;
2168 int max_day[12] = {31, 28, 31, 30, 31, 30, 31, 30, 30, 31, 30, 31};
2169 if ((0 == (year + 1900) % 4 && 0 != (year + 1900) % 100) || 0 == (year + 1900) % 400) max_day[1] = 29;
2171 if (max_day[mon] < day || 1 > day) {
2172 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] Incomming sentence is weird");
2173 return VC_ERROR_NONE;
2182 if (day < td_now.tm_mday) __vc_cmd_add_mon(td, 1);
2184 if (mon < td_now.tm_mon) __vc_cmd_add_year(td, 1);
2185 else if (mon == td_now.tm_mon && day < td_now.tm_mday) __vc_cmd_add_year(td, 1);
2189 __update_data_sidx(sidx);
2190 __update_data_eidx(eidx);
2193 return VC_ERROR_NONE;
2196 static int __vc_cmd_time_check(const char *str, struct tm *td)
2198 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Check time value in string \"%s\"", str);
2203 ret = __vc_cmd_tphrase_check(str, td, &exist);
2207 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Time value is exist");
2209 } else if (VC_ERROR_NONE != ret) {
2210 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2214 ret = __vc_cmd_trelative_check(str, td, &exist);
2218 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Time value is exist");
2220 } else if (VC_ERROR_NONE != ret) {
2221 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2225 ret = __vc_cmd_tabsolute_check(str, td, &exist);
2229 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Time value is exist");
2231 } else if (VC_ERROR_NONE != ret) {
2232 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2236 SLOG(LOG_DEBUG, TAG_VCCMD, "==== There is no time value");
2237 return VC_ERROR_NONE;
2240 static int __vc_cmd_date_check(const char *str, struct tm *td)
2242 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Check date value in string \"%s\"", str);
2247 ret = __vc_cmd_dphrase_check(str, td, &exist);
2251 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Date value is exist");
2253 } else if (VC_ERROR_NONE != ret) {
2254 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2258 ret = __vc_cmd_dabsolute_check(str, td, &exist);
2262 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Date value is exist");
2264 } else if (VC_ERROR_NONE != ret) {
2265 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured > (%d)", ret);
2269 SLOG(LOG_DEBUG, TAG_VCCMD, "==== There is no date value");
2270 return VC_ERROR_NONE;
2273 int vc_cmd_get_datetime(const char *text, time_t *result, char **remain)
2275 SLOG(LOG_DEBUG, TAG_VCCMD, "==== Get timestamp data");
2278 const char *day_name[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
2281 if (NULL == text || NULL == result || NULL == remain) {
2282 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Invalid parameter");
2283 return VC_ERROR_INVALID_PARAMETER;
2287 ret = __vc_cmd_regex_init();
2288 if (VC_ERROR_NONE != ret) {
2289 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] initialize regex failed");
2293 g_data_sidx = g_data_eidx = -1;
2296 localtime_r(&t_now, &td_now);
2297 SLOG(LOG_DEBUG, TAG_VCCMD, "Current timestamp = %d", (int)t_now);
2299 __copy_struct_tm(&td, &td_now);
2300 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2301 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);
2303 g_time_flag = g_date_flag = -1;
2305 ret = __vc_cmd_time_check(text, &td);
2306 if (VC_ERROR_NONE != ret) {
2307 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured in the check > (%d)", ret);
2311 ret = __vc_cmd_date_check(text, &td);
2312 if (VC_ERROR_NONE != ret) {
2313 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Error is occured in the check > (%d)", ret);
2317 __vc_cmd_regex_deinit(12);
2319 if (g_time_flag > 0 || g_date_flag > 0) {
2320 *result = mktime(&td);
2322 SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result);
2323 SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d",
2324 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);
2326 *remain = (char *)calloc(sizeof(char), (strlen(text) + 1 - g_data_eidx + g_data_sidx));
2328 if (NULL == *remain) {
2329 SLOG(LOG_ERROR, TAG_VCCMD, "[ERROR] Out of memory error");
2330 return VC_ERROR_OUT_OF_MEMORY;
2333 strncpy(*remain, text, g_data_sidx);
2334 strncat(*remain, text + g_data_eidx, strlen(text) - g_data_eidx);
2336 SLOG(LOG_DEBUG, TAG_VCCMD, "[REGEX] There is no data in the text");
2339 SLOG(LOG_DEBUG, TAG_VCCMD, "====");
2340 SLOG(LOG_DEBUG, TAG_VCCMD, "");
2342 return VC_ERROR_NONE;