Update dbus for autostarting daemon and add dbus configure file
[platform/core/uifw/tts.git] / client / tts_client.c
1 /*
2 *  Copyright (c) 2011-2014 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.
12 */
13
14
15 #include "tts_client.h"
16
17 /* Max number of handle */
18 static const int g_max_handle = 999;
19 /* allocated handle */
20 static int g_allocated_handle = 0;
21 /* client list */
22 static GList *g_client_list = NULL;
23
24 /* private functions */
25 static int __client_generate_uid(int pid)
26 {
27         g_allocated_handle++;
28
29         if (g_allocated_handle > g_max_handle) {
30                 g_allocated_handle = 1;
31         }
32
33         /* generate uid, handle number should be smaller than 1000 */
34         return pid * 1000 + g_allocated_handle;
35 }
36
37 int tts_client_new(tts_h* tts)
38 {
39         tts_client_s* client = NULL;
40         client = (tts_client_s*)calloc(1, sizeof(tts_client_s));
41         if (NULL == client) {
42                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
43                 return TTS_ERROR_OUT_OF_MEMORY;
44         }
45         tts_h temp = (tts_h)calloc(1, sizeof(struct tts_s));
46         if (NULL == temp) {
47                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
48                 free(client);
49                 return TTS_ERROR_OUT_OF_MEMORY;
50         }
51         temp->handle = __client_generate_uid(getpid()); 
52
53         /* initialize client data */
54         client->tts = temp;
55         client->pid = getpid(); 
56         client->uid = temp->handle;
57         client->current_utt_id = 0;
58
59         client->state_changed_cb = NULL;
60         client->state_changed_user_data = NULL;
61
62         client->utt_started_cb = NULL;
63         client->utt_started_user_data = NULL;
64         client->utt_completeted_cb = NULL;
65         client->utt_completed_user_data = NULL;
66
67         client->error_cb = NULL;
68         client->error_user_data = NULL;
69         client->default_voice_changed_cb = NULL;
70         client->default_voice_changed_user_data = NULL;
71         client->supported_voice_cb = NULL;
72         client->supported_voice_user_data = NULL;
73
74         client->mode = TTS_MODE_DEFAULT;
75         client->before_state = TTS_STATE_CREATED; 
76         client->current_state = TTS_STATE_CREATED; 
77
78         client->cb_ref_count = 0;
79
80         g_client_list = g_list_append(g_client_list, client);
81
82         *tts = temp;
83
84         SLOG(LOG_DEBUG, TAG_TTSC, "[Success] Create client object : uid(%d)", client->uid); 
85
86         return TTS_ERROR_NONE;
87 }
88
89 int tts_client_destroy(tts_h tts)
90 {
91         if (tts == NULL) {
92                 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
93                 return TTS_ERROR_INVALID_PARAMETER;
94         }       
95
96         GList *iter = NULL;
97         tts_client_s *data = NULL;
98
99         /* if list have item */
100         if (g_list_length(g_client_list) > 0) {
101                 /* Get a first item */
102                 iter = g_list_first(g_client_list);
103
104                 while (NULL != iter) {
105                         data = iter->data;
106                         if (tts->handle == data->tts->handle) {
107                                 g_client_list = g_list_remove_link(g_client_list, iter);
108
109                                 while (0 != data->cb_ref_count)
110                                 {
111                                         /* wait for release callback function */
112                                 }
113                                 free(data);
114                                 free(tts);
115
116                                 return TTS_ERROR_NONE;
117                         }
118
119                         /* Next item */
120                         iter = g_list_next(iter);
121                 }
122         }
123         SLOG(LOG_ERROR, TAG_TTSC, "Fail to destroy client : handle is not valid");
124
125         return TTS_ERROR_INVALID_PARAMETER;
126 }
127
128 tts_client_s* tts_client_get(tts_h tts)
129 {
130         if (tts == NULL) {
131                 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
132                 return NULL;
133         }
134
135         GList *iter = NULL;
136         tts_client_s *data = NULL;
137
138         if (g_list_length(g_client_list) > 0) {
139                 /* Get a first item */
140                 iter = g_list_first(g_client_list);
141
142                 while (NULL != iter) {
143                         data = iter->data;
144
145                         if (tts->handle == data->tts->handle) 
146                                 return data;
147
148                         /* Next item */
149                         iter = g_list_next(iter);
150                 }
151         }
152
153         SLOG(LOG_ERROR, TAG_TTSC, "handle is not valid");
154
155         return NULL;
156 }
157
158 tts_client_s* tts_client_get_by_uid(const int uid)
159 {
160         if (uid < 0) {
161                 SLOG(LOG_ERROR, TAG_TTSC, "out of range : handle");
162                 return NULL;
163         }
164
165         GList *iter = NULL;
166         tts_client_s *data = NULL;
167
168         if (g_list_length(g_client_list) > 0) {
169                 /* Get a first item */
170                 iter = g_list_first(g_client_list);
171
172                 while (NULL != iter) {
173                         data = iter->data;
174                         if (uid == data->uid) {
175                                 return data;
176                         }
177
178                         /* Next item */
179                         iter = g_list_next(iter);
180                 }
181         }
182
183         SLOG(LOG_WARN, TAG_TTSC, "uid is not valid");
184
185         return NULL;
186 }
187
188 int tts_client_get_size()
189 {
190         return g_list_length(g_client_list);
191 }
192
193 int tts_client_use_callback(tts_client_s* client)
194 {
195         client->cb_ref_count++;
196         return 0;
197 }
198
199 int tts_client_not_use_callback(tts_client_s* client)
200 {
201         client->cb_ref_count--;
202         return 0;
203 }
204
205 int tts_client_get_use_callback(tts_client_s* client)
206 {
207         return client->cb_ref_count;
208 }
209
210 int tts_client_get_connected_client_count()
211 {
212         GList *iter = NULL;
213         tts_client_s *data = NULL;
214         int number = 0;
215
216         if (g_list_length(g_client_list) > 0) {
217                 /* Get a first item */
218                 iter = g_list_first(g_client_list);
219
220                 while (NULL != iter) {
221                         data = iter->data;
222                         if (0 < data->current_state) {
223                                 number++;
224                         }
225
226                         /* Next item */
227                         iter = g_list_next(iter);
228                 }
229         }
230         return number;
231 }
232
233 int tts_client_get_mode_client_count(tts_mode_e mode)
234 {
235         GList *iter = NULL;
236         tts_client_s *data = NULL;
237         int number = 0;
238
239         if (g_list_length(g_client_list) > 0) {
240                 /* Get a first item */
241                 iter = g_list_first(g_client_list);
242
243                 while (NULL != iter) {
244                         data = iter->data;
245                         if (0 < data->current_state && data->mode == mode) {
246                                 number++;
247                         }
248
249                         /* Next item */
250                         iter = g_list_next(iter);
251                 }
252         }
253         return number;
254 }
255
256 GList* tts_client_get_client_list()
257 {
258         return g_client_list;
259 }