2 * Copyright (c) 2011-2016 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.
17 #include <sys/inotify.h>
20 #include "tts_client.h"
21 #include "tts_config_mgr.h"
25 #include "tts_internal.h"
27 #define HELLO_WAITING_TIME -1
28 #define WAITING_TIME 5000
30 static DBusConnection* g_conn_sender = NULL;
31 static DBusConnection* g_conn_listener = NULL;
33 static Ecore_Fd_Handler* g_dbus_fd_handler = NULL;
35 static int g_connected_client = 0;
38 static int __tts_dbus_add_match(unsigned int uid)
40 /* add a rule for daemon error */
41 tts_client_s* client = tts_client_get_by_uid(uid);
43 SLOG(LOG_ERROR, TAG_TTSC, "Fail to get TTS client");
44 return TTS_ERROR_OPERATION_FAILED;
47 char rule_err[256] = {0, };
48 snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", TTS_SERVER_SERVICE_INTERFACE);
50 /* initialize the error value */
52 dbus_error_init(&err);
54 dbus_bus_add_match(g_conn_listener, rule_err, &err);
55 dbus_connection_flush(g_conn_listener);
57 if (dbus_error_is_set(&err)) {
58 SLOG(LOG_ERROR, TAG_TTSC, "Match Error (%s)", err.message);
59 dbus_error_free(&err);
60 return TTS_ERROR_OPERATION_FAILED;
62 client->reason = 0; // default value
64 return TTS_ERROR_NONE;
67 static void __tts_dbus_remove_match()
70 dbus_error_init(&err);
72 /* remove a rule for daemon error */
73 char rule_err[256] = {0, };
74 snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", TTS_SERVER_SERVICE_INTERFACE);
76 dbus_bus_remove_match(g_conn_listener, rule_err, &err);
77 dbus_connection_flush(g_conn_listener);
78 if (dbus_error_is_set(&err)) {
79 SLOG(LOG_ERROR, TAG_TTSC, "Match Error (%s)", err.message);
80 dbus_error_free(&err);
83 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] dbus match is removed");
86 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
88 if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW;
90 dbus_connection_read_write_dispatch(g_conn_listener, 50);
93 DBusMessage* msg = NULL;
94 msg = dbus_connection_pop_message(g_conn_listener);
96 if (true != dbus_connection_get_is_connected(g_conn_listener)) {
97 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Connection is disconnected");
101 /* loop again if we haven't read a message */
107 dbus_error_init(&err);
109 char if_name[64] = {0, };
110 snprintf(if_name, 64, "%s%d", TTS_CLIENT_SERVICE_INTERFACE, getpid());
112 if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_HELLO)) {
113 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get Hello");
117 int credential_needed;
119 dbus_message_get_args(msg, &err,
120 DBUS_TYPE_UINT32, &uid,
121 DBUS_TYPE_INT32, &ret,
122 DBUS_TYPE_INT32, &credential_needed,
125 if (dbus_error_is_set(&err)) {
126 SLOG(LOG_ERROR, TAG_TTSC, "@@ tts Get Hello message : Get arguments error (%s)", err.message);
127 dbus_error_free(&err);
129 SLOG(LOG_ERROR, TAG_TTSC, "@@ tts Get Hello message : uid(%u), credential_needed(%d)", uid, credential_needed);
130 if (TTS_ERROR_ALREADY_INITIALIZED == ret && TTS_CREDENTIAL_NEEDED_ALREADY_INITIALIZED == credential_needed) {
131 SLOG(LOG_INFO, TAG_TTSC, "@@ tts Get Hello message : already initialized");
134 __tts_dbus_add_match(uid);
136 tts_core_receive_hello(uid, ret, credential_needed);
139 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
142 else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_UTTERANCE_STARTED)) {
143 unsigned int uid = 0;
146 dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &uttid, DBUS_TYPE_INVALID);
147 if (dbus_error_is_set(&err)) {
148 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get arguments error (%s)", err.message);
149 dbus_error_free(&err);
152 if (0 == tts_core_notify_utt_started(tts_client_get_by_uid(uid), uttid)) {
153 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts utterance started : uid(%u) uttid(%d)", uid, uttid);
155 } /* TTSD_METHOD_UTTERANCE_STARTED */
157 else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_UTTERANCE_COMPLETED)) {
158 unsigned int uid = 0;
161 dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &uttid, DBUS_TYPE_INVALID);
162 if (dbus_error_is_set(&err)) {
163 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get arguments error (%s)", err.message);
164 dbus_error_free(&err);
167 if (0 == tts_core_notify_utt_completeted(tts_client_get_by_uid(uid), uttid)) {
168 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts utterance completed : uid(%u) uttid(%d)", uid, uttid);
170 } /* TTS_SIGNAL_UTTERANCE_STARTED */
172 else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_SET_STATE)) {
173 unsigned int uid = 0;
176 dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
177 if (dbus_error_is_set(&err)) {
178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get arguments error (%s)", err.message);
179 dbus_error_free(&err);
182 if (0 == tts_core_notify_state_changed(tts_client_get_by_uid(uid), (tts_state_e)state)) {
183 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts state changed : uid(%u) state(%d)", uid, state);
185 } /* TTSD_SIGNAL_SET_STATE */
187 else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_SET_SERVICE_STATE)) {
188 unsigned int uid = TTS_INVALID_UID;
189 int before_state = 0;
190 int current_state = 0;
192 dbus_message_get_args(msg, &err, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &before_state, DBUS_TYPE_INT32, ¤t_state, DBUS_TYPE_INVALID);
193 if (dbus_error_is_set(&err)) {
194 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get arguments error (%s)", err.message);
195 dbus_error_free(&err);
198 // TODO: implement notifier
199 } /* TTSD_METHOD_SET_SERVICE_STATE */
201 else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_ERROR)) {
207 dbus_message_get_args(msg, &err,
208 DBUS_TYPE_UINT32, &uid,
209 DBUS_TYPE_INT32, &uttid,
210 DBUS_TYPE_INT32, &reason,
211 DBUS_TYPE_STRING, &err_msg,
214 if (dbus_error_is_set(&err)) {
215 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get Error message - Get arguments error (%s)", err.message);
216 dbus_error_free(&err);
218 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get Error message : uid(%u), error(%d), uttid(%d), err_msg(%s)", uid, reason, uttid, (NULL == err_msg) ? "NULL" : err_msg);
219 tts_core_notify_error_async(tts_client_get_by_uid(uid), reason, uttid, err_msg);
221 } /* TTSD_SIGNAL_ERROR */
223 else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameOwnerChanged")) {
224 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Owner Changed");
225 tts_core_handle_service_reset();
226 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
227 } /* NameOwnerChanged */
230 SLOG(LOG_DEBUG, TAG_TTSC, "Message is NOT valid");
231 const char* sender = dbus_message_get_sender(msg);
232 const char* destination = dbus_message_get_destination(msg);
233 const char* path = dbus_message_get_path(msg);
234 const char* interf = dbus_message_get_interface(msg);
235 const char* member = dbus_message_get_member(msg);
236 int type = dbus_message_get_type(msg);
237 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Message is NOT valid, sender(%s), destination(%s), path(%s), interface(%s), member(%s), type(%d)", sender, destination, path, interf, member, type);
239 dbus_message_unref(msg);
243 /* free the message */
244 dbus_message_unref(msg);
246 return ECORE_CALLBACK_PASS_ON;
249 static void __tts_dbus_connection_free()
251 if (NULL != g_conn_listener) {
252 dbus_connection_close(g_conn_listener);
253 dbus_connection_unref(g_conn_listener);
254 g_conn_listener = NULL;
256 if (NULL != g_conn_sender) {
257 dbus_connection_close(g_conn_sender);
258 dbus_connection_unref(g_conn_sender);
259 g_conn_sender = NULL;
263 static int __dbus_open_connection()
265 /* initialize the error value */
267 dbus_error_init(&err);
269 /* connect to the DBUS system bus, and check for errors */
270 g_conn_sender = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
271 if (dbus_error_is_set(&err)) {
272 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Connection Error (%s)", err.message);
273 dbus_error_free(&err);
276 if (NULL == g_conn_sender) {
277 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] fail to get dbus connection");
278 return TTS_ERROR_OPERATION_FAILED;
281 dbus_connection_set_exit_on_disconnect(g_conn_sender, false);
283 g_conn_listener = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
284 if (dbus_error_is_set(&err)) {
285 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Connection Error (%s)", err.message);
286 dbus_error_free(&err);
289 if (NULL == g_conn_listener) {
290 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] fail to get dbus connection for listener");
291 __tts_dbus_connection_free();
292 return TTS_ERROR_OPERATION_FAILED;
295 dbus_connection_set_exit_on_disconnect(g_conn_listener, false);
297 /* register our name on the bus, and check for errors */
298 dbus_bus_request_name(g_conn_listener, TTS_CLIENT_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
300 if (dbus_error_is_set(&err)) {
302 SLOG(LOG_ERROR, TAG_TTSC, "Name Error (%s)", err.message);
303 dbus_error_free(&err);
307 char rule[128] = {0, };
308 snprintf(rule, 128, "type='signal',interface='%s%d'", TTS_CLIENT_SERVICE_INTERFACE, getpid());
310 /* add a rule for which messages we want to see */
311 dbus_bus_add_match(g_conn_listener, rule, &err);
312 dbus_connection_flush(g_conn_listener);
315 if (true != dbus_connection_get_unix_fd(g_conn_listener, &fd)) {
316 SLOG(LOG_ERROR, TAG_TTSC, "Fail to get fd from dbus");
317 __tts_dbus_connection_free();
318 return TTS_ERROR_OPERATION_FAILED;
320 SLOG(LOG_DEBUG, TAG_TTSC, "Get fd from dbus : %d", fd);
323 g_dbus_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, NULL, NULL, NULL);
324 if (NULL == g_dbus_fd_handler) {
325 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get fd handler from ecore");
326 __tts_dbus_connection_free();
327 return TTS_ERROR_OPERATION_FAILED;
330 return TTS_ERROR_NONE;
333 int tts_dbus_open_connection(unsigned int uid)
335 if (NULL != g_conn_sender && NULL != g_conn_listener) {
336 SLOG(LOG_WARN, TAG_TTSC, "already existed connection ");
337 g_connected_client++;
339 return TTS_ERROR_NONE;
342 int ret = __dbus_open_connection();
343 if (TTS_ERROR_NONE == ret) {
344 g_connected_client++;
350 static int __dbus_close_connection()
352 if (NULL != g_dbus_fd_handler) {
353 ecore_main_fd_handler_del(g_dbus_fd_handler);
354 g_dbus_fd_handler = NULL;
357 __tts_dbus_connection_free();
359 return TTS_ERROR_NONE;
362 int tts_dbus_close_connection(unsigned int uid)
364 g_connected_client--;
366 if (0 == g_connected_client) {
367 return __dbus_close_connection();
370 return TTS_ERROR_NONE;
373 int tts_dbus_stop_listening(unsigned int uid)
375 tts_client_s* client = tts_client_get_by_uid(uid);
376 if (NULL == client) {
377 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] uid is not valid");
378 return TTS_ERROR_INVALID_PARAMETER;
381 __tts_dbus_remove_match();
382 return TTS_ERROR_NONE;
385 int tts_dbus_reconnect()
387 if (!g_conn_sender || !g_conn_listener) {
388 __dbus_close_connection();
390 if (0 != __dbus_open_connection()) {
391 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to reconnect");
395 SLOG(LOG_DEBUG, TAG_TTSC, "[DBUS] Reconnect");
399 bool sender_connected = dbus_connection_get_is_connected(g_conn_sender);
400 bool listener_connected = dbus_connection_get_is_connected(g_conn_listener);
401 SLOG(LOG_DEBUG, TAG_TTSC, "[DBUS] Sender(%s) Listener(%s)",
402 sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected");
404 if (false == sender_connected || false == listener_connected) {
405 __dbus_close_connection();
407 if (0 != __dbus_open_connection()) {
408 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to reconnect");
412 SLOG(LOG_DEBUG, TAG_TTSC, "[DBUS] Reconnect");
418 DBusMessage* __tts_dbus_make_message(unsigned int uid, const char* method)
420 if (NULL == method) {
421 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input method is NULL");
425 tts_client_s* client = tts_client_get_by_uid(uid);
426 if (NULL == client) {
427 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] uid is not available");
431 DBusMessage* msg = dbus_message_new_method_call(
432 TTS_SERVER_SERVICE_NAME,
433 TTS_SERVER_SERVICE_OBJECT_PATH,
434 TTS_SERVER_SERVICE_INTERFACE,
440 int tts_dbus_request_hello(unsigned int uid, tts_mode_e mode)
443 dbus_error_init(&err);
446 msg = __tts_dbus_make_message(uid, TTS_METHOD_HELLO);
448 if (dbus_error_is_set(&err)) {
449 // SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts dbus log : %s", err);
450 dbus_error_free(&err);
454 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts hello : Fail to make message");
455 return TTS_ERROR_OPERATION_FAILED;
459 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &mode, DBUS_TYPE_INVALID)) {
460 dbus_message_unref(msg);
461 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
463 return TTS_ERROR_OPERATION_FAILED;
466 dbus_message_set_no_reply(msg, TRUE);
468 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
469 SLOG(LOG_ERROR, TAG_TTSC, "[Dbus ERROR] Fail to Send"); //LCOV_EXCL_LINE
470 dbus_message_unref(msg);
471 return TTS_ERROR_OPERATION_FAILED;
473 SLOG(LOG_INFO, TAG_TTSC, "[Dbus DEBUG] Success to Send");
474 dbus_connection_flush(g_conn_sender);
477 dbus_message_unref(msg);
481 int tts_dbus_request_hello_sync(unsigned int uid)
484 dbus_error_init(&err);
487 msg = __tts_dbus_make_message(uid, TTS_METHOD_HELLO_SYNC);
489 if (dbus_error_is_set(&err)) {
490 // SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts dbus log : %s", err);
491 dbus_error_free(&err);
495 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts hello : Fail to make message");
496 return TTS_ERROR_OPERATION_FAILED;
499 DBusMessage* result_msg = NULL;
502 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, HELLO_WAITING_TIME, &err);
503 dbus_message_unref(msg);
504 if (dbus_error_is_set(&err)) {
505 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts dbus log : %s", err.message);
506 dbus_error_free(&err);
509 if (NULL != result_msg) {
510 dbus_message_unref(result_msg);
512 // SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts hello");
515 result = TTS_ERROR_TIMED_OUT;
521 int tts_dbus_request_initialize(unsigned int uid, tts_mode_e mode, bool* credential_needed)
525 dbus_error_init(&err);
527 msg = __tts_dbus_make_message(uid, TTS_METHOD_INITIALIZE);
530 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts initialize : Fail to make message");
531 return TTS_ERROR_OPERATION_FAILED;
533 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts initialize : uid(%u)", uid);
537 if (true != dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INT32, &mode, DBUS_TYPE_INVALID)) {
538 dbus_message_unref(msg);
539 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
541 return TTS_ERROR_OPERATION_FAILED;
544 DBusMessage* result_msg;
545 int result = TTS_ERROR_OPERATION_FAILED;
547 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, WAITING_TIME, &err);
548 dbus_message_unref(msg);
549 if (dbus_error_is_set(&err)) {
550 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Send error (%s)", err.message);
551 dbus_error_free(&err);
555 if (NULL != result_msg) {
556 dbus_message_get_args(result_msg, &err,
557 DBUS_TYPE_INT32, &result,
558 DBUS_TYPE_INT32, &temp,
561 if (dbus_error_is_set(&err)) {
562 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Get arguments error (%s)", err.message);
563 dbus_error_free(&err);
564 result = TTS_ERROR_OPERATION_FAILED;
567 dbus_message_unref(result_msg);
570 *credential_needed = (bool)temp;
571 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts initialize : result = %d, credential_needed(%d)", result, *credential_needed);
573 /* add a rule for daemon error */
574 tts_client_s* client = tts_client_get_by_uid(uid);
575 if (NULL == client) {
576 SLOG(LOG_ERROR, TAG_TTSC, "Fail to get TTS client");
577 return TTS_ERROR_OPERATION_FAILED;
580 char rule_err[256] = {0, };
581 snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", TTS_SERVER_SERVICE_INTERFACE);
583 dbus_bus_add_match(g_conn_listener, rule_err, &err);
584 dbus_connection_flush(g_conn_listener);
586 if (dbus_error_is_set(&err)) {
587 SLOG(LOG_ERROR, TAG_TTSC, "Match Error (%s)", err.message);
588 dbus_error_free(&err);
589 return TTS_ERROR_OPERATION_FAILED;
591 client->reason = 0; // default value
593 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts initialize : result = %d", result);
596 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
597 tts_dbus_reconnect();
598 result = TTS_ERROR_TIMED_OUT;
604 static int __send_message_and_get_result(DBusMessage* msg, const char* method)
607 dbus_error_init(&err);
609 DBusMessage* result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, WAITING_TIME, &err);
610 dbus_message_unref(msg);
611 if (dbus_error_is_set(&err)) {
612 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Send error %s", err.message);
613 dbus_error_free(&err);
616 int result = TTS_ERROR_OPERATION_FAILED;
617 if (NULL != result_msg) {
618 dbus_message_get_args(result_msg, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
620 if (dbus_error_is_set(&err)) {
621 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts method(%s) : Get arguments error (%s)", method, err.message);
622 dbus_error_free(&err);
623 result = TTS_ERROR_OPERATION_FAILED;
626 dbus_message_unref(result_msg);
629 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts method(%s) : result = %d", method, result);
631 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts method(%s) : result = %d", method, result);
634 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
635 tts_dbus_reconnect();
636 result = TTS_ERROR_TIMED_OUT;
642 int tts_dbus_request_finalize(unsigned int uid)
644 tts_client_s* client = tts_client_get_by_uid(uid);
645 if (NULL == client) {
646 SLOG(LOG_ERROR, TAG_TTSC, "Fail to get TTS client");
647 return TTS_ERROR_OPERATION_FAILED;
650 /* remove a rule for daemon error */
651 __tts_dbus_remove_match();
653 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_FINALIZE);
655 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts finalize : Fail to make message");
656 return TTS_ERROR_OPERATION_FAILED;
658 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts finalize : uid(%u)", uid);
661 if (true != dbus_message_append_args(msg, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) {
662 dbus_message_unref(msg);
663 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
665 return TTS_ERROR_OPERATION_FAILED;
668 int result = __send_message_and_get_result(msg, TTS_METHOD_FINALIZE);
672 int tts_dbus_request_add_text(unsigned int uid, const char* text, const char* lang, int vctype, int speed, int uttid, const char* credential)
674 if (NULL == text || NULL == lang) {
675 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
676 return TTS_ERROR_INVALID_PARAMETER;
679 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_ADD_TEXT);
681 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts add text : Fail to make message");
682 return TTS_ERROR_OPERATION_FAILED;
684 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts add text : uid(%u), text(%s), lang(%s), type(%d), speed(%d), id(%d), credential(%s)",
685 uid, text, lang, vctype, speed, uttid, (NULL == credential) ? "NULL" : credential);
689 if (NULL == credential) {
690 temp = strdup("NULL");
692 temp = strdup(credential);
695 if (true != dbus_message_append_args(msg,
696 DBUS_TYPE_UINT32, &uid,
697 DBUS_TYPE_STRING, &text,
698 DBUS_TYPE_STRING, &lang,
699 DBUS_TYPE_INT32, &vctype,
700 DBUS_TYPE_INT32, &speed,
701 DBUS_TYPE_INT32, &uttid,
702 DBUS_TYPE_STRING, &temp,
703 DBUS_TYPE_INVALID)) {
704 dbus_message_unref(msg);
705 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
711 return TTS_ERROR_OPERATION_FAILED;
714 int result = __send_message_and_get_result(msg, TTS_METHOD_ADD_TEXT);
722 int tts_dbus_request_set_private_data(unsigned int uid, const char* key, const char* data)
724 if (NULL == key || NULL == data) {
725 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
726 return TTS_ERROR_INVALID_PARAMETER;
729 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_SET_PRIVATE_DATA);
731 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts set private data : Fail to make message");
732 return TTS_ERROR_OPERATION_FAILED;
734 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts set private data : uid(%u)", uid);
737 if (true != dbus_message_append_args(msg,
738 DBUS_TYPE_UINT32, &uid,
739 DBUS_TYPE_STRING, &key,
740 DBUS_TYPE_STRING, &data,
741 DBUS_TYPE_INVALID)) {
742 dbus_message_unref(msg);
743 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
745 return TTS_ERROR_OPERATION_FAILED;
748 int result = __send_message_and_get_result(msg, TTS_METHOD_SET_PRIVATE_DATA);
752 int tts_dbus_request_get_private_data(unsigned int uid, const char* key, char** data)
754 if (NULL == key || NULL == data) {
755 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
756 return TTS_ERROR_INVALID_PARAMETER;
761 dbus_error_init(&err);
763 msg = __tts_dbus_make_message(uid, TTS_METHOD_GET_PRIVATE_DATA);
766 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts get private data : Fail to make message");
767 return TTS_ERROR_OPERATION_FAILED;
769 SLOG(LOG_DEBUG, TAG_TTSC, ">>>> Request tts get private data : uid(%u)", uid);
772 if (true != dbus_message_append_args(msg,
773 DBUS_TYPE_UINT32, &uid,
774 DBUS_TYPE_STRING, &key,
775 DBUS_TYPE_INVALID)) {
776 dbus_message_unref(msg);
777 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
779 return TTS_ERROR_OPERATION_FAILED;
782 DBusMessage* result_msg;
783 int result = TTS_ERROR_OPERATION_FAILED;
785 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, WAITING_TIME, &err);
786 dbus_message_unref(msg);
787 if (dbus_error_is_set(&err)) {
788 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Send error (%s)", err.message);
789 dbus_error_free(&err);
793 if (NULL != result_msg) {
794 dbus_message_get_args(result_msg, &err,
795 DBUS_TYPE_INT32, &result,
796 DBUS_TYPE_STRING, &temp,
799 if (dbus_error_is_set(&err)) {
800 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get private data : Get arguments error (%s)", err.message);
801 dbus_error_free(&err);
802 result = TTS_ERROR_OPERATION_FAILED;
804 dbus_message_unref(result_msg);
807 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts get private data : result(%d)", result);
809 *data = strdup(temp);
812 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get private data : result(%d)", result);
815 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
816 tts_dbus_reconnect();
817 result = TTS_ERROR_TIMED_OUT;
823 int tts_dbus_request_play(unsigned int uid, const char* credential)
825 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_PLAY);
827 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts play : Fail to make message");
828 return TTS_ERROR_OPERATION_FAILED;
830 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts play : uid(%u)", uid);
834 if (NULL == credential) {
835 temp = strdup("NULL");
837 temp = strdup(credential);
840 if (true != dbus_message_append_args(msg,
841 DBUS_TYPE_UINT32, &uid,
842 DBUS_TYPE_STRING, &temp,
843 DBUS_TYPE_INVALID)) {
844 dbus_message_unref(msg);
845 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
851 return TTS_ERROR_OPERATION_FAILED;
854 int result = __send_message_and_get_result(msg, TTS_METHOD_PLAY);
862 int tts_dbus_request_stop(unsigned int uid)
864 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_STOP);
866 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts stop : Fail to make message");
867 return TTS_ERROR_OPERATION_FAILED;
869 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts stop : uid(%u)", uid);
872 if (true != dbus_message_append_args(msg, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) {
873 dbus_message_unref(msg);
874 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
876 return TTS_ERROR_OPERATION_FAILED;
879 int result = __send_message_and_get_result(msg, TTS_METHOD_STOP);
883 int tts_dbus_request_pause(unsigned int uid)
885 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_PAUSE);
887 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts pause : Fail to make message");
888 return TTS_ERROR_OPERATION_FAILED;
890 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts pause : uid(%u)", uid);
893 if (true != dbus_message_append_args(msg, DBUS_TYPE_UINT32, &uid, DBUS_TYPE_INVALID)) {
894 dbus_message_unref(msg);
895 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
897 return TTS_ERROR_OPERATION_FAILED;
900 int result = __send_message_and_get_result(msg, TTS_METHOD_PAUSE);
905 int tts_dbus_request_play_pcm(unsigned int uid)
907 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_PLAY_PCM);
909 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts play pcm : Fail to make message");
910 return TTS_ERROR_OPERATION_FAILED;
912 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts play pcm : uid(%u)", uid);
915 if (true != dbus_message_append_args(msg,
916 DBUS_TYPE_UINT32, &uid,
917 DBUS_TYPE_INVALID)) {
918 dbus_message_unref(msg);
919 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
920 return TTS_ERROR_OPERATION_FAILED;
923 int result = __send_message_and_get_result(msg, TTS_METHOD_PLAY_PCM);
927 int tts_dbus_request_stop_pcm(unsigned int uid)
929 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_STOP_PCM);
931 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts stop pcm : Fail to make message");
932 return TTS_ERROR_OPERATION_FAILED;
934 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts stop pcm : uid(%u)", uid);
937 if (true != dbus_message_append_args(msg,
938 DBUS_TYPE_UINT32, &uid,
939 DBUS_TYPE_INVALID)) {
940 dbus_message_unref(msg);
941 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
942 return TTS_ERROR_OPERATION_FAILED;
945 int result = __send_message_and_get_result(msg, TTS_METHOD_STOP_PCM);
949 int tts_dbus_request_add_pcm(unsigned int uid, int event, const char* data, int data_size, int audio_type, int rate)
951 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_ADD_PCM);
953 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts add pcm : Fail to make message");
954 return TTS_ERROR_OPERATION_FAILED;
956 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts add pcm : uid(%u)", uid);
959 if (true != dbus_message_append_args(msg,
960 DBUS_TYPE_UINT32, &uid,
961 DBUS_TYPE_INT32, &event,
962 DBUS_TYPE_INT32, &audio_type,
963 DBUS_TYPE_INT32, &rate,
964 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
966 DBUS_TYPE_INVALID)) {
967 dbus_message_unref(msg);
968 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
969 return TTS_ERROR_OPERATION_FAILED;
972 int result = __send_message_and_get_result(msg, TTS_METHOD_ADD_PCM);
977 int tts_dbus_request_get_service_state(unsigned int uid, tts_service_state_e* service_state)
979 if (NULL == service_state) {
980 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
981 return TTS_ERROR_INVALID_PARAMETER;
984 DBusMessage* msg = __tts_dbus_make_message(uid, TTS_METHOD_GET_SERVICE_STATE);
986 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts get service state : Fail to make message");
987 return TTS_ERROR_OPERATION_FAILED;
989 SLOG(LOG_ERROR, TAG_TTSC, ">>>> Request tts get service state : uid(%u)", uid);
992 if (true != dbus_message_append_args(msg,
993 DBUS_TYPE_UINT32, &uid,
994 DBUS_TYPE_INVALID)) {
995 dbus_message_unref(msg);
996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to append args");
998 return TTS_ERROR_OPERATION_FAILED;
1002 dbus_error_init(&err);
1003 DBusMessage* result_msg;
1004 int result = TTS_ERROR_OPERATION_FAILED;
1005 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, WAITING_TIME, &err);
1006 dbus_message_unref(msg);
1007 if (dbus_error_is_set(&err)) {
1008 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Send error (%s)", err.message);
1009 dbus_error_free(&err);
1012 int state = (int)TTS_SERVICE_STATE_READY;
1013 if (NULL != result_msg) {
1014 dbus_message_get_args(result_msg, &err,
1015 DBUS_TYPE_INT32, &result,
1016 DBUS_TYPE_INT32, &state,
1019 if (dbus_error_is_set(&err)) {
1020 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get service state : Get arguments error (%s)", err.message);
1021 dbus_error_free(&err);
1022 result = TTS_ERROR_OPERATION_FAILED;
1024 dbus_message_unref(result_msg);
1027 SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts get service state : result(%d)", result);
1028 *service_state = (tts_service_state_e)state;
1030 SLOG(LOG_ERROR, TAG_TTSC, "<<<< tts get service state : result(%d)", result);
1033 SLOG(LOG_ERROR, TAG_TTSC, "<<<< Result message is NULL ");
1034 tts_dbus_reconnect();
1035 result = TTS_ERROR_TIMED_OUT;