~indicator-network-developers/ofono/trunk.packaging

« back to all changes in this revision

Viewing changes to src/network.c

  • Committer: Kalle Valo
  • Date: 2011-02-21 07:46:07 UTC
  • mfrom: (2738.1.2125)
  • Revision ID: kalle.valo@canonical.com-20110221074607-u4rocuj2p75kpht9
Merge trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
75
75
        struct sim_spdi *spdi;
76
76
        struct sim_eons *eons;
77
77
        struct ofono_sim *sim;
 
78
        struct ofono_sim_context *sim_context;
78
79
        GKeyFile *settings;
79
80
        char *imsi;
80
81
        struct ofono_watchlist *status_watches;
204
205
        netreg->pending = NULL;
205
206
 
206
207
out:
207
 
        if (netreg->driver->registration_status)
208
 
                netreg->driver->registration_status(netreg,
 
208
        if (netreg->driver->registration_status == NULL)
 
209
                return;
 
210
 
 
211
        netreg->driver->registration_status(netreg,
209
212
                                        registration_status_callback, netreg);
210
213
}
211
214
 
1304
1307
 
1305
1308
        if (netreg->status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
1306
1309
                netreg->status == NETWORK_REGISTRATION_STATUS_ROAMING) {
1307
 
                if (netreg->driver->current_operator)
 
1310
                if (netreg->driver->current_operator != NULL)
1308
1311
                        netreg->driver->current_operator(netreg,
1309
1312
                                        current_operator_callback, netreg);
1310
1313
 
1311
 
                if (netreg->driver->strength)
 
1314
                if (netreg->driver->strength != NULL)
1312
1315
                        netreg->driver->strength(netreg,
1313
1316
                                        signal_strength_callback, netreg);
1314
1317
        } else {
1357
1360
         */
1358
1361
        if (netreg->status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
1359
1362
                netreg->status == NETWORK_REGISTRATION_STATUS_ROAMING) {
1360
 
                if (netreg->driver->strength)
 
1363
                if (netreg->driver->strength != NULL)
1361
1364
                        netreg->driver->strength(netreg,
1362
1365
                                        signal_strength_callback, netreg);
1363
1366
        }
1366
1369
                (status == NETWORK_REGISTRATION_STATUS_NOT_REGISTERED ||
1367
1370
                        status == NETWORK_REGISTRATION_STATUS_DENIED ||
1368
1371
                        status == NETWORK_REGISTRATION_STATUS_UNKNOWN)) {
1369
 
                if (netreg->driver->register_auto)
 
1372
                if (netreg->driver->register_auto != NULL)
1370
1373
                        netreg->driver->register_auto(netreg, init_register,
1371
1374
                                                        netreg);
1372
1375
        }
1469
1472
         * is present.
1470
1473
         */
1471
1474
        if (netreg->eons && !sim_eons_pnn_is_empty(netreg->eons))
1472
 
                ofono_sim_read(netreg->sim, SIM_EFOPL_FILEID,
 
1475
                ofono_sim_read(netreg->sim_context, SIM_EFOPL_FILEID,
1473
1476
                                OFONO_SIM_FILE_STRUCTURE_FIXED,
1474
1477
                                sim_opl_read_cb, netreg);
1475
1478
}
1548
1551
        }
1549
1552
 
1550
1553
        netreg->spname = spn;
1551
 
        ofono_sim_read(netreg->sim, SIM_EFSPDI_FILEID,
 
1554
        ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
1552
1555
                        OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1553
1556
                        sim_spdi_read_cb, netreg);
1554
1557
 
1682
1685
                netreg->settings = NULL;
1683
1686
        }
1684
1687
 
 
1688
        if (netreg->sim_context) {
 
1689
                ofono_sim_context_free(netreg->sim_context);
 
1690
                netreg->sim_context = NULL;
 
1691
        }
 
1692
 
 
1693
        netreg->sim = NULL;
 
1694
 
1685
1695
        g_dbus_unregister_interface(conn, path,
1686
1696
                                        OFONO_NETWORK_REGISTRATION_INTERFACE);
1687
1697
        ofono_modem_remove_interface(modem,
1697
1707
        if (netreg == NULL)
1698
1708
                return;
1699
1709
 
1700
 
        if (netreg->driver && netreg->driver->remove)
 
1710
        if (netreg->driver != NULL && netreg->driver->remove != NULL)
1701
1711
                netreg->driver->remove(netreg);
1702
1712
 
1703
 
        if (netreg->eons)
1704
 
                sim_eons_free(netreg->eons);
1705
 
 
1706
 
        if (netreg->spdi)
1707
 
                sim_spdi_free(netreg->spdi);
1708
 
 
1709
 
        if (netreg->spname)
1710
 
                g_free(netreg->spname);
1711
 
 
 
1713
        sim_eons_free(netreg->eons);
 
1714
        sim_spdi_free(netreg->spdi);
 
1715
 
 
1716
        g_free(netreg->spname);
1712
1717
        g_free(netreg);
1713
1718
}
1714
1719
 
1779
1784
                                "Mode", netreg->mode);
1780
1785
}
1781
1786
 
 
1787
static void sim_pnn_opl_changed(int id, void *userdata)
 
