87
DBG("Unknown BSC value %d, please report\n", bsc);
87
DBG("Unknown BSC value %d, please report", bsc);
92
static gboolean query_resp_cb(GIsiClient *client,
93
const void *restrict data, size_t len,
94
uint16_t object, void *opaque)
96
GIsiSubBlockIter iter;
97
const unsigned char *msg = data;
98
struct isi_cb_data *cbd = opaque;
92
static gboolean check_response_status(const GIsiMessage *msg, uint8_t msgid)
94
if (g_isi_msg_error(msg) < 0) {
95
DBG("Error: %s", strerror(-g_isi_msg_error(msg)));
99
if (g_isi_msg_id(msg) != msgid) {
100
DBG("Unexpected msg: %s",
101
ss_message_id_name(g_isi_msg_id(msg)));
107
static gboolean decode_gsm_bsc_info(GIsiSubBlockIter *iter, uint32_t *mask)
113
if (!g_isi_sb_iter_get_byte(iter, &num, 2) ||
114
!g_isi_sb_iter_get_struct(iter, (void **) &bsc, num, 3))
117
for (i = 0; i < num; i++)
118
update_status_mask(mask, bsc[i]);
123
static void query_resp_cb(const GIsiMessage *msg, void *data)
125
struct isi_cb_data *cbd = data;
99
126
ofono_call_settings_status_cb_t cb = cbd->cb;
103
DBG("ISI client error: %d", g_isi_client_error(client));
107
if (len < 7 || msg[0] != SS_SERVICE_COMPLETED_RESP)
110
if (msg[1] != SS_INTERROGATION)
113
for (g_isi_sb_iter_init(&iter, msg, len, 7);
114
g_isi_sb_iter_is_valid(&iter);
115
g_isi_sb_iter_next(&iter)) {
117
switch (g_isi_sb_iter_get_id(&iter)) {
119
case SS_STATUS_RESULT:
122
case SS_GSM_ADDITIONAL_INFO:
125
case SS_GSM_BSC_INFO: {
131
if (!g_isi_sb_iter_get_byte(&iter, &count, 2))
134
for (i = 0; i < count; i++) {
135
if (!g_isi_sb_iter_get_byte(&iter, &bsc, 3 + i))
137
update_status_mask(&mask, bsc);
142
DBG("Skipping sub-block: %s (%zd bytes)",
143
ss_subblock_name(g_isi_sb_iter_get_id(&iter)),
144
g_isi_sb_iter_get_len(&iter));
149
DBG("status_mask %d\n", mask);
150
CALLBACK_WITH_SUCCESS(cb, mask, cbd->data);
127
GIsiSubBlockIter iter;
131
if (!check_response_status(msg, SS_SERVICE_COMPLETED_RESP))
134
if (!g_isi_msg_data_get_byte(msg, 0, &service) ||
135
service != SS_INTERROGATION)
138
for (g_isi_sb_iter_init(&iter, msg, 6);
139
g_isi_sb_iter_is_valid(&iter);
140
g_isi_sb_iter_next(&iter)) {
142
if (g_isi_sb_iter_get_id(&iter) != SS_GSM_BSC_INFO)
145
if (!decode_gsm_bsc_info(&iter, &mask))
148
CALLBACK_WITH_SUCCESS(cb, mask, cbd->data);
154
153
CALLBACK_WITH_FAILURE(cb, 0, cbd->data);
162
156
static void isi_cw_query(struct ofono_call_settings *cs, int cls,
192
static gboolean set_resp_cb(GIsiClient *client,
193
const void *restrict data, size_t len,
194
uint16_t object, void *opaque)
184
static void set_resp_cb(const GIsiMessage *msg, void *data)
196
GIsiSubBlockIter iter;
197
const unsigned char *msg = data;
198
struct isi_cb_data *cbd = opaque;
186
struct isi_cb_data *cbd = data;
199
187
ofono_call_settings_set_cb_t cb = cbd->cb;
201
if (len < 7 || msg[0] != SS_SERVICE_COMPLETED_RESP)
204
if (msg[1] != SS_ACTIVATION && msg[1] != SS_DEACTIVATION)
207
for (g_isi_sb_iter_init(&iter, msg, len, 7);
208
g_isi_sb_iter_is_valid(&iter);
209
g_isi_sb_iter_next(&iter)) {
211
switch (g_isi_sb_iter_get_id(&iter)) {
213
case SS_GSM_ADDITIONAL_INFO:
220
if (!g_isi_sb_iter_get_byte(&iter, &status, 2))
223
if ((status & SS_GSM_ACTIVE)
224
&& (msg[1] == SS_DEACTIVATION))
227
if (!(status & SS_GSM_ACTIVE)
228
&& (msg[1] == SS_ACTIVATION))
234
DBG("Skipping sub-block: %s (%zd bytes)",
235
ss_subblock_name(g_isi_sb_iter_get_id(&iter)),
236
g_isi_sb_iter_get_len(&iter));
188
GIsiSubBlockIter iter;
192
if (!check_response_status(msg, SS_SERVICE_COMPLETED_RESP))
195
if (!g_isi_msg_data_get_byte(msg, 0, &service))
198
if (service != SS_ACTIVATION && service != SS_DEACTIVATION)
201
for (g_isi_sb_iter_init(&iter, msg, 6);
202
g_isi_sb_iter_is_valid(&iter);
203
g_isi_sb_iter_next(&iter)) {
205
if (g_isi_sb_iter_get_id(&iter) != SS_GSM_DATA)
208
if (!g_isi_sb_iter_get_byte(&iter, &status, 2))
211
if ((status & SS_GSM_ACTIVE) && (service == SS_DEACTIVATION))
214
if (!(status & SS_GSM_ACTIVE) && (service == SS_ACTIVATION))
217
CALLBACK_WITH_SUCCESS(cb, cbd->data);
241
CALLBACK_WITH_SUCCESS(cb, cbd->data);
245
222
CALLBACK_WITH_FAILURE(cb, cbd->data);
253
225
static void isi_cw_set(struct ofono_call_settings *cs, int mode, int cls,
283
static gboolean isi_call_settings_register(gpointer user)
253
static void reachable_cb(const GIsiMessage *msg, void *data)
285
struct ofono_call_settings *cs = user;
255
struct ofono_call_settings *cs = data;
257
if (g_isi_msg_error(msg) < 0)
260
ISI_VERSION_DBG(msg);
287
262
ofono_call_settings_register(cs);
292
static void reachable_cb(GIsiClient *client, gboolean alive, uint16_t object,
295
struct ofono_call_settings *cs = opaque;
296
const char *debug = NULL;
299
DBG("Unable to bootstrap call settings driver");
303
DBG("%s (v%03d.%03d) reachable",
304
pn_resource_name(g_isi_client_resource(client)),
305
g_isi_version_major(client),
306
g_isi_version_minor(client));
308
debug = getenv("OFONO_ISI_DEBUG");
309
if (debug && (strcmp(debug, "all") == 0 || strcmp(debug, "ss") == 0))
310
g_isi_client_set_debug(client, ss_debug, NULL);
312
g_idle_add(isi_call_settings_register, cs);
316
265
static int isi_call_settings_probe(struct ofono_call_settings *cs,
317
266
unsigned int vendor, void *user)
319
GIsiModem *idx = user;
320
struct settings_data *data;
322
data = g_try_new0(struct settings_data, 1);
327
data->client = g_isi_client_create(idx, PN_SS);
332
ofono_call_settings_set_data(cs, data);
334
if (!g_isi_verify(data->client, reachable_cb, cs))
335
DBG("Unable to verify reachability");
268
GIsiModem *modem = user;
269
struct settings_data *sd;
271
sd = g_try_new0(struct settings_data, 1);
275
sd->client = g_isi_client_create(modem, PN_SS);
276
if (sd->client == NULL) {
281
ofono_call_settings_set_data(cs, sd);
283
g_isi_client_verify(sd->client, reachable_cb, cs, NULL);