pwr: Refactor code, check for NULL pointers and prevent memory leaks
[samsung-ril.git] / samsung-ril.h
1 /*
2  * This file is part of Samsung-RIL.
3  *
4  * Copyright (C) 2010-2011 Joerie de Gram <j.de.gram@gmail.com>
5  * Copyright (C) 2011-2012 Paul Kocialkowski <contact@paulk.fr>
6  *
7  * Samsung-RIL is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * Samsung-RIL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Samsung-RIL.  If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21
22 #ifndef _SAMSUNG_RIL_H_
23 #define _SAMSUNG_RIL_H_
24
25 #include <pthread.h>
26
27 #include <utils/Log.h>
28 #include <telephony/ril.h>
29
30 #include <radio.h>
31
32 #include "ipc.h"
33 #include "srs.h"
34
35 /*
36  * Defines
37  */
38
39 #ifndef LOGE
40         #define LOGE ALOGE
41 #endif
42
43 #ifndef LOGI
44         #define LOGI ALOGI
45 #endif
46
47 #ifndef LOGD
48         #define LOGD ALOGD
49 #endif
50
51 #define RIL_VERSION_STRING "Samsung RIL"
52
53 #define RIL_LOCK() pthread_mutex_lock(&ril_data.mutex)
54 #define RIL_UNLOCK() pthread_mutex_unlock(&ril_data.mutex)
55 #define RIL_START_LOCK() pthread_mutex_lock(&ril_data.start_mutex)
56 #define RIL_START_UNLOCK() pthread_mutex_unlock(&ril_data.start_mutex)
57 #define RIL_CLIENT_LOCK(client) pthread_mutex_lock(&(client->mutex))
58 #define RIL_CLIENT_UNLOCK(client) pthread_mutex_unlock(&(client->mutex))
59
60 #define RIL_TOKEN_DATA_WAITING  (RIL_Token) 0xff
61
62 /*
63  * RIL client
64  */
65
66 struct ril_client;
67
68 struct ril_client_funcs {
69         int (*create)(struct ril_client *client);
70         int (*destroy)(struct ril_client *client);
71         int (*read_loop)(struct ril_client *client);
72 };
73
74 typedef enum {
75         RIL_CLIENT_NULL         = 0,
76         RIL_CLIENT_CREATED      = 1,
77         RIL_CLIENT_READY        = 2,
78         RIL_CLIENT_DESTROYED    = 3,
79         RIL_CLIENT_ERROR        = 4,
80 } ril_client_state;
81
82 struct ril_client {
83         struct ril_client_funcs funcs;
84         ril_client_state state;
85
86         void *data;
87
88         pthread_t thread;
89         pthread_mutex_t mutex;
90 };
91
92 struct ril_client *ril_client_new(struct ril_client_funcs *client_funcs);
93 int ril_client_free(struct ril_client *client);
94 int ril_client_create(struct ril_client *client);
95 int ril_client_destroy(struct ril_client *client);
96 int ril_client_thread_start(struct ril_client *client);
97
98 /*
99  * RIL requests
100  */
101
102 struct ril_request_info {
103         RIL_Token token;
104         int id;
105         int canceled;
106 };
107
108 int ril_request_id_get(void);
109 int ril_request_id_set(int id);
110 int ril_request_register(RIL_Token t, int id);
111 void ril_request_unregister(struct ril_request_info *request);
112 struct ril_request_info *ril_request_info_find_id(int id);
113 struct ril_request_info *ril_request_info_find_token(RIL_Token t);
114 int ril_request_set_canceled(RIL_Token t, int canceled);
115 int ril_request_get_canceled(RIL_Token t);
116 RIL_Token ril_request_get_token(int id);
117 int ril_request_get_id(RIL_Token t);
118
119 void ril_request_complete(RIL_Token t, RIL_Errno e, void *data, size_t length);
120 void ril_request_unsolicited(int request, void *data, size_t length);
121 void ril_request_timed_callback(RIL_TimedCallback callback, void *data, const struct timeval *time);
122
123 /*
124  * RIL tokens
125  */
126
127 struct ril_tokens {
128         RIL_Token radio_power;
129         RIL_Token pin_status;
130         RIL_Token get_imei;
131         RIL_Token get_imeisv;
132         RIL_Token baseband_version;
133
134         RIL_Token registration_state;
135         RIL_Token gprs_registration_state;
136         RIL_Token operator;
137
138         RIL_Token outgoing_sms;
139         RIL_Token sim_io;
140 };
141
142 void ril_tokens_check(void);
143
144 /*
145  * RIL state
146  */
147
148 typedef enum {
149         SIM_STATE_ABSENT                        = 0,
150         SIM_STATE_NOT_READY                     = 1,
151         SIM_STATE_READY                         = 2,
152         SIM_STATE_PIN                           = 3,
153         SIM_STATE_PUK                           = 4,
154         SIM_STATE_BLOCKED                       = 5,
155         SIM_STATE_NETWORK_PERSO                 = 6,
156         SIM_STATE_NETWORK_SUBSET_PERSO          = 7,
157         SIM_STATE_CORPORATE_PERSO               = 8,
158         SIM_STATE_SERVICE_PROVIDER_PERSO        = 9,
159 } ril_sim_state;
160
161 struct ril_state {
162         RIL_RadioState radio_state;
163         ril_sim_state sim_state;
164         int power_state;
165
166         struct ipc_sec_sim_status_response sim_pin_status;
167         struct ipc_sec_sim_icc_type sim_icc_type;
168
169         struct ipc_net_regist_response netinfo;
170         struct ipc_net_regist_response gprs_netinfo;
171         struct ipc_net_current_plmn_response plmndata;
172
173         struct ipc_call_status call_status;
174
175         int gprs_last_failed_cid;
176
177         unsigned char dtmf_tone;
178         unsigned char ussd_state;
179
180         unsigned char sms_incoming_msg_tpid;
181 };
182
183 /*
184  * RIL data
185  */
186
187 struct ril_data {
188         struct RIL_Env *env;
189
190         struct ril_state state;
191         struct ril_tokens tokens;
192         struct list_head *gprs_connections;
193         struct list_head *incoming_sms;
194         struct list_head *outgoing_sms;
195         struct list_head *sim_io;
196         struct list_head *generic_responses;
197         struct list_head *requests;
198         int request_id;
199
200         struct ril_client *ipc_fmt_client;
201         struct ril_client *ipc_rfs_client;
202         struct ril_client *srs_client;
203
204         pthread_mutex_t mutex;
205         pthread_mutex_t start_mutex;
206 };
207
208 extern struct ril_data ril_data;
209
210 /*
211  * Dispatch functions
212  */
213
214 void ipc_fmt_dispatch(struct ipc_message_info *info);
215 void ipc_rfs_dispatch(struct ipc_message_info *info);
216 void srs_dispatch(struct srs_message *message);
217
218 /* GEN */
219
220 struct ipc_gen_phone_res_expect_info {
221         unsigned char aseq;
222         unsigned short command;
223         void (*func)(struct ipc_message_info *info);
224         int complete;
225         int abort;
226 };
227
228 int ipc_gen_phone_res_expect_register(unsigned char aseq, unsigned short command,
229         void (*func)(struct ipc_message_info *info), int complete, int abort);
230 void ipc_gen_phone_res_expect_unregister(struct ipc_gen_phone_res_expect_info *expect);
231 struct ipc_gen_phone_res_expect_info *ipc_gen_phone_res_expect_find_aseq(unsigned char aseq);
232 int ipc_gen_phone_res_expect_to_func(unsigned char aseq, unsigned short command,
233         void (*func)(struct ipc_message_info *info));
234 int ipc_gen_phone_res_expect_to_complete(unsigned char aseq, unsigned short command);
235 int ipc_gen_phone_res_expect_to_abort(unsigned char aseq, unsigned short command);
236
237 void ipc_gen_phone_res(struct ipc_message_info *info);
238
239 /* PWR */
240
241 void ipc_pwr_phone_pwr_up(void);
242 void ipc_pwr_phone_reset(void);
243 void ipc_pwr_phone_state(struct ipc_message_info *info);
244 void ril_request_radio_power(RIL_Token t, void *data, int length);
245
246 /* DISP */
247
248 void ril_request_signal_strength(RIL_Token t);
249 void ipc_disp_icon_info(struct ipc_message_info *info);
250 void ipc_disp_rssi_info(struct ipc_message_info *info);
251
252 /* MISC */
253
254 void ril_request_get_imei(RIL_Token t);
255 void ril_request_get_imeisv(RIL_Token t);
256 void ipc_misc_me_sn(struct ipc_message_info *info);
257 void ril_request_baseband_version(RIL_Token t);
258 void ipc_misc_me_version(struct ipc_message_info *info);
259 void ril_request_get_imsi(RIL_Token t);
260 void ipc_misc_me_imsi(struct ipc_message_info *info);
261 void ipc_misc_time_info(struct ipc_message_info *info);
262
263 /* SAT */
264 void ril_request_report_stk_service_is_running(RIL_Token t);
265 void ipc_sat_proactive_cmd(struct ipc_message_info *info);
266 void ril_request_stk_send_terminal_response(RIL_Token t, void *data, size_t datalen);
267 void ril_request_stk_send_envelope_command(RIL_Token t, void *data, size_t datalen);
268 void ipc_sat_envelope_cmd(struct ipc_message_info *info);
269
270 /* SS */
271
272 void ril_request_send_ussd(RIL_Token t, void *data, size_t datalen);
273 void ril_request_cancel_ussd(RIL_Token t, void *data, size_t datalen);
274 void ipc_ss_ussd(struct ipc_message_info *info);
275
276 /* SEC */
277
278 struct ril_request_sim_io_info {
279         unsigned char command;
280         unsigned short fileid;
281         unsigned char p1;
282         unsigned char p2;
283         unsigned char p3;
284         void *data;
285         int length;
286
287         int waiting;
288         RIL_Token token;
289 };
290
291 void ril_state_update(ril_sim_state status);
292 void ipc_sec_sim_status(struct ipc_message_info *info);
293 void ril_request_get_sim_status(RIL_Token t);
294 void ipc_sec_sim_icc_type(struct ipc_message_info *info);
295 void ril_request_sim_io_next(void);
296 void ril_request_sim_io_complete(RIL_Token t, unsigned char command, unsigned short fileid,
297         unsigned char p1, unsigned char p2, unsigned char p3, void *data, int length);
298 void ril_request_sim_io(RIL_Token t, void *data, int length);
299 void ipc_sec_rsim_access(struct ipc_message_info *info);
300 void ipc_sec_sim_status_complete(struct ipc_message_info *info);
301 void ipc_sec_lock_info(struct ipc_message_info *info);
302 void ril_request_enter_sim_pin(RIL_Token t, void *data, size_t datalen);
303 void ril_request_change_sim_pin(RIL_Token t, void *data, size_t datalen);
304 void ril_request_enter_sim_puk(RIL_Token t, void *data, size_t datalen);
305 void ril_request_query_facility_lock(RIL_Token t, void *data, size_t datalen);
306 void ipc_sec_phone_lock(struct ipc_message_info *info);
307 void ipc_sec_phone_lock_complete(struct ipc_message_info *info);
308 void ril_request_set_facility_lock(RIL_Token t, void *data, size_t datalen);
309
310 /* NET */
311
312 void ril_plmn_split(char *plmn_data, char **plmn, unsigned int *mcc, unsigned int *mnc);
313 void ril_plmn_string(char *plmn_data, char *response[3]);
314 unsigned char ril_plmn_act_get(char *plmn_data);
315 void ril_request_operator(RIL_Token t);
316 void ipc_net_current_plmn(struct ipc_message_info *message);
317 #if RIL_VERSION >= 6
318 void ril_request_voice_registration_state(RIL_Token t);
319 void ril_request_data_registration_state(RIL_Token t);
320 #else
321 void ril_request_registration_state(RIL_Token t);
322 void ril_request_gprs_registration_state(RIL_Token t);
323 #endif
324 void ipc_net_regist(struct ipc_message_info *message);
325 void ril_request_query_available_networks(RIL_Token t);
326 void ipc_net_plmn_list(struct ipc_message_info *info);
327 void ril_request_get_preferred_network_type(RIL_Token t);
328 void ril_request_set_preferred_network_type(RIL_Token t, void *data, size_t datalen);
329 void ipc_net_mode_sel(struct ipc_message_info *info);
330 void ril_request_query_network_selection_mode(RIL_Token t);
331 void ipc_net_plmn_sel(struct ipc_message_info *info);
332 void ril_request_set_network_selection_automatic(RIL_Token t);
333 void ril_request_set_network_selection_manual(RIL_Token t, void *data, size_t datalen);
334
335 /* SMS */
336
337 struct ipc_sms_incoming_msg_info {
338         char *pdu;
339         int length;
340
341         unsigned char type;
342         unsigned char tpid;
343 };
344
345 struct ril_request_send_sms_info {
346         char *pdu;
347         int pdu_length;
348         unsigned char *smsc;
349         int smsc_length;
350
351         RIL_Token token;
352 };
353
354 int ril_request_send_sms_register(char *pdu, int pdu_length, unsigned char *smsc, int smsc_length, RIL_Token t);
355 void ril_request_send_sms_unregister(struct ril_request_send_sms_info *send_sms);
356 struct ril_request_send_sms_info *ril_request_send_sms_info_find(void);
357 struct ril_request_send_sms_info *ril_request_send_sms_info_find_token(RIL_Token t);
358
359 void ril_request_send_sms_next(void);
360 void ril_request_send_sms_complete(RIL_Token t, char *pdu, int pdu_length, unsigned char *smsc, int smsc_length);
361 void ril_request_send_sms(RIL_Token t, void *data, size_t length);
362 void ril_request_send_sms_expect_more(RIL_Token t, void *data, size_t length);
363 void ipc_sms_svc_center_addr(struct ipc_message_info *info);
364 void ipc_sms_send_msg_complete(struct ipc_message_info *info);
365 void ipc_sms_send_msg(struct ipc_message_info *info);
366
367 int ipc_sms_incoming_msg_register(char *pdu, int length, unsigned char type, unsigned char tpid);
368 void ipc_sms_incoming_msg_unregister(struct ipc_sms_incoming_msg_info *incoming_msg);
369 struct ipc_sms_incoming_msg_info *ipc_sms_incoming_msg_info_find(void);
370
371 void ipc_sms_incoming_msg_complete(char *pdu, int length, unsigned char type, unsigned char tpid);
372 void ipc_sms_incoming_msg(struct ipc_message_info *info);
373 void ril_request_sms_acknowledge(RIL_Token t, void *data, size_t length);
374 void ipc_sms_deliver_report(struct ipc_message_info *info);
375
376 void ipc_sms_device_ready(struct ipc_message_info *info);
377
378 /* Call */
379
380 void ipc_call_incoming(struct ipc_message_info *info);
381 void ipc_call_status(struct ipc_message_info *info);
382 void ril_request_dial(RIL_Token t, void *data, size_t datalen);
383 void ril_request_get_current_calls(RIL_Token t);
384 void ipc_call_list(struct ipc_message_info *info);
385 void ril_request_hangup(RIL_Token t);
386 void ril_request_answer(RIL_Token t);
387 void ril_request_last_call_fail_cause(RIL_Token t);
388 void ril_request_dtmf(RIL_Token t, void *data, int length);
389 void ipc_call_burst_dtmf(struct ipc_message_info *info);
390 void ril_request_dtmf_start(RIL_Token t, void *data, int length);
391 void ril_request_dtmf_stop(RIL_Token t);
392
393 /* SND */
394
395 void ril_request_set_mute(RIL_Token t, void *data, int length);
396 void srs_snd_set_call_clock_sync(struct srs_message *message);
397 void srs_snd_set_call_volume(struct srs_message *message);
398 void srs_snd_set_call_audio_path(struct srs_message *message);
399
400 /* GPRS */
401
402 struct ril_gprs_connection {
403         int cid;
404         int enabled;
405 #if RIL_VERSION >= 6
406         RIL_DataCallFailCause fail_cause;
407 #else
408         RIL_LastDataCallActivateFailCause fail_cause;
409 #endif
410         char *interface;
411
412         RIL_Token token;
413         struct ipc_gprs_pdp_context_set context;
414         struct ipc_gprs_define_pdp_context define_context;
415         struct ipc_gprs_ip_configuration ip_configuration;
416 };
417
418 int ril_gprs_connection_register(int cid);
419 void ril_gprs_connection_unregister(struct ril_gprs_connection *gprs_connection);
420 struct ril_gprs_connection *ril_gprs_connection_find_cid(int cid);
421 struct ril_gprs_connection *ril_gprs_connection_find_token(RIL_Token t);
422 struct ril_gprs_connection *ril_gprs_connection_start(void);
423 void ril_gprs_connection_stop(struct ril_gprs_connection *gprs_connection);
424
425 void ril_request_setup_data_call(RIL_Token t, void *data, int length);
426 void ril_request_deactivate_data_call(RIL_Token t, void *data, int length);
427 void ipc_gprs_ip_configuration(struct ipc_message_info *info);
428 void ipc_gprs_call_status(struct ipc_message_info *info);
429 void ril_request_last_data_call_fail_cause(RIL_Token t);
430 void ipc_gprs_pdp_context(struct ipc_message_info *info);
431 void ril_unsol_data_call_list_changed(void);
432 void ril_request_data_call_list(RIL_Token t);
433
434 /* RFS */
435
436 void ipc_rfs_nv_read_item(struct ipc_message_info *info);
437 void ipc_rfs_nv_write_item(struct ipc_message_info *info);
438
439 #endif