1788
{
 
1789
        struct ofono_netreg *netreg = userdata;
 
1790
        GSList *l;
 
1791
 
 
1792
        /*
 
1793
         * Free references to structures on the netreg->eons list and
 
1794
         * update the operator info on D-bus.  If EFpnn/EFopl read succeeds,
 
1795
         * operator info will be updated again, otherwise it won't be
 
1796
         * updated again.
 
1797
         */
 
1798
        for (l = netreg->operator_list; l; l = l->next)
 
1799
                set_network_operator_eons_info(l->data, NULL);
 
1800
 
 
1801
        sim_eons_free(netreg->eons);
 
1802
        netreg->eons = NULL;
 
1803
 
 
1804
        ofono_sim_read(netreg->sim_context, SIM_EFPNN_FILEID,
 
1805
                        OFONO_SIM_FILE_STRUCTURE_FIXED,
 
1806
                        sim_pnn_read_cb, netreg);
 
1807
}
 
1808
 
 
1809
static void sim_spn_spdi_changed(int id, void *userdata)
 
1810
{
 
1811
        struct ofono_netreg *netreg = userdata;
 
1812
 
 
1813
        netreg->flags &= ~(NETWORK_REGISTRATION_FLAG_HOME_SHOW_PLMN |
 
1814
                        NETWORK_REGISTRATION_FLAG_ROAMING_SHOW_SPN);
 
1815
 
 
1816
        g_free(netreg->spname);
 
1817
        netreg->spname = NULL;
 
1818
 
 
1819
        sim_spdi_free(netreg->spdi);
 
1820
        netreg->spdi = NULL;
 
1821
 
 
1822
        if (netreg->current_operator) {
 
1823
                DBusConnection *conn = ofono_dbus_get_connection();
 
1824
                const char *path = __ofono_atom_get_path(netreg->atom);
 
1825
                const char *operator;
 
1826
 
 
1827
                operator = get_operator_display_name(netreg);
 
1828
 
 
1829
                ofono_dbus_signal_property_changed(conn, path,
 
1830
                                        OFONO_NETWORK_REGISTRATION_INTERFACE,
 
1831
                                        "Name", DBUS_TYPE_STRING,
 
1832
                                        &operator);
 
1833
        }
 
1834
 
 
1835
        ofono_sim_read(netreg->sim_context, SIM_EFSPN_FILEID,
 
1836
                        OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
 
1837
                        sim_spn_read_cb, netreg);
 
1838
}
 
1839
 
1782
1840
void ofono_netreg_register(struct ofono_netreg *netreg)
1783
1841
{
1784
1842
        DBusConnection *conn = ofono_dbus_get_connection();
1801
1859
 
1802
1860
        ofono_modem_add_interface(modem, OFONO_NETWORK_REGISTRATION_INTERFACE);
1803
1861
 
1804
 
        if (netreg->driver->registration_status)
 
1862
        if (netreg->driver->registration_status != NULL)
1805
1863
                netreg->driver->registration_status(netreg,
1806
1864
                                        init_registration_status, netreg);
1807
1865
 
1808
1866
        sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM);
1809
1867
 
1810
 
        if (sim_atom) {
 
1868
        if (sim_atom != NULL) {
1811
1869
                /* Assume that if sim atom exists, it is ready */
1812
1870
                netreg->sim = __ofono_atom_get_data(sim_atom);
 
1871
                netreg->sim_context = ofono_sim_context_create(netreg->sim);
1813
1872
 
1814
1873
                netreg_load_settings(netreg);
1815
1874
 
1816
 
                ofono_sim_read(netreg->sim, SIM_EFPNN_FILEID,
 
1875
                ofono_sim_read(netreg->sim_context, SIM_EFPNN_FILEID,
1817
1876
                                OFONO_SIM_FILE_STRUCTURE_FIXED,
1818
1877
                                sim_pnn_read_cb, netreg);
1819
 
                ofono_sim_read(netreg->sim, SIM_EFSPN_FILEID,
 
1878
                ofono_sim_add_file_watch(netreg->sim_context, SIM_EFPNN_FILEID,
 
1879
                                                sim_pnn_opl_changed, netreg,
 
1880
                                                NULL);
 
1881
                ofono_sim_add_file_watch(netreg->sim_context, SIM_EFOPL_FILEID,
 
1882
                                                sim_pnn_opl_changed, netreg,
 
1883
                                                NULL);
 
1884
 
 
1885
                ofono_sim_read(netreg->sim_context, SIM_EFSPN_FILEID,
1820
1886
                                OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
1821
1887
                                sim_spn_read_cb, netreg);
 
1888
                ofono_sim_add_file_watch(netreg->sim_context, SIM_EFSPN_FILEID,
 
1889
                                                sim_spn_spdi_changed, netreg,
 
1890
                                                NULL);
 
1891
                ofono_sim_add_file_watch(netreg->sim_context, SIM_EFSPDI_FILEID,
 
1892
                                                sim_spn_spdi_changed, netreg,
 
1893
                                                NULL);
1822
1894
        }
1823
1895
 
1824
1896
        __ofono_atom_register(netreg->atom, netreg_unregister);