upload tizen1.0 source
[framework/uifw/voice/stt.git] / client / stt_client.c
1 /*
2 * Copyright (c) 2011 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 "stt_client.h"
16
17 #define MUTEX_TIME 3
18
19 /* Max number of handle */
20 static const int g_max_handle = 999;
21 /* allocated handle */
22 static int g_allocated_handle = 0;
23 /* client list */
24 static GList *g_client_list = NULL;
25
26
27 /* private functions */
28 static int __client_generate_uid(int pid)
29 {
30         g_allocated_handle++;
31
32         if (g_allocated_handle > g_max_handle) {
33                 g_allocated_handle = 1;
34         }
35
36         /* generate uid, handle number should be smaller than 1000 */
37         return pid * 1000 + g_allocated_handle;
38 }
39
40 int stt_client_new(stt_h* stt)
41 {
42         stt_client_s *client = NULL;
43
44         client = (stt_client_s*)g_malloc0 (sizeof(stt_client_s));
45
46         stt_h temp = (stt_h)g_malloc0(sizeof(stt_h));
47         temp->handle = __client_generate_uid(getpid()); 
48
49         /* initialize client data */
50         client->stt = temp;
51         client->pid = getpid(); 
52         client->uid = temp->handle;
53         
54         client->result_cb = NULL;
55         client->result_user_data = NULL;
56         client->partial_result_cb = NULL;
57         client->partial_result_user_data = NULL;
58         client->state_changed_cb = NULL;
59         client->state_changed_user_data = NULL;
60         client->error_cb = NULL;
61         client->error_user_data = NULL;
62
63         client->silence_supported = false;
64         client->profanity_supported = false;
65         client->punctuation_supported = false;
66
67         client->profanity = STT_OPTION_PROFANITY_AUTO;  
68         client->punctuation = STT_OPTION_PUNCTUATION_AUTO;
69         client->silence = STT_OPTION_SILENCE_DETECTION_AUTO;
70
71         client->current_state = STT_STATE_READY; 
72
73         client->cb_ref_count = 0;
74
75         g_client_list = g_list_append(g_client_list, client);
76
77         *stt = temp;
78
79         return 0;       
80 }
81
82 int stt_client_destroy(stt_h stt)
83 {
84         if (stt == NULL) {
85                 SLOG(LOG_ERROR, TAG_STTC, "Input parameter is NULL");
86                 return 0;
87         }       
88
89         GList *iter = NULL;
90         stt_client_s *data = NULL;
91
92         /* if list have item */
93         if (g_list_length(g_client_list) > 0) {
94                 /* Get a first item */
95                 iter = g_list_first(g_client_list);
96
97                 while (NULL != iter) {
98                         data = iter->data;
99                         if (stt->handle == data->stt->handle) {
100                                 g_client_list = g_list_remove_link(g_client_list, iter);
101
102                                 while (0 != data->cb_ref_count)
103                                 {
104                                         /* wait for release callback function */
105                                 }
106                                 free(data);
107                                 free(stt);
108
109                                 return 0;
110                         }
111
112                         /* Next item */
113                         iter = g_list_next(iter);
114                 }
115         }
116
117         SLOG(LOG_ERROR, TAG_STTC, "[ERROR] client Not founded");
118
119         return -1;
120 }
121
122
123 stt_client_s* stt_client_get(stt_h stt)
124 {
125         if (stt == NULL) {
126                 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
127                 return NULL;
128         }
129
130         GList *iter = NULL;
131         stt_client_s *data = NULL;
132
133         if (g_list_length(g_client_list) > 0) {
134                 /* Get a first item */
135                 iter = g_list_first(g_client_list);
136
137                 while (NULL != iter) {
138                         data = iter->data;
139
140                         if (stt->handle == data->stt->handle) 
141                                 return data;
142
143                         /* Next item */
144                         iter = g_list_next(iter);
145                 }
146         }
147
148         SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get client by stt");
149
150         return NULL;
151 }
152
153 stt_client_s* stt_client_get_by_uid(const int uid)
154 {
155         if (uid < 0) {
156                 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] out of range : handle");
157                 return NULL;
158         }
159
160         GList *iter = NULL;
161         stt_client_s *data = NULL;
162
163         if (g_list_length(g_client_list) > 0) {
164                 /* Get a first item */
165                 iter = g_list_first(g_client_list);
166
167                 while (NULL != iter) {
168                         data = iter->data;
169                         if (uid == data->uid) {
170                                 return data;
171                         }
172
173                         /* Next item */
174                         iter = g_list_next(iter);
175                 }
176         }
177
178         SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get client by uid");
179
180         return NULL;
181 }
182
183 int stt_client_get_size()
184 {
185         return g_list_length(g_client_list);
186 }
187
188 int stt_client_use_callback(stt_client_s* client)
189 {
190         client->cb_ref_count++;
191         return 0;
192 }
193
194 int stt_client_not_use_callback(stt_client_s* client)
195 {
196         client->cb_ref_count--;
197         return 0;
198 }
199
200
201 int stt_client_set_option_supported(stt_h stt, bool silence, bool profanity, bool punctuation)
202 {
203         stt_client_s* client = stt_client_get(stt);
204         
205         /* check handle */
206         if (NULL == client) 
207                 return STT_ERROR_INVALID_PARAMETER;
208         
209         client->silence_supported = silence;
210         client->profanity_supported = profanity;
211         client->punctuation_supported = punctuation;
212
213         return 0;
214 }
215
216