2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
16 #include <sys/inotify.h>
21 #include "tts_client.h"
23 #define INIT_WAITING_TIME 5000
24 #define WAITING_TIME 1000
26 #define BUFFER_SIZE 20
28 static Ecore_Fd_Handler* g_fd_handler = NULL;
30 static DBusConnection* g_conn = NULL;
32 static Ecore_Fd_Handler* g_fd_handler_noti = NULL;
36 extern int __tts_cb_error(int uid, tts_error_e reason, int utt_id);
38 extern int __tts_cb_set_state(int uid, int state);
40 extern int __tts_cb_utt_started(int uid, int utt_id);
42 extern int __tts_cb_utt_completed(int uid, int utt_id);
45 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
47 DBusConnection* conn = (DBusConnection*)data;
49 if (NULL == conn) return ECORE_CALLBACK_RENEW;
51 dbus_connection_read_write_dispatch(conn, 50);
53 DBusMessage* msg = NULL;
54 msg = dbus_connection_pop_message(conn);
56 /* loop again if we haven't read a message */
58 return ECORE_CALLBACK_RENEW;
62 dbus_error_init(&err);
64 DBusMessage *reply = NULL;
67 snprintf(if_name, 64, "%s%d", TTS_CLIENT_SERVICE_INTERFACE, getpid());
69 /* check if the message is a signal from the correct interface and with the correct name */
70 if (dbus_message_is_method_call(msg, if_name, TTSD_METHOD_HELLO)) {
71 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get Hello");
75 dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID);
78 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts get hello : uid(%d) \n", uid);
81 tts_client_s* client = tts_client_get_by_uid(uid);
87 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get hello : invalid uid \n");
90 reply = dbus_message_new_method_return(msg);
93 dbus_message_append_args(reply, DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID);
95 if (!dbus_connection_send(conn, reply, NULL))
96 SLOG(LOG_ERROR, TAG_TTSC, ">>>> tts get hello : fail to send reply");
98 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> tts get hello : result(%d)", response);
100 dbus_connection_flush(conn);
101 dbus_message_unref(reply);
103 SLOG(LOG_ERROR, TAG_TTSC, ">>>> tts get hello : fail to create reply message");
106 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
107 SLOG(LOG_DEBUG, TAG_TTSC, " ");
108 } /* TTSD_METHOD_HELLO */
111 else if (dbus_message_is_method_call(msg, if_name, TTSD_METHOD_UTTERANCE_STARTED)) {
112 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get utterance started");
114 dbus_message_get_args(msg, &err,
115 DBUS_TYPE_INT32, &uid,
116 DBUS_TYPE_INT32, &uttid,
119 if (dbus_error_is_set(&err)) {
120 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get Utterance started - Get arguments error (%s)\n", err.message);
121 dbus_error_free(&err);
123 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get Utterance started message : uid(%d), uttid(%d) \n", uid, uttid);
124 __tts_cb_utt_started(uid, uttid);
127 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
128 SLOG(LOG_DEBUG, TAG_TTSC, " ");
129 }/* TTS_SIGNAL_UTTERANCE_STARTED */
131 else if (dbus_message_is_method_call(msg, if_name, TTSD_METHOD_UTTERANCE_COMPLETED)) {
132 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get utterance completed");
134 dbus_message_get_args(msg, &err,
135 DBUS_TYPE_INT32, &uid,
136 DBUS_TYPE_INT32, &uttid,
139 if (dbus_error_is_set(&err)) {
140 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get Utterance completed - Get arguments error (%s)\n", err.message);
141 dbus_error_free(&err);
143 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get Utterance completed message : uid(%d), uttid(%d) \n", uid, uttid);
144 __tts_cb_utt_completed(uid, uttid);
147 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
148 SLOG(LOG_DEBUG, TAG_TTSC, " ");
149 }/* TTS_SIGNAL_UTTERANCE_COMPLETED */
151 else if (dbus_message_is_method_call(msg, if_name, TTSD_METHOD_SET_STATE)) {
152 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get state changed callback");
155 dbus_message_get_args(msg, &err,
156 DBUS_TYPE_INT32, &uid,
157 DBUS_TYPE_INT32, &state,
160 if (dbus_error_is_set(&err)) {
161 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get state change - Get arguments error (%s)", err.message);
162 dbus_error_free(&err);
164 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get state change : uid(%d) , state(%d)", uid, state);
165 __tts_cb_set_state(uid, state);
168 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
169 SLOG(LOG_DEBUG, TAG_TTSC, " ");
170 } /* TTSD_METHOD_SET_STATE */
173 else if (dbus_message_is_method_call(msg, if_name, TTSD_METHOD_ERROR)) {
174 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get error callback");
180 dbus_message_get_args(msg, &err,
181 DBUS_TYPE_INT32, &uid,
182 DBUS_TYPE_INT32, &uttid,
183 DBUS_TYPE_INT32, &reason,
186 if (dbus_error_is_set(&err)) {
187 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get Error signal - Get arguments error (%s)\n", err.message);
188 dbus_error_free(&err);
190 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get Error signal : uid(%d), error(%d), uttid(%d)\n", uid, reason, uttid);
191 __tts_cb_error(uid, reason, uttid);
194 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
195 SLOG(LOG_DEBUG, TAG_TTSC, " ");
196 }/* TTS_SIGNAL_ERROR */
198 /* free the message */
199 dbus_message_unref(msg);
201 return ECORE_CALLBACK_PASS_ON;
204 int tts_dbus_open_connection()
206 if (NULL != g_conn) {
207 SLOG(LOG_WARN, TAG_TTSC, "already existed connection ");
214 /* initialise the error value */
215 dbus_error_init(&err);
217 /* connect to the DBUS system bus, and check for errors */
218 g_conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
220 if (dbus_error_is_set(&err)) {
221 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Connection Error (%s)\n", err.message);
222 dbus_error_free(&err);
225 if (NULL == g_conn) {
226 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] fail to get dbus connection \n");
227 return TTS_ERROR_OPERATION_FAILED;
230 dbus_connection_set_exit_on_disconnect(g_conn, false);
234 char service_name[64];
235 memset(service_name, 0, 64);
236 snprintf(service_name, 64, "%s%d", TTS_CLIENT_SERVICE_NAME, pid);
238 SLOG(LOG_DEBUG, TAG_TTSC, "Service name is %s\n", service_name);
240 /* register our name on the bus, and check for errors */
241 ret = dbus_bus_request_name(g_conn, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
243 if (dbus_error_is_set(&err)) {
244 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Name Error (%s)\n", err.message);
245 dbus_error_free(&err);
248 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
249 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection : Service name has already been existed. \n");
250 return TTS_ERROR_OPERATION_FAILED;
254 snprintf(rule, 128, "type='signal',interface='%s%d'", TTS_CLIENT_SERVICE_INTERFACE, pid);
256 /* add a rule for which messages we want to see */
257 dbus_bus_add_match(g_conn, rule, &err);
258 dbus_connection_flush(g_conn);
260 if (dbus_error_is_set(&err)) {
261 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Match Error (%s)\n", err.message);
262 return TTS_ERROR_OPERATION_FAILED;
266 dbus_connection_get_unix_fd(g_conn, &fd);
268 g_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn, NULL, NULL);
270 if (NULL == g_fd_handler) {
271 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get fd handler from ecore \n");
272 return TTS_ERROR_OPERATION_FAILED;
279 int tts_dbus_close_connection()
282 dbus_error_init(&err);
284 ecore_main_fd_handler_del(g_fd_handler);
288 char service_name[64];
289 memset(service_name, 0, 64);
290 snprintf(service_name, 64, "%s%d", TTS_CLIENT_SERVICE_NAME, pid);
292 dbus_bus_release_name (g_conn, service_name, &err);
294 dbus_connection_close(g_conn);
303 int tts_dbus_reconnect()
305 bool connected = dbus_connection_get_is_connected(g_conn);
306 SLOG(LOG_DEBUG, TAG_TTSC, "[DBUS] %s\n", connected ? "Connected" : "Not connected");
308 if (false == connected) {
309 tts_dbus_close_connection();
311 if(0 != tts_dbus_open_connection()) {
312 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to reconnect");
316 SLOG(LOG_DEBUG, TAG_TTSC, "[DBUS] Reconnect");
322 DBusMessage* __tts_dbus_make_message(int uid, const char* method)
324 if (NULL == method) {
325 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input method is NULL");
329 tts_client_s* client = tts_client_get_by_uid(uid);
332 if (NULL == client) {
333 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] uid is not available");
339 if (TTS_MODE_DEFAULT == client->mode) {
340 msg = dbus_message_new_method_call(
341 TTS_SERVER_SERVICE_NAME,
342 TTS_SERVER_SERVICE_OBJECT_PATH,
343 TTS_SERVER_SERVICE_INTERFACE,
345 } else if (TTS_MODE_NOTIFICATION == client->mode) {
346 msg = dbus_message_new_method_call(
347 TTS_NOTI_SERVER_SERVICE_NAME,
348 TTS_NOTI_SERVER_SERVICE_OBJECT_PATH,
349 TTS_NOTI_SERVER_SERVICE_INTERFACE,
351 } else if (TTS_MODE_SCREEN_READER == client->mode) {
352 msg = dbus_message_new_method_call(
353 TTS_SR_SERVER_SERVICE_NAME,
354 TTS_SR_SERVER_SERVICE_OBJECT_PATH,
355 TTS_SR_SERVER_SERVICE_INTERFACE,
358 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input mode is not available");
365 int tts_dbus_request_hello(int uid)
369 msg = __tts_dbus_make_message(uid, TTS_METHOD_HELLO);
372 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts hello : Fail to make message \n");
373 return TTS_ERROR_OPERATION_FAILED;
377 dbus_error_init(&err);
379 DBusMessage* result_msg = NULL;
382 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, WAITING_TIME, &err);
384 dbus_message_unref(msg);
386 if (NULL != result_msg) {
387 dbus_message_unref(result_msg);
389 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts hello");
392 result = TTS_ERROR_OPERATION_FAILED;
398 int tts_dbus_request_initialize(int uid)
402 dbus_error_init(&err);
404 msg = __tts_dbus_make_message(uid, TTS_METHOD_INITIALIZE);
407 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts initialize : Fail to make message \n");
408 if (dbus_error_is_set(&err))
409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
411 return TTS_ERROR_OPERATION_FAILED;
413 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts initialize : uid(%d)", uid);
417 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
418 dbus_message_unref(msg);
419 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
421 return TTS_ERROR_OPERATION_FAILED;
424 DBusMessage* result_msg;
425 int result = TTS_ERROR_OPERATION_FAILED;
427 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, INIT_WAITING_TIME, &err);
428 dbus_message_unref(msg);
430 if (dbus_error_is_set(&err))
431 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
433 if (NULL != result_msg) {
434 dbus_message_get_args(result_msg, &err,
435 DBUS_TYPE_INT32, &result,
438 if (dbus_error_is_set(&err)) {
439 SLOG(LOG_ERROR, TAG_TTSC, "Get arguments error (%s)\n", err.message);
440 dbus_error_free(&err);
441 result = TTS_ERROR_OPERATION_FAILED;
444 dbus_message_unref(result_msg);
446 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
447 if (dbus_error_is_set(&err))
448 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
449 tts_dbus_reconnect();
453 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts initialize : result = %d \n", result);
455 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts initialize : result = %d \n", result);
462 int tts_dbus_request_finalize(int uid)
466 dbus_error_init(&err);
468 msg = __tts_dbus_make_message(uid, TTS_METHOD_FINALIZE);
471 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts finalize : Fail to make message");
472 if (dbus_error_is_set(&err))
473 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
475 return TTS_ERROR_OPERATION_FAILED;
477 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts finalize : uid(%d)", uid);
480 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
481 dbus_message_unref(msg);
482 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
484 return TTS_ERROR_OPERATION_FAILED;
487 DBusMessage* result_msg;
488 int result = TTS_ERROR_OPERATION_FAILED;
490 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, WAITING_TIME, &err);
491 dbus_message_unref(msg);
493 if (dbus_error_is_set(&err))
494 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
496 if (NULL != result_msg) {
497 dbus_message_get_args(result_msg, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
499 if (dbus_error_is_set(&err)) {
500 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get arguments error (%s)\n", err.message);
501 dbus_error_free(&err);
502 result = TTS_ERROR_OPERATION_FAILED;
505 dbus_message_unref(result_msg);
507 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
508 if (dbus_error_is_set(&err))
509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
510 tts_dbus_reconnect();
514 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts finalize : result = %d \n", result);
516 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts finalize : result = %d \n", result);
522 int tts_dbus_request_get_support_voice(int uid, tts_h tts, tts_supported_voice_cb callback, void* user_data)
526 dbus_error_init(&err);
528 msg = __tts_dbus_make_message(uid, TTS_METHOD_GET_SUPPORT_VOICES);
531 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts get supported voices : Fail to make message");
532 if (dbus_error_is_set(&err))
533 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
535 return TTS_ERROR_OPERATION_FAILED;
537 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts get supported voices : uid(%d)", uid);
540 if (true != dbus_message_append_args( msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
541 dbus_message_unref(msg);
542 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
544 return TTS_ERROR_OPERATION_FAILED;
547 DBusMessage* result_msg;
548 DBusMessageIter args;
549 int result = TTS_ERROR_OPERATION_FAILED;
551 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, WAITING_TIME, &err );
552 dbus_message_unref(msg);
554 if (dbus_error_is_set(&err)) {
555 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
556 printf("result message : %p\n", result_msg);
559 if (NULL != result_msg) {
560 if (dbus_message_iter_init(result_msg, &args)) {
562 if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args)) {
563 dbus_message_iter_get_basic(&args, &result);
564 dbus_message_iter_next(&args);
568 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts get supported voices : result = %d \n", result);
575 if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&args)) {
576 dbus_message_iter_get_basic(&args, &size);
577 dbus_message_iter_next(&args);
581 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts size of voice error : size = %d \n", size);
584 for (i=0 ; i<size ; i++) {
585 dbus_message_iter_get_basic(&args, &(temp_char) );
586 dbus_message_iter_next(&args);
587 dbus_message_iter_get_basic(&args, &(temp_int) );
588 dbus_message_iter_next(&args);
590 if (true != callback(tts, temp_char, (tts_voice_type_e)temp_int, user_data)) {
596 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get supported voices : result = %d \n", result);
599 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get supported voices : result message is invalid \n");
600 result = TTS_ERROR_OPERATION_FAILED;
602 dbus_message_unref(result_msg);
604 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL");
605 if (dbus_error_is_set(&err))
606 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
607 tts_dbus_reconnect();
613 int tts_dbus_request_get_default_voice(int uid , char** lang, tts_voice_type_e* vctype)
615 if (NULL == lang || NULL == vctype) {
616 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
617 return TTS_ERROR_INVALID_PARAMETER;
622 dbus_error_init(&err);
624 msg = __tts_dbus_make_message(uid, TTS_METHOD_GET_CURRENT_VOICE);
627 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts get default voice : Fail to make message");
628 if (dbus_error_is_set(&err))
629 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
631 return TTS_ERROR_OPERATION_FAILED;
633 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts get default voice : uid(%d)", uid);
636 if (true != dbus_message_append_args( msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
637 dbus_message_unref(msg);
638 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
640 return TTS_ERROR_OPERATION_FAILED;
643 DBusMessage* result_msg;
644 int result = TTS_ERROR_OPERATION_FAILED;
648 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, WAITING_TIME, &err);
649 dbus_message_unref(msg);
651 if (dbus_error_is_set(&err)) {
652 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
653 printf("result message : %p\n", result_msg);
656 if (NULL != result_msg) {
657 dbus_message_get_args(result_msg, &err,
658 DBUS_TYPE_INT32, &result,
659 DBUS_TYPE_STRING, &temp_lang,
660 DBUS_TYPE_INT32, &voice_type,
663 if (dbus_error_is_set(&err)) {
664 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get arguments error (%s)\n", err.message);
665 dbus_error_free(&err);
666 result = TTS_ERROR_OPERATION_FAILED;
668 dbus_message_unref(result_msg);
670 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
671 if (dbus_error_is_set(&err))
672 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
673 tts_dbus_reconnect();
677 *lang = strdup(temp_lang);
678 *vctype = (tts_voice_type_e)voice_type;
681 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get default voice : Out of memory \n");
682 result = TTS_ERROR_OUT_OF_MEMORY;
684 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts get default voice : result(%d), lang(%s), vctype(%d) \n", result, *lang, *vctype);
687 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get default voice : result(%d) \n", result);
693 int tts_dbus_request_add_text(int uid, const char* text, const char* lang, int vctype, int speed, int uttid)
695 if (NULL == text || NULL == lang) {
696 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
697 return TTS_ERROR_INVALID_PARAMETER;
702 dbus_error_init(&err);
704 msg = __tts_dbus_make_message(uid, TTS_METHOD_ADD_QUEUE);
707 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts add text : Fail to make message");
708 if (dbus_error_is_set(&err))
709 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
711 return TTS_ERROR_OPERATION_FAILED;
713 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts add text : uid(%d), text(%s), lang(%s), type(%d), speed(%d), id(%d)",
714 uid, text, lang, vctype, speed, uttid);
717 if (true != dbus_message_append_args( msg,
718 DBUS_TYPE_INT32, &uid,
719 DBUS_TYPE_STRING, &text,
720 DBUS_TYPE_STRING, &lang,
721 DBUS_TYPE_INT32, &vctype,
722 DBUS_TYPE_INT32, &speed,
723 DBUS_TYPE_INT32, &uttid,
724 DBUS_TYPE_INVALID)) {
725 dbus_message_unref(msg);
726 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
728 return TTS_ERROR_OPERATION_FAILED;
731 DBusMessage* result_msg;
732 int result = TTS_ERROR_OPERATION_FAILED;
734 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, 5000, &err);
735 dbus_message_unref(msg);
737 if (dbus_error_is_set(&err))
738 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
740 if (NULL != result_msg) {
741 dbus_message_get_args(result_msg, &err,
742 DBUS_TYPE_INT32, &result,
745 if (dbus_error_is_set(&err)) {
746 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts add text : Get arguments error (%s)\n", err.message);
747 dbus_error_free(&err);
748 result = TTS_ERROR_OPERATION_FAILED;
750 dbus_message_unref(result_msg);
752 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
753 if (dbus_error_is_set(&err))
754 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
755 tts_dbus_reconnect();
759 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts add text : result(%d) \n", result);
761 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts add text : result(%d) \n", result);
767 int tts_dbus_request_play(int uid)
771 dbus_error_init(&err);
773 msg = __tts_dbus_make_message(uid, TTS_METHOD_PLAY);
776 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts play : Fail to make message");
777 if (dbus_error_is_set(&err))
778 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
780 return TTS_ERROR_OPERATION_FAILED;
782 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts play : uid(%d)", uid);
785 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
786 dbus_message_unref(msg);
787 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
789 return TTS_ERROR_OPERATION_FAILED;
792 DBusMessage* result_msg;
793 int result = TTS_ERROR_OPERATION_FAILED;
795 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, 5000, &err);
796 dbus_message_unref(msg);
798 if (dbus_error_is_set(&err))
799 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
801 if (NULL != result_msg) {
802 dbus_message_get_args(result_msg, &err,
803 DBUS_TYPE_INT32, &result,
806 if (dbus_error_is_set(&err)) {
807 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts play : Get arguments error (%s)\n", err.message);
808 dbus_error_free(&err);
809 result = TTS_ERROR_OPERATION_FAILED;
811 dbus_message_unref(result_msg);
813 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
814 if (dbus_error_is_set(&err))
815 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
816 tts_dbus_reconnect();
820 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts play : result(%d) \n", result);
822 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts play : result(%d) \n", result);
829 int tts_dbus_request_stop(int uid)
833 dbus_error_init(&err);
835 msg = __tts_dbus_make_message(uid, TTS_METHOD_STOP);
838 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts stop : Fail to make message");
839 if (dbus_error_is_set(&err))
840 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
842 return TTS_ERROR_OPERATION_FAILED;
844 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts stop : uid(%d)", uid);
847 DBusMessage* result_msg;
848 int result = TTS_ERROR_OPERATION_FAILED;
850 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
851 dbus_message_unref(msg);
852 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
854 return TTS_ERROR_OPERATION_FAILED;
857 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, 5000, &err);
858 dbus_message_unref(msg);
860 if (dbus_error_is_set(&err))
861 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
863 if (NULL != result_msg) {
864 dbus_message_get_args(result_msg, &err,
865 DBUS_TYPE_INT32, &result,
868 if (dbus_error_is_set(&err)) {
869 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts stop : Get arguments error (%s)\n", err.message);
870 dbus_error_free(&err);
871 result = TTS_ERROR_OPERATION_FAILED;
873 dbus_message_unref(result_msg);
875 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
876 if (dbus_error_is_set(&err))
877 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
878 tts_dbus_reconnect();
882 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts stop : result(%d) \n", result);
884 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts stop : result(%d) \n", result);
890 int tts_dbus_request_pause(int uid)
894 dbus_error_init(&err);
896 msg = __tts_dbus_make_message(uid, TTS_METHOD_PAUSE);
899 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts pause : Fail to make message");
900 if (dbus_error_is_set(&err))
901 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
903 return TTS_ERROR_OPERATION_FAILED;
905 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts pause : uid(%d)", uid);
908 DBusMessage* result_msg;
909 int result = TTS_ERROR_OPERATION_FAILED;
911 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &uid, DBUS_TYPE_INVALID)) {
912 dbus_message_unref(msg);
913 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
915 return TTS_ERROR_OPERATION_FAILED;
918 result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, 5000, &err);
919 dbus_message_unref(msg);
921 if (dbus_error_is_set(&err))
922 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
924 if (NULL != result_msg) {
925 dbus_message_get_args(result_msg, &err,
926 DBUS_TYPE_INT32, &result,
929 if (dbus_error_is_set(&err)) {
930 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts pause : Get arguments error (%s)\n", err.message);
931 dbus_error_free(&err);
932 result = TTS_ERROR_OPERATION_FAILED;
934 dbus_message_unref(result_msg);
936 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
937 if (dbus_error_is_set(&err))
938 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] %s", err.message);
939 tts_dbus_reconnect();
943 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts pause : result(%d) \n", result);
945 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts pause : result(%d) \n", result);
952 static Eina_Bool inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
954 SLOG(LOG_DEBUG, TAG_TTSC, "===== [File message] Inotify event call");
958 char buffer[sizeof(struct inotify_event) * BUFFER_SIZE];
960 length = read(g_fd_noti, buffer, (sizeof(struct inotify_event) * BUFFER_SIZE));
962 SLOG(LOG_ERROR, TAG_TTSC, "[File message] Empty Inotify event");
963 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
964 SLOG(LOG_DEBUG, TAG_TTSC, " ");
965 return ECORE_CALLBACK_RENEW;
968 bool is_empty_file = true;
971 memset(filename, 0, 64);
972 snprintf(filename, 64, "%s_%d", MESSAGE_FILE_PATH, getpid());
981 struct inotify_event *event = (struct inotify_event *)&buffer[i];
982 i = i + sizeof(struct inotify_event) + event->len;
984 if (IN_CLOSE_WRITE == event->mask) {
986 fp = fopen(filename, "r");
988 SLOG(LOG_ERROR, TAG_TTSC, "[File message ERROR] open file failed");
989 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
990 SLOG(LOG_DEBUG, TAG_TTSC, " ");
991 return ECORE_CALLBACK_RENEW;
994 while (NULL != fgets(text, 256, fp)) {
995 if (0 > sscanf(text, "%s %d %d", msg, &uid, &send_data)) {
996 SLOG(LOG_ERROR, TAG_TTSC, "[File message] sscanf failed");
999 SLOG(LOG_DEBUG, TAG_TTSC, "[File message] message - %s, uid - %d, send_data - %d", msg, uid, send_data);
1000 is_empty_file = false;
1003 if (!strcmp(TTSD_METHOD_UTTERANCE_STARTED, msg)) {
1005 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get Utterance started message : uid(%d), uttid(%d) \n", uid, uttid);
1006 __tts_cb_utt_started(uid, uttid);
1007 } else if (!strcmp(TTSD_METHOD_UTTERANCE_COMPLETED, msg)) {
1009 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get Utterance completed message : uid(%d), uttid(%d) \n", uid, uttid);
1010 __tts_cb_utt_completed(uid, uttid);
1012 } else if (!strcmp(TTSD_METHOD_SET_STATE, msg)) {
1013 int state = send_data;
1014 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< Get state change : uid(%d) , state(%d)", uid, state);
1015 __tts_cb_set_state(uid, state);
1020 SLOG(LOG_ERROR, TAG_TTSC, "[File message] Undefined event");
1024 if (true == is_empty_file)
1025 return ECORE_CALLBACK_PASS_ON;
1027 fp = fopen(filename, "w+");
1029 SLOG(LOG_ERROR, TAG_TTSC, "[File message ERROR] open file failed");
1034 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1035 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1037 return ECORE_CALLBACK_PASS_ON;
1040 int tts_file_msg_open_connection()
1042 /* get file notification handler */
1046 fd = inotify_init();
1048 SLOG(LOG_ERROR, TAG_TTSC, "[File message ERROR] Fail get inotify_fd");
1055 memset(path, 0, 64);
1056 snprintf(path, 64, "%s_%d", MESSAGE_FILE_PATH, pid);
1058 wd = inotify_add_watch(fd, path, IN_CLOSE_WRITE);
1060 g_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)inotify_event_callback, NULL, NULL, NULL);
1061 if (NULL == g_fd_handler_noti) {
1062 SLOG(LOG_ERROR, TAG_TTSC, "[File message ERROR] Fail to get handler_noti");
1068 int tts_file_msg_close_connection()
1070 /* del inotify variable */
1071 ecore_main_fd_handler_del(g_fd_handler_noti);
1072 inotify_rm_watch(g_fd_noti, g_wd_noti);