~awe/phablet-extras/ofono-socket-exit

« back to all changes in this revision

Viewing changes to drivers/rilmodem/sim.c

[rilmodem] Initial GPRS support.

Approved by Ricardo Salveti, PS Jenkins bot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
/* FID/path of SIM/USIM root directory */
65
65
#define ROOTMF "3F00"
66
66
 
 
67
static char print_buf[PRINT_BUF_SIZE];
 
68
 
67
69
/*
68
70
 * TODO: CDMA/IMS
69
71
 *
96
98
        char *hex_path = NULL;
97
99
        int len = 0;
98
100
 
 
101
        DBG("");
 
102
 
99
103
        if (path_len > 0 && path_len < 7) {
100
104
                memcpy(db_path, path, path_len);
101
105
                len = path_len;
110
114
        if (len > 0) {
111
115
                hex_path = encode_hex(db_path, len, 0);
112
116
                parcel_w_string(rilp, (char *) hex_path);
113
 
                DBG("encoded path is: %s", hex_path);
 
117
 
 
118
                DBG("len > 0");
 
119
 
 
120
                /* TODO: make conditional */
 
121
                ril_append_print_buf("%spath=%s,",
 
122
                                print_buf,
 
123
                                hex_path);
 
124
                /* TODO: make conditional */
 
125
 
114
126
                g_free(hex_path);
115
127
        } else if (fileid == SIM_EF_ICCID_FILEID || fileid == SIM_EFPL_FILEID) {
116
128
                /*
124
136
                 * ../../src/simutil.c for more details.
125
137
                 */
126
138
                parcel_w_string(rilp, (char *) ROOTMF);
127
 
                DBG("encoded path is: %s", ROOTMF);
 
139
 
 
140
                /* TODO: make conditional */
 
141
                ril_append_print_buf("%spath=%s,",
 
142
                                print_buf,
 
143
                                ROOTMF);
 
144
                /* TODO: make conditional */
 
145
        } else {
 
146
                /*
 
147
                 * The only known case of this is EFPHASE_FILED (0x6FAE).
 
148
                 * The ef_db table ( see /src/simutil.c ) entry for
 
149
                 * EFPHASE contains a value of 0x0000 for it's
 
150
                 * 'parent3g' member.  This causes a NULL path to
 
151
                 * be returned.
 
152
                 */
 
153
 
 
154
                DBG("db_get_path*() returned empty path.");
 
155
                parcel_w_string(rilp, NULL);
128
156
        }
129
157
}
130
158
 
211
239
        int ret;
212
240
 
213
241
        parcel_init(&rilp);
 
242
 
214
243
        parcel_w_int32(&rilp, CMD_GET_RESPONSE);
215
244
        parcel_w_int32(&rilp, fileid);
216
245
 
 
246
        /* TODO: make conditional */
 
247
        ril_start_request;
 
248
        ril_append_print_buf("%scmd=0x%.2X,efid=0x%.4X,",
 
249
                        print_buf,
 
250
                        CMD_GET_RESPONSE,
 
251
                        fileid);
 
252
        /* TODO: make conditional */
 
253
 
217
254
        set_path(sd, &rilp, fileid, path, path_len);
218
255
 
219
 
        DBG("fileid: %s (%x)", sim_fileid_to_string(fileid), fileid);
220
 
 
221
256
        parcel_w_int32(&rilp, 0);           /* P1 */
222
257
        parcel_w_int32(&rilp, 0);           /* P2 */
223
258
 
240
275
                                rilp.size,
241
276
                                ril_file_info_cb, cbd, g_free);
242
277
 
 
278
        /* TODO: make conditional */
 
279
        ril_append_print_buf("%s%d,%d,%d,%s,pin2=%s,aid=%s",
 
280
                        print_buf,
 
281
                        0,
 
282
                        0,
 
283
                        15,
 
284
                        NULL,
 
285
                        NULL,
 
286
                        sd->app_id);
 
287
 
 
288
        ril_close_request;
 
289
        ril_print_request(ret, RIL_REQUEST_SIM_IO);
 
290
        /* TODO: make conditional */
 
291
 
243
292
        parcel_free(&rilp);
244
293
 
245
294
        if (ret <= 0) {
297
346
        DBG("fileid: %s (%x) path: %s", sim_fileid_to_string(fileid),
298
347
                fileid, path);
299
348
 
 
349
        /* TODO: make conditional */
 
350
        ril_start_request;
 
351
        ril_append_print_buf("%scmd=0x%.2X,efid=0x%.4X,",
 
352
                        print_buf,
 
353
                        CMD_READ_BINARY,
 
354
                        fileid);
 
355
        /* TODO: make conditional */
 
356
 
300
357
        parcel_init(&rilp);
301
358
        parcel_w_int32(&rilp, CMD_READ_BINARY);
302
359
        parcel_w_int32(&rilp, fileid);
315
372
                                rilp.data,
316
373
                                rilp.size,
317
374
                                ril_file_io_cb, cbd, g_free);
 
375
 
 
376
        /* TODO: make conditional */
 
377
        ril_append_print_buf("%s%d,%d,%d,%s,pin2=%s,aid=%s",
 
378
                        print_buf,
 
379
                        (start >> 8),
 
380
                        (start & 0xff),
 
381
                        length,
 
382
                        NULL,
 
383
                        NULL,
 
384
                        sd->app_id);
 
