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.
21 #include "vcd_client_data.h"
22 #include "vcd_config.h"
23 #include "vcd_engine_agent.h"
25 #include "vcd_recorder.h"
28 * Internal data structure
36 /* engine load info */
39 bool is_command_ready;
42 vcpe_funcs_s* pefuncs;
43 vcpd_funcs_s* pdfuncs;
45 int (*vcp_load_engine)(vcpd_funcs_s* pdfuncs, vcpe_funcs_s* pefuncs);
46 int (*vcp_unload_engine)();
49 typedef struct _vcengine_info {
60 /** vc engine agent init */
61 static bool g_agent_init;
64 static GList *g_engine_list;
66 /** current engine information */
67 static vcengine_s g_dynamic_engine;
69 static char* g_default_lang;
71 /** callback functions */
72 static result_callback g_result_cb;
74 bool __supported_language_cb(const char* language, void* user_data);
76 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* engine_setting, bool use_network, void* user_data);
78 bool __engine_setting_cb(const char* key, const char* value, void* user_data);
80 /** Free voice list */
81 void __free_language_list(GList* lang_list);
88 /** check engine id */
89 int __internal_check_engine_id(const char* engine_uuid);
91 /** update engine list */
92 int __internal_update_engine_list();
94 /** get engine info */
95 int __internal_get_engine_info(const char* filepath, vcengine_info_s** info);
97 int __log_enginelist();
100 * VCS Engine Agent Interfaces
102 int vcd_engine_agent_init(result_callback result_cb)
104 if (NULL == result_cb) {
105 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Input parameter is NULL");
106 return VCD_ERROR_OPERATION_FAILED;
109 /* init dynamic engine */
110 g_dynamic_engine.engine_uuid = NULL;
111 g_dynamic_engine.engine_name = NULL;
112 g_dynamic_engine.engine_path = NULL;
114 g_dynamic_engine.is_set = false;
115 g_dynamic_engine.is_loaded = false;
116 g_dynamic_engine.handle = NULL;
117 g_dynamic_engine.is_command_ready = false;
118 g_dynamic_engine.pefuncs = (vcpe_funcs_s*)calloc(1, sizeof(vcpe_funcs_s));
119 g_dynamic_engine.pdfuncs = (vcpd_funcs_s*)calloc(1, sizeof(vcpd_funcs_s));
123 g_result_cb = result_cb;
125 if (0 != vcd_config_get_default_language(&g_default_lang)) {
126 SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] There is No default voice in config");
127 /* Set default voice */
128 g_default_lang = strdup(VC_BASE_LANGUAGE);
131 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine Agent Initialize");
136 int vcd_engine_agent_release()
138 if (false == g_agent_init) {
139 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
140 return VCD_ERROR_OPERATION_FAILED;
143 /* unload current engine */
144 vcd_engine_agent_unload_current_engine();
146 /* release engine list */
148 vcengine_s *data = NULL;
150 if (g_list_length(g_engine_list) > 0) {
151 /* Get a first item */
152 iter = g_list_first(g_engine_list);
154 while (NULL != iter) {
155 /* Get handle data from list */
157 iter = g_list_remove(iter, data);
163 /* release current engine data */
164 if (NULL != g_dynamic_engine.pefuncs) free(g_dynamic_engine.pefuncs);
165 if (NULL != g_dynamic_engine.pdfuncs) free(g_dynamic_engine.pdfuncs);
167 g_agent_init = false;
169 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine Agent release");
174 bool vcd_engine_is_available_engine()
176 if (true == g_dynamic_engine.is_loaded)
182 int vcd_engine_agent_initialize_current_engine()
184 /* check agent init */
185 if (false == g_agent_init) {
186 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
187 return VCD_ERROR_OPERATION_FAILED;
190 /* update engine list */
191 if (0 != __internal_update_engine_list()) {
192 SLOG(LOG_ERROR, TAG_VCD, "[engine agent] vcd_engine_agent_init : __internal_update_engine_list : no engine error");
193 return VCD_ERROR_ENGINE_NOT_FOUND;
196 /* check whether engine id is valid or not.*/
198 vcengine_info_s *dynamic_engine = NULL;
200 if (g_list_length(g_engine_list) > 0) {
202 iter = g_list_first(g_engine_list);
204 while (NULL != iter) {
205 /*Get handle data from list*/
206 dynamic_engine = iter->data;
207 if (NULL != dynamic_engine) {
212 iter = g_list_next(iter);
215 return VCD_ERROR_ENGINE_NOT_FOUND;
218 if (NULL == dynamic_engine) {
219 return VCD_ERROR_ENGINE_NOT_FOUND;
221 if (NULL != g_dynamic_engine.engine_uuid) {
222 /* set data from g_engine_list */
223 if (g_dynamic_engine.engine_uuid != NULL) free(g_dynamic_engine.engine_uuid);
224 if (g_dynamic_engine.engine_name != NULL) free(g_dynamic_engine.engine_name);
225 if (g_dynamic_engine.engine_path != NULL) free(g_dynamic_engine.engine_path);
228 g_dynamic_engine.engine_uuid = g_strdup(dynamic_engine->engine_uuid);
229 g_dynamic_engine.engine_name = g_strdup(dynamic_engine->engine_name);
230 g_dynamic_engine.engine_path = g_strdup(dynamic_engine->engine_path);
232 g_dynamic_engine.handle = NULL;
233 g_dynamic_engine.is_loaded = false;
234 g_dynamic_engine.is_set = true;
236 SLOG(LOG_DEBUG, TAG_VCD, "-----");
237 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine uuid : %s", g_dynamic_engine.engine_uuid);
238 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine name : %s", g_dynamic_engine.engine_name);
239 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine path : %s", g_dynamic_engine.engine_path);
240 SLOG(LOG_DEBUG, TAG_VCD, "-----");
247 int __internal_check_engine_id(const char* engine_uuid)
249 if (NULL == engine_uuid) {
250 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
251 return VCD_ERROR_INVALID_PARAMETER;
255 vcengine_s *data = NULL;
257 if (0 < g_list_length(g_engine_list)) {
259 iter = g_list_first(g_engine_list);
261 while (NULL != iter) {
264 if (0 == strncmp(engine_uuid, data->engine_uuid, strlen(data->engine_uuid))) {
268 iter = g_list_next(iter);
275 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* engine_setting, bool use_network, void* user_data)
277 vcengine_info_s* temp = (vcengine_info_s*)user_data;
279 temp->engine_uuid = g_strdup(engine_uuid);
280 temp->engine_name = g_strdup(engine_name);
284 int __internal_get_engine_info(const char* filepath, vcengine_info_s** info)
286 if (NULL == filepath || NULL == info) {
287 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
288 return VCD_ERROR_INVALID_PARAMETER;
295 handle = dlopen(filepath, RTLD_LAZY);
297 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine : %s", filepath);
301 /* link engine to daemon */
302 dlsym(handle, "vcp_load_engine");
303 if ((error = dlerror()) != NULL) {
304 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine. Fail to open vcp_load_engine : %s", filepath);
309 dlsym(handle, "vcp_unload_engine");
310 if ((error = dlerror()) != NULL) {
311 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine. Fail to open vcp_unload_engine : %s", filepath);
316 int (*get_engine_info)(vcpe_engine_info_cb callback, void* user_data);
318 get_engine_info = (int (*)(vcpe_engine_info_cb, void*))dlsym(handle, "vcp_get_engine_info");
319 if (NULL != (error = dlerror()) || NULL == get_engine_info) {
320 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] Invalid engine. Fail to open vcp_get_engine_info : %s", filepath);
325 vcengine_info_s* temp;
326 temp = (vcengine_info_s*)calloc(1, sizeof(vcengine_info_s));
328 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
330 return VCD_ERROR_OUT_OF_MEMORY;
333 /* get engine info */
334 if (0 != get_engine_info(__engine_info_cb, (void*)temp)) {
335 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get engine info from engine");
344 temp->engine_path = g_strdup(filepath);
346 SLOG(LOG_DEBUG, TAG_VCD, "----- Valid Engine");
347 SLOG(LOG_DEBUG, TAG_VCD, "Engine uuid : %s", temp->engine_uuid);
348 SLOG(LOG_DEBUG, TAG_VCD, "Engine name : %s", temp->engine_name);
349 SLOG(LOG_DEBUG, TAG_VCD, "Engine path : %s", temp->engine_path);
350 SLOG(LOG_DEBUG, TAG_VCD, "-----");
351 SLOG(LOG_DEBUG, TAG_VCD, " ");
358 int __internal_update_engine_list()
360 /* relsease engine list */
362 vcengine_info_s *data = NULL;
364 if (0 < g_list_length(g_engine_list)) {
365 /* Get a first item */
366 iter = g_list_first(g_engine_list);
368 while (NULL != iter) {
369 /* Get handle data from list */
373 if (NULL != data->engine_uuid) free(data->engine_uuid);
374 if (NULL != data->engine_path) free(data->engine_path);
375 if (NULL != data->engine_name) free(data->engine_name);
380 g_engine_list = g_list_remove_link(g_engine_list, iter);
381 iter = g_list_first(g_engine_list);
385 /* Get file name from default engine directory */
389 struct dirent *dirp = NULL;
391 dp = opendir(VC_DEFAULT_ENGINE);
394 ret = readdir_r(dp, &entry, &dirp);
396 SLOG(LOG_ERROR, TAG_VCD, "[File ERROR] Fail to read directory");
401 vcengine_info_s* info = NULL;
402 char* filepath = NULL;
405 filesize = strlen(VC_DEFAULT_ENGINE) + strlen(dirp->d_name) + 5;
406 filepath = (char*)calloc(filesize, sizeof(char));
408 if (NULL != filepath) {
409 snprintf(filepath, filesize, "%s/%s", VC_DEFAULT_ENGINE, dirp->d_name);
411 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Memory not enough!!");
415 /* get its info and update engine list */
416 if (0 == __internal_get_engine_info(filepath, &info)) {
417 /* add engine info to g_engine_list */
418 g_engine_list = g_list_append(g_engine_list, info);
421 if (NULL != filepath) {
426 } while (NULL != dirp);
430 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] Fail to open default directory");
433 if (0 >= g_list_length(g_engine_list)) {
434 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] No Engine");
435 return VCD_ERROR_ENGINE_NOT_FOUND;
444 int __foreach_command(vcp_cmd_h vc_command, vcpd_foreach_command_cb callback, void* user_data)
446 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request foreach command from engine");
447 return vcd_client_foreach_command((client_foreach_command_cb)callback, user_data);
450 int __command_get_length(vcp_cmd_h vc_command)
452 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request command length from engine");
453 return vcd_client_get_length();
456 int __get_audio_type(char** audio_type)
458 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request audio type");
460 return vcd_recorder_get(audio_type);
463 void __result_cb(vcp_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed, const char* msg, void *user_data)
465 SLOG(LOG_DEBUG, TAG_VCD, "[Engine agent] Event(%d), Count(%d) Text(%s) Nonfixed(%s) Msg(%s)", event, count, all_result, non_fixed, msg);
467 if (NULL != g_result_cb) {
468 g_result_cb(event, result_id, count, all_result, non_fixed, msg, user_data);
470 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] Result callback function is NOT valid");
476 int __load_engine(vcengine_s* engine)
478 /* check whether current engine is loaded or not */
479 if (true == engine->is_loaded) {
480 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Engine has already been loaded ");
484 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Current engine path : %s", engine->engine_path);
488 engine->handle = dlopen(engine->engine_path, RTLD_LAZY);
490 if ((error = dlerror()) != NULL || !engine->handle) {
491 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get engine handle");
492 return VCD_ERROR_OPERATION_FAILED;
495 engine->vcp_unload_engine = (int (*)())dlsym(engine->handle, "vcp_unload_engine");
496 if ((error = dlerror()) != NULL) {
497 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to link daemon to vcp_unload_engine()");
498 dlclose(engine->handle);
499 return VCD_ERROR_OPERATION_FAILED;
502 engine->vcp_load_engine = (int (*)(vcpd_funcs_s*, vcpe_funcs_s*))dlsym(engine->handle, "vcp_load_engine");
503 if (NULL != (error = dlerror()) || NULL == engine->vcp_load_engine) {
504 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to link daemon to vcp_load_engine()");
505 dlclose(engine->handle);
506 return VCD_ERROR_OPERATION_FAILED;
510 engine->pdfuncs->version = 1;
511 engine->pdfuncs->size = sizeof(vcpd_funcs_s);
513 engine->pdfuncs->foreach_command = __foreach_command;
514 engine->pdfuncs->get_command_count = __command_get_length;
515 engine->pdfuncs->get_audio_type = __get_audio_type;
517 if (0 != engine->vcp_load_engine(engine->pdfuncs, engine->pefuncs)) {
518 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail vcp_load_engine()");
519 dlclose(engine->handle);
520 return VCD_ERROR_OPERATION_FAILED;
523 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] engine info : version(%d), size(%d)", engine->pefuncs->version, engine->pefuncs->size);
525 /* engine error check */
526 if (engine->pefuncs->size != sizeof(vcpe_funcs_s)) {
527 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not valid");
528 return VCD_ERROR_OPERATION_FAILED;
531 /* Check all engine functions */
532 if (NULL == engine->pefuncs->initialize ||
533 NULL == engine->pefuncs->deinitialize ||
534 NULL == engine->pefuncs->foreach_langs ||
535 NULL == engine->pefuncs->is_lang_supported ||
536 NULL == engine->pefuncs->set_result_cb ||
537 NULL == engine->pefuncs->set_language ||
538 NULL == engine->pefuncs->set_recording ||
539 NULL == engine->pefuncs->stop ||
540 NULL == engine->pefuncs->cancel) {
541 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The current engine is NOT valid");
542 return VCD_ERROR_OPERATION_FAILED;
545 /* initalize engine */
546 if (0 != engine->pefuncs->initialize()) {
547 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to initialize vc-engine");
548 return VCD_ERROR_OPERATION_FAILED;
551 if (0 != engine->pefuncs->set_result_cb(__result_cb, NULL)) {
552 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set result callback of vc-engine");
553 return VCD_ERROR_OPERATION_FAILED;
557 if (true == engine->pefuncs->is_lang_supported(g_default_lang)) {
558 if (0 != engine->pefuncs->set_language(g_default_lang)) {
559 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to load current engine");
560 return VCD_ERROR_OPERATION_FAILED;
562 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] The %s has been loaded !!!", engine->engine_name);
563 engine->is_loaded = true;
565 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] This engine do not support default language : lang(%s)", g_default_lang);
566 engine->is_loaded = false;
572 int vcd_engine_agent_load_current_engine()
574 if (false == g_agent_init) {
575 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
576 return VCD_ERROR_OPERATION_FAILED;
579 if (true == g_dynamic_engine.is_set) {
580 if (0 != __load_engine(&g_dynamic_engine)) {
581 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to load dynamic engine");
583 /* need to initialize dynamic engine data */
584 g_dynamic_engine.is_loaded = false;
586 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Load dynamic engine");
593 int vcd_engine_agent_unload_current_engine()
595 if (false == g_agent_init) {
596 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized ");
597 return VCD_ERROR_OPERATION_FAILED;
600 if (true == g_dynamic_engine.is_set) {
601 /* unload dynamic engine */
602 if (true == g_dynamic_engine.is_loaded) {
603 /* shutdown engine */
604 g_dynamic_engine.pefuncs->deinitialize();
605 g_dynamic_engine.vcp_unload_engine();
606 dlclose(g_dynamic_engine.handle);
607 g_dynamic_engine.handle = NULL;
608 g_dynamic_engine.is_loaded = false;
616 * VCS Engine Interfaces for client
619 int vcd_engine_set_commands()
621 if (false == g_agent_init) {
622 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
623 return VCD_ERROR_OPERATION_FAILED;
628 if (true == g_dynamic_engine.is_loaded) {
629 /* Set dynamic command */
630 ret = g_dynamic_engine.pefuncs->set_commands((vcp_cmd_h)0);
632 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent ERROR] Fail to set command of dynamic engine : error(%d)", ret);
633 g_dynamic_engine.is_command_ready = false;
635 g_dynamic_engine.is_command_ready = true;
638 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] set command");
640 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Dynamic engine is not available");
646 int vcd_engine_recognize_start(bool silence)
648 if (false == g_agent_init) {
649 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
650 return VCD_ERROR_OPERATION_FAILED;
654 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] silence is %s", silence ? "true" : "false");
656 if (true == g_dynamic_engine.is_loaded && true == g_dynamic_engine.is_command_ready) {
657 ret = g_dynamic_engine.pefuncs->start(silence);
659 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] Fail to start engine error(%d)", ret);
660 return VCD_ERROR_OPERATION_FAILED;
663 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Engine is not available (Cannot start)");
664 return VCD_ERROR_OPERATION_FAILED;
667 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine start");
671 int vcd_engine_recognize_audio(const void* data, unsigned int length, vcp_speech_detect_e* speech_detected)
673 if (false == g_agent_init) {
674 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
675 return VCD_ERROR_OPERATION_FAILED;
679 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
680 return VCD_ERROR_INVALID_PARAMETER;
685 if (true == g_dynamic_engine.is_loaded) {
686 ret = g_dynamic_engine.pefuncs->set_recording(data, length, speech_detected);
688 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set recording dynamic engine error(%d)", ret);
689 return VCD_ERROR_OPERATION_FAILED;
696 int vcd_engine_recognize_stop()
698 if (false == g_agent_init) {
699 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
700 return VCD_ERROR_OPERATION_FAILED;
703 if (true == g_dynamic_engine.is_loaded) {
705 ret = g_dynamic_engine.pefuncs->stop();
707 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to stop dynamic engine error(%d)", ret);
708 return VCD_ERROR_OPERATION_FAILED;
711 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Dynamic engine is not recording state");
712 return VCD_ERROR_OPERATION_FAILED;
718 int vcd_engine_recognize_cancel()
720 if (false == g_agent_init) {
721 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
722 return VCD_ERROR_OPERATION_FAILED;
726 if (true == g_dynamic_engine.is_loaded) {
727 ret = g_dynamic_engine.pefuncs->cancel();
729 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to cancel dynamic engine error(%d)", ret);
738 * VCS Engine Interfaces for client and setting
741 int vcd_engine_get_audio_format(const char* audio_id, vcp_audio_type_e* types, int* rate, int* channels)
743 if (false == g_agent_init) {
744 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
745 return VCD_ERROR_OPERATION_FAILED;
748 if (true != g_dynamic_engine.is_loaded) {
749 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not loaded");
752 if (NULL == g_dynamic_engine.pefuncs->get_recording_format) {
753 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The function of engine is NULL!!");
754 return VCD_ERROR_OPERATION_FAILED;
757 int ret = g_dynamic_engine.pefuncs->get_recording_format(audio_id, types, rate, channels);
759 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] get recording format(%d)", ret);
760 return VCD_ERROR_OPERATION_FAILED;
766 bool __supported_language_cb(const char* language, void* user_data)
768 GList** lang_list = (GList**)user_data;
770 if (NULL == language || NULL == lang_list) {
771 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Input parameter is NULL in callback!!!!");
775 SLOG(LOG_DEBUG, TAG_VCD, "-- Language(%s)", language);
777 char* temp_lang = g_strdup(language);
779 *lang_list = g_list_append(*lang_list, temp_lang);
784 int vcd_engine_supported_langs(GList** lang_list)
786 if (false == g_agent_init) {
787 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
788 return VCD_ERROR_OPERATION_FAILED;
791 if (true != g_dynamic_engine.is_loaded) {
792 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not loaded");
795 if (NULL == g_dynamic_engine.pefuncs->foreach_langs) {
796 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The function of engine is NULL!!");
797 return VCD_ERROR_OPERATION_FAILED;
800 int ret = g_dynamic_engine.pefuncs->foreach_langs(__supported_language_cb, (void*)lang_list);
802 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] get language list error(%d)", ret);
803 return VCD_ERROR_OPERATION_FAILED;
810 int vcd_engine_get_current_language(char** lang)
812 if (false == g_agent_init) {
813 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
814 return VCD_ERROR_OPERATION_FAILED;
818 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
819 return VCD_ERROR_INVALID_PARAMETER;
822 /* get default language */
823 *lang = g_strdup(g_default_lang);
828 int vcd_engine_set_current_language(const char* language)
830 if (false == g_agent_init) {
831 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
832 return VCD_ERROR_OPERATION_FAILED;
835 if (NULL == language) {
836 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
837 return VCD_ERROR_INVALID_PARAMETER;
842 if (true == g_dynamic_engine.is_loaded) {
843 g_dynamic_engine.is_command_ready = false;
845 ret = g_dynamic_engine.pefuncs->set_language(language);
847 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Fail to set language of dynamic engine error(%d, %s)", ret, language);
850 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Dynamic engine is not available (Cannot start)");
856 void __free_language_list(GList* lang_list)
861 /* if list have item */
862 if (g_list_length(lang_list) > 0) {
863 /* Get a first item */
864 iter = g_list_first(lang_list);
866 while (NULL != iter) {
872 lang_list = g_list_remove_link(lang_list, iter);
874 iter = g_list_first(lang_list);
879 int __log_enginelist()
882 vcengine_info_s *data = NULL;
884 if (0 < g_list_length(g_engine_list)) {
886 /* Get a first item */
887 iter = g_list_first(g_engine_list);
889 SLOG(LOG_DEBUG, TAG_VCD, "--------------- engine list -------------------");
892 while (NULL != iter) {
893 /* Get handle data from list */
896 SLOG(LOG_DEBUG, TAG_VCD, "[%dth]", i);
897 SLOG(LOG_DEBUG, TAG_VCD, " engine uuid : %s", data->engine_uuid);
898 SLOG(LOG_DEBUG, TAG_VCD, " engine name : %s", data->engine_name);
899 SLOG(LOG_DEBUG, TAG_VCD, " engine path : %s", data->engine_path);
900 iter = g_list_next(iter);
903 SLOG(LOG_DEBUG, TAG_VCD, "----------------------------------------------");
905 SLOG(LOG_DEBUG, TAG_VCD, "-------------- engine list -------------------");
906 SLOG(LOG_DEBUG, TAG_VCD, " No Engine in engine directory");
907 SLOG(LOG_DEBUG, TAG_VCD, "----------------------------------------------");