Fix prevent issue and change license file
[platform/core/uifw/tts.git] / client / tts_client.c
1 /*
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.
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*)g_malloc0 (sizeof(tts_client_s));
41
42         tts_h temp = (tts_h)g_malloc0(sizeof(struct tts_s));
43         temp->handle = __client_generate_uid(getpid()); 
44
45         /* initialize client data */
46         client->tts = temp;
47         client->pid = getpid(); 
48         client->uid = temp->handle;
49         client->current_utt_id = 0;
50
51         client->state_changed_cb = NULL;
52         client->state_changed_user_data = NULL;
53         
54         client->utt_started_cb = NULL;
55         client->utt_started_user_data = NULL;
56         client->utt_completeted_cb = NULL;
57         client->utt_completed_user_data = NULL;
58
59         client->error_cb = NULL;
60         client->error_user_data = NULL;
61
62         client->before_state = TTS_STATE_CREATED; 
63         client->current_state = TTS_STATE_CREATED; 
64
65         client->cb_ref_count = 0;
66
67         g_client_list = g_list_append(g_client_list, client);
68
69         *tts = temp;
70
71         SLOG(LOG_DEBUG, TAG_TTSC, "[Success] Create client object : uid(%d)", client->uid); 
72
73         return 0;
74 }
75
76 int tts_client_destroy(tts_h tts)
77 {
78         if (tts == NULL) {
79                 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
80                 return 0;
81         }       
82
83         GList *iter = NULL;
84         tts_client_s *data = NULL;
85
86         /* if list have item */
87         if (g_list_length(g_client_list) > 0) {
88                 /* Get a first item */
89                 iter = g_list_first(g_client_list);
90
91                 while (NULL != iter) {
92                         data = iter->data;
93                         if (tts->handle == data->tts->handle) {
94                                 g_client_list = g_list_remove_link(g_client_list, iter);
95
96                                 while (0 != data->cb_ref_count)
97                                 {
98                                         /* wait for release callback function */
99                                 }
100                                 free(data);
101                                 free(tts);
102
103                                 return 0;
104                         }
105
106                         /* Next item */
107                         iter = g_list_next(iter);
108                 }
109         }
110         SLOG(LOG_ERROR, TAG_TTSC, "Fail to destroy client : handle is not valid");
111
112         return -1;
113 }
114
115 tts_client_s* tts_client_get(tts_h tts)
116 {
117         if (tts == NULL) {
118                 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
119                 return NULL;
120         }
121
122         GList *iter = NULL;
123         tts_client_s *data = NULL;
124
125         if (g_list_length(g_client_list) > 0) {
126                 /* Get a first item */
127                 iter = g_list_first(g_client_list);
128
129                 while (NULL != iter) {
130                         data = iter->data;
131
132                         if (tts->handle == data->tts->handle) 
133                                 return data;
134
135                         /* Next item */
136                         iter = g_list_next(iter);
137                 }
138         }
139
140         SLOG(LOG_ERROR, TAG_TTSC, "handle is not valid");
141
142         return NULL;
143 }
144
145 tts_client_s* tts_client_get_by_uid(const int uid)
146 {
147         if (uid < 0) {
148                 SLOG(LOG_ERROR, TAG_TTSC, "out of range : handle");
149                 return NULL;
150         }
151
152         GList *iter = NULL;
153         tts_client_s *data = NULL;
154
155         if (g_list_length(g_client_list) > 0) {
156                 /* Get a first item */
157                 iter = g_list_first(g_client_list);
158
159                 while (NULL != iter) {
160                         data = iter->data;
161                         if (uid == data->uid) {
162                                 return data;
163                         }
164
165                         /* Next item */
166                         iter = g_list_next(iter);
167                 }
168         }
169
170         SLOG(LOG_WARN, TAG_TTSC, "uid is not valid");
171
172         return NULL;
173 }
174
175 int tts_client_get_size()
176 {
177         return g_list_length(g_client_list);
178 }
179
180 int tts_client_use_callback(tts_client_s* client)
181 {
182         client->cb_ref_count++;
183         return 0;
184 }
185
186 int tts_client_not_use_callback(tts_client_s* client)
187 {
188         client->cb_ref_count--;
189         return 0;
190 }