385
 
 
386
        ril_close_request;
 
387
        ril_print_request(ret, RIL_REQUEST_SIM_IO);
 
388
        /* TODO: make conditional */
 
389
 
318
390
        parcel_free(&rilp);
319
391
 
320
392
        if (ret <= 0) {
333
405
        struct parcel rilp;
334
406
        int ret;
335
407
 
336
 
        DBG("fileid: %s (%x) path: %s", sim_fileid_to_string(fileid),
337
 
                fileid, path);
 
408
        /* TODO: make conditional */
 
409
        ril_start_request;
 
410
        ril_append_print_buf("%scmd=0x%.2X,efid=0x%.4X,",
 
411
                        print_buf,
 
412
                        CMD_GET_RESPONSE,
 
413
                        fileid);
 
414
        /* TODO: make conditional */
338
415
 
339
416
        parcel_init(&rilp);
340
417
        parcel_w_int32(&rilp, CMD_READ_RECORD);
355
432
                                rilp.size,
356
433
                                ril_file_io_cb, cbd, g_free);
357
434
 
 
435
        /* TODO: make conditional */
 
436
        ril_append_print_buf("%s%d,%d,%d,%s,pin2=%s,aid=%s",
 
437
                        print_buf,
 
438
                        record,
 
439
                        4,
 
440
                        length,
 
441
                        NULL,
 
442
                        NULL,
 
443
                        sd->app_id);
 
444
        ril_close_request;
 
445
        ril_print_request(ret, RIL_REQUEST_SIM_IO);
 
446
        /* TODO: make conditional */
 
447
 
358
448
        parcel_free(&rilp);
359
449
 
360
450
        if (ret <= 0) {
381
471
                return;
382
472
        }
383
473
 
384
 
        /* Set up Parcel struct for proper parsing */
385
 
        rilp.data = message->buf;
386
 
        rilp.size = message->buf_len;
387
 
        rilp.capacity = message->buf_len;
388
 
        rilp.offset = 0;
 
474
        ril_util_init_parcel(message, &rilp);
389
475
 
390
476
        /* 15 is the max length of IMSI
391
477
         * add 4 bytes for string length */
392
478
        /* FIXME: g_assert(message->buf_len <= 19); */
393
 
 
394
479
        imsi = parcel_r_string(&rilp);
395
480
 
396
 
        DBG("ril_imsi_cb: IMSI: %s", imsi);
 
481
        /* TODO: make conditional */
 
482
        ril_append_print_buf("[%04d]< %s",
 
483
                        message->serial_no,
 
484
                        ril_request_id_to_string(message->req));
 
485
 
 
486
        ril_start_response;
 
487
 
 
488
        ril_append_print_buf("%s%s",
 
489
                        print_buf,
 
490
                        imsi);
 
491
 
 
492
        ril_close_response;
 
493
        ril_print_response;
 
494
        /* TODO: make conditional */
397
495
 
398
496
        cb(&error, imsi, cbd->data);
399
497
        g_free(imsi);
415
513
 
416
514
        ret = g_ril_send(sd->ril, RIL_REQUEST_GET_IMSI,
417
515
                                rilp.data, rilp.size, ril_imsi_cb, cbd, g_free);
 
516
 
 
517
        /* TODO: make conditional */
 
518
        ril_start_request;
 
519
        ril_append_print_buf("%s%s", print_buf, sd->app_id);
 
520
        ril_close_request;
 
521
        ril_print_request(ret, RIL_REQUEST_GET_IMSI);
 
522
        /* TODO: make conditional */
 
523
 
418
524
        parcel_free(&rilp);
419
525
 
420
526
        if (ret <= 0) {
437
543
 
438
544
                if (app.app_type != RIL_APPTYPE_UNKNOWN)
439
545
                        sd->app_type = app.app_type;
 
546
 
 
547
                ofono_sim_register(sim);
440
548
        }
 
549
 
 
550
        /* TODO: if no SIM present, handle emergency calling. */
441
551
}
442
552
 
443
553
static int send_get_sim_status(struct ofono_sim *sim)
444
554
{
445
555
        struct sim_data *sd = ofono_sim_get_data(sim);
 
556
        int ret;
446
557
 
447
 
        return g_ril_send(sd->ril, RIL_REQUEST_GET_SIM_STATUS,
 
558
        ret = g_ril_send(sd->ril, RIL_REQUEST_GET_SIM_STATUS,
448
559
                                NULL, 0, sim_status_cb, sim, NULL);
 
560
 
 
561
        /* TODO: make conditional */
 
562
        ril_clear_print_buf;
 
563
        ril_print_request(ret, RIL_REQUEST_GET_SIM_STATUS);
 
564
        /* TODO: make conditional */
 
565
 
 
566
        return ret;
449
567
}
450
568
 
451
569
static gboolean ril_sim_register(gpointer user)
455
573
        DBG("");
456
574
 
457
575
        send_get_sim_status(sim);
458
 
 
459
 
        /* TODO: consider replacing idle call of register
460
 
         * with call in sim_status_cb().
461
 
         */
462
 
        ofono_sim_register(sim);
463
 
 
464
576
        return FALSE;
465
577
}
466
578