[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://git.merproject.org/slava/ofono.git</param>
<param name="branch">master</param>
- <param name="revision">7d29ef1</param>
+ <param name="revision">5bd2b96</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/Makefile.am
^
|
@@ -132,6 +132,7 @@
drivers/ril/ril_gprs_context.c \
drivers/ril/ril_mce.c \
drivers/ril/ril_modem.c \
+ drivers/ril/ril_mtu.c \
drivers/ril/ril_netreg.c \
drivers/ril/ril_network.c \
drivers/ril/ril_oem_raw.c \
@@ -143,6 +144,8 @@
drivers/ril/ril_sim.c \
drivers/ril/ril_sim_card.c \
drivers/ril/ril_sim_dbus.c \
+ drivers/ril/ril_sim_info.c \
+ drivers/ril/ril_sim_info_dbus.c \
drivers/ril/ril_sms.c \
drivers/ril/ril_stk.c \
drivers/ril/ril_ussd.c \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_data.c
^
|
@@ -514,6 +514,7 @@
/* Request has been submitted already */
grilio_queue_cancel_request(priv->q,
priv->pending_req_id, FALSE);
+ priv->pending_req = NULL;
priv->pending_req_id = 0;
} else if (priv->req_queue == req) {
/* It's the first one in the queue */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_gprs_context.c
^
|
@@ -17,18 +17,19 @@
#include "ril_network.h"
#include "ril_data.h"
#include "ril_util.h"
+#include "ril_mtu.h"
#include "ril_log.h"
#include <gutil_strv.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
#include <arpa/inet.h>
#include "common.h"
#define CTX_ID_NONE ((unsigned int)(-1))
+#define MAX_MTU 1280
+
struct ril_gprs_context_call {
struct ril_data_call_request *req;
ofono_gprs_context_cb_t cb;
@@ -42,6 +43,7 @@
struct ril_data *data;
guint active_ctx_cid;
gulong calls_changed_event_id;
+ struct ril_mtu_watch *mtu_watch;
struct ril_data_call *active_call;
struct ril_gprs_context_call activate;
struct ril_gprs_context_call deactivate;
@@ -123,10 +125,33 @@
static void ril_gprs_context_free_active_call(struct ril_gprs_context *gcd)
{
- ril_data_call_free(gcd->active_call);
- gcd->active_call = NULL;
- ril_data_remove_handler(gcd->data, gcd->calls_changed_event_id);
- gcd->calls_changed_event_id = 0;
+ if (gcd->active_call) {
+ ril_data_call_free(gcd->active_call);
+ gcd->active_call = NULL;
+ }
+ if (gcd->calls_changed_event_id) {
+ ril_data_remove_handler(gcd->data, gcd->calls_changed_event_id);
+ gcd->calls_changed_event_id = 0;
+ }
+ if (gcd->mtu_watch) {
+ ril_mtu_watch_free(gcd->mtu_watch);
+ gcd->mtu_watch = NULL;
+ }
+}
+
+static void ril_gprs_context_set_active_call(struct ril_gprs_context *gcd,
+ const struct ril_data_call *call)
+{
+ if (call) {
+ ril_data_call_free(gcd->active_call);
+ gcd->active_call = ril_data_call_dup(call);
+ if (!gcd->mtu_watch) {
+ gcd->mtu_watch = ril_mtu_watch_new(MAX_MTU);
+ }
+ ril_mtu_watch_set_ifname(gcd->mtu_watch, call->ifname);
+ } else {
+ ril_gprs_context_free_active_call(gcd);
+ }
}
static void ril_gprs_context_set_disconnected(struct ril_gprs_context *gcd)
@@ -278,8 +303,13 @@
return;
}
- /* Store the updated call data */
- gcd->active_call = ril_data_call_dup(call);
+ /*
+ * prev_call points to the previous active call, and it will
+ * be deallocated at the end of the this function. Clear the
+ * gcd->active_call pointer so that we don't deallocate it twice.
+ */
+ gcd->active_call = NULL;
+ ril_gprs_context_set_active_call(gcd, call);
if (call->status != PDP_FAIL_NONE) {
ofono_info("data call status: %d", call->status);
@@ -431,8 +461,7 @@
}
ril_error_init_ok(&error);
- ril_data_call_free(gcd->active_call);
- gcd->active_call = ril_data_call_dup(call);
+ ril_gprs_context_set_active_call(gcd, call);
GASSERT(!gcd->calls_changed_event_id);
ril_data_remove_handler(gcd->data, gcd->calls_changed_event_id);
@@ -612,6 +641,7 @@
ril_data_unref(gcd->data);
ril_network_unref(gcd->network);
ril_data_call_free(gcd->active_call);
+ ril_mtu_watch_free(gcd->mtu_watch);
g_free(gcd);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_modem.c
^
|
@@ -220,7 +220,8 @@
req->data = NULL;
cb(ril_error_failure(&error), cb_data);
ril_modem_update_online_state(req->md);
- return FALSE;
+
+ return G_SOURCE_REMOVE;
}
static gboolean ril_modem_online_check(gpointer data)
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_mtu.c
^
|
@@ -0,0 +1,223 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ril_mtu.h"
+#include "ril_log.h"
+
+#include <net/if.h>
+#include <sys/ioctl.h>
+
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+
+struct ril_mtu_watch {
+ int max_mtu;
+ char *ifname;
+ void *buf;
+ int bufsize;
+ GIOChannel *channel;
+ guint io_watch;
+ int fd;
+};
+
+static void ril_mtu_watch_limit_mtu(struct ril_mtu_watch *self)
+{
+ int fd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (fd >= 0) {
+ struct ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, self->ifname, IFNAMSIZ);
+ if (ioctl(fd, SIOCGIFMTU, &ifr) < 0 ||
+ ifr.ifr_mtu > self->max_mtu) {
+ DBG("%s mtu %d => %d", self->ifname, ifr.ifr_mtu,
+ self->max_mtu);
+ ifr.ifr_mtu = self->max_mtu;
+ if (ioctl(fd, SIOCSIFMTU, &ifr) < 0) {
+ ofono_error("Failed to set MTU");
+ }
+ }
+ close(fd);
+ }
+}
+
+static void ril_mtu_watch_handle_rtattr(struct ril_mtu_watch *self,
+ const struct rtattr *rta, int len)
+{
+ int mtu = 0;
+ const char *ifname = NULL;
+ while (len > 0 && RTA_OK(rta, len) && (!mtu || !ifname)) {
+ switch (rta->rta_type) {
+ case IFLA_IFNAME:
+ ifname = RTA_DATA(rta);
+ break;
+ case IFLA_MTU:
+ mtu = *((int*)RTA_DATA(rta));
+ break;
+ }
+ rta = RTA_NEXT(rta, len);
+ }
+ if (mtu > self->max_mtu && !g_strcmp0(ifname, self->ifname)) {
+ DBG("%s %d", ifname, mtu);
+ ril_mtu_watch_limit_mtu(self);
+ }
+}
+
+static void ril_mtu_watch_handle_ifinfomsg(struct ril_mtu_watch *self,
+ const struct ifinfomsg *ifi, int len)
+{
+ if (ifi->ifi_flags & IFF_UP) {
+ const struct rtattr *rta = IFLA_RTA(ifi);
+ ril_mtu_watch_handle_rtattr(self, rta,
+ len - ((char*)rta - (char*)ifi));
+ }
+}
+
+static void ril_mtu_watch_handle_nlmsg(struct ril_mtu_watch *self,
+ const struct nlmsghdr *hdr, int len)
+{
+ while (len > 0 && NLMSG_OK(hdr, len)) {
+ if (hdr->nlmsg_type == RTM_NEWLINK) {
+ ril_mtu_watch_handle_ifinfomsg(self, NLMSG_DATA(hdr),
+ IFLA_PAYLOAD(hdr));
+ }
+ hdr = NLMSG_NEXT(hdr, len);
+ }
+}
+
+static gboolean ril_mtu_watch_event(GIOChannel *ch, GIOCondition cond,
+ gpointer data)
+{
+ struct ril_mtu_watch *self = data;
+ struct sockaddr_nl addr;
+ socklen_t addrlen = sizeof(addr);
+ ssize_t result = recvfrom(self->fd, self->buf, self->bufsize, 0,
+ (struct sockaddr *)&addr, &addrlen);
+ if (result > 0) {
+ if (!addr.nl_pid) {
+ ril_mtu_watch_handle_nlmsg(self, self->buf, result);
+ }
+ return G_SOURCE_CONTINUE;
+ } else if (result == 0 || errno == EINTR || errno == EAGAIN) {
+ return G_SOURCE_CONTINUE;
+ } else {
+ DBG("%s error %d", self->ifname, errno);
+ self->io_watch = 0;
+ return G_SOURCE_REMOVE;
+ }
+}
+
+static gboolean ril_mtu_watch_open_socket(struct ril_mtu_watch *self)
+{
+ GASSERT(self->fd < 0);
+ self->fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+ if (self->fd >= 0) {
+ struct sockaddr_nl nl;
+ memset(&nl, 0, sizeof(nl));
+ nl.nl_pid = getpid();
+ nl.nl_family = AF_NETLINK;
+ nl.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE |
+ RTMGRP_IPV6_IFADDR | RTMGRP_IPV6_ROUTE |
+ RTMGRP_LINK;
+
+ if (bind(self->fd, (struct sockaddr*)&nl, sizeof(nl)) >= 0) {
+ return TRUE;
+ }
+ close(self->fd);
+ self->fd = -1;
+ }
+ return FALSE;
+}
+
+static gboolean ril_mtu_watch_start(struct ril_mtu_watch *self)
+{
+ if (self->fd >= 0) {
+ return TRUE;
+ } else if (ril_mtu_watch_open_socket(self)) {
+ GASSERT(!self->channel);
+ GASSERT(!self->io_watch);
+ self->channel = g_io_channel_unix_new(self->fd);
+ if (self->channel) {
+ g_io_channel_set_encoding(self->channel, NULL, NULL);
+ g_io_channel_set_buffered(self->channel, FALSE);
+ self->io_watch = g_io_add_watch(self->channel,
+ G_IO_IN | G_IO_NVAL | G_IO_HUP,
+ ril_mtu_watch_event, self);
+ return TRUE;
+ }
+ close(self->fd);
+ self->fd = -1;
+ }
+ return FALSE;
+}
+
+static void ril_mtu_watch_stop(struct ril_mtu_watch *self)
+{
+ if (self->io_watch) {
+ g_source_remove(self->io_watch);
+ self->io_watch = 0;
+ }
+ if (self->channel) {
+ g_io_channel_shutdown(self->channel, TRUE, NULL);
+ g_io_channel_unref(self->channel);
+ self->channel = NULL;
+ }
+ if (self->fd >= 0) {
+ close(self->fd);
+ self->fd = -1;
+ }
+}
+
+struct ril_mtu_watch *ril_mtu_watch_new(int max_mtu)
+{
+ struct ril_mtu_watch *self = g_new0(struct ril_mtu_watch, 1);
+ self->fd = -1;
+ self->max_mtu = max_mtu;
+ self->bufsize = 4096;
+ self->buf = g_malloc(self->bufsize);
+ return self;
+}
+
+void ril_mtu_watch_free(struct ril_mtu_watch *self)
+{
+ if (self) {
+ ril_mtu_watch_stop(self);
+ g_free(self->ifname);
+ g_free(self->buf);
+ g_free(self);
+ }
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_mtu.h
^
|
@@ -0,0 +1,33 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef RIL_MTU_H
+#define RIL_MTU_H
+
+#include "ril_types.h"
+
+struct ril_mtu_watch *ril_mtu_watch_new(int max_mtu);
+void ril_mtu_watch_free(struct ril_mtu_watch *mw);
+void ril_mtu_watch_set_ifname(struct ril_mtu_watch *mw, const char *ifname);
+
+#endif /* RIL_MTU_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_plugin.c
^
|
@@ -15,6 +15,7 @@
#include "ril_plugin.h"
#include "ril_sim_card.h"
+#include "ril_sim_info.h"
#include "ril_network.h"
#include "ril_radio.h"
#include "ril_data.h"
@@ -107,6 +108,8 @@
struct ril_radio *radio;
struct ril_network *network;
struct ril_sim_card *sim_card;
+ struct ril_sim_info *sim_info;
+ struct ril_sim_info_dbus *sim_info_dbus;
struct ril_data *data;
GRilIoChannel *io;
gulong io_event_id[IO_EVENT_COUNT];
@@ -183,6 +186,7 @@
ofono_sim_remove_state_watch(slot->sim,
slot->sim_state_watch_id);
}
+ ril_sim_info_set_ofono_sim(slot->sim_info, NULL);
slot->sim = NULL;
}
@@ -511,11 +515,13 @@
GASSERT(!slot->sim);
GASSERT(slot->sim_watch_id);
GASSERT(!slot->sim_state_watch_id);
+
slot->sim = sim;
slot->sim_state = ofono_sim_get_state(sim);
slot->sim_state_watch_id = ofono_sim_add_state_watch(sim,
ril_plugin_sim_state_watch, slot,
ril_plugin_sim_state_watch_done);
+ ril_sim_info_set_ofono_sim(slot->sim_info, sim);
}
static void ril_plugin_sim_watch(struct ofono_atom *atom,
@@ -528,6 +534,7 @@
ril_plugin_register_sim(slot, __ofono_atom_get_data(atom));
} else if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
DBG("%s sim unregistered", slot->path + 1);
+ ril_sim_info_set_ofono_sim(slot->sim_info, NULL);
slot->sim = NULL;
}
@@ -579,10 +586,16 @@
slot->sim_dbus = NULL;
}
+ if (slot->sim_info_dbus) {
+ ril_sim_info_dbus_free(slot->sim_info_dbus);
+ slot->sim_info_dbus = NULL;
+ }
+
slot->modem = NULL;
slot->online = FALSE;
ril_data_allow(slot->data, FALSE);
ril_plugin_update_modem_paths_full(slot->plugin);
+ ril_sim_info_set_ofono_sim(slot->sim_info, NULL);
}
static void ril_plugin_trace(GRilIoChannel *io, GRILIO_PACKET_TYPE type,
@@ -686,6 +699,9 @@
ril_plugin_register_sim(slot, sim);
}
+ slot->sim_info_dbus = ril_sim_info_dbus_new(slot->modem,
+ slot->sim_info);
+
ril_modem_set_removed_cb(modem, ril_plugin_modem_removed, slot);
ril_modem_set_online_cb(modem, ril_plugin_modem_online, slot);
} else {
@@ -851,7 +867,8 @@
GASSERT(slot->retry_id);
slot->retry_id = 0;
ril_plugin_init_io(slot);
- return FALSE;
+
+ return G_SOURCE_REMOVE;
}
static void ril_plugin_retry_init_io(struct ril_slot *slot)
@@ -1005,6 +1022,7 @@
static void ril_plugin_delete_slot(struct ril_slot *slot)
{
ril_plugin_shutdown_slot(slot, TRUE);
+ ril_sim_info_unref(slot->sim_info);
g_free(slot->path);
g_free(slot->imei);
g_free(slot->name);
@@ -1329,6 +1347,7 @@
slot->plugin = plugin;
slot->pub.path = slot->path;
slot->pub.config = &slot->config;
+ slot->sim_info = ril_sim_info_new(NULL);
}
*info = NULL;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_plugin.h
^
|
@@ -103,6 +103,11 @@
const char *ril_sim_dbus_imsi(struct ril_sim_dbus *dbus);
void ril_sim_dbus_free(struct ril_sim_dbus *dbus);
+struct ril_sim_info_dbus;
+struct ril_sim_info_dbus *ril_sim_info_dbus_new(struct ril_modem *md,
+ struct ril_sim_info *info);
+void ril_sim_info_dbus_free(struct ril_sim_info_dbus *dbus);
+
struct ril_plugin_dbus *ril_plugin_dbus_new(struct ril_plugin *plugin);
void ril_plugin_dbus_free(struct ril_plugin_dbus *dbus);
void ril_plugin_dbus_block_imei_requests(struct ril_plugin_dbus *dbus,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_plugin_dbus.c
^
|
@@ -179,12 +179,12 @@
name, DBUS_TYPE_STRING, &imsi, DBUS_TYPE_INVALID);
}
-static inline void ril_plugin_dbus_signal_path(struct ril_plugin_dbus *dbus,
- const char *name, const char *path)
+static inline void ril_plugin_dbus_signal_string(struct ril_plugin_dbus *dbus,
+ const char *name, const char *str)
{
- if (!path) path = "";
+ if (!str) str = "";
g_dbus_emit_signal(dbus->conn, RIL_DBUS_PATH, RIL_DBUS_INTERFACE,
- name, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID);
+ name, DBUS_TYPE_STRING, &str, DBUS_TYPE_INVALID);
}
void ril_plugin_dbus_signal(struct ril_plugin_dbus *dbus, int mask)
@@ -201,11 +201,9 @@
dbus->plugin->default_data_imsi);
}
if (mask & RIL_PLUGIN_SIGNAL_MMS_IMSI) {
- g_dbus_emit_signal(dbus->conn, RIL_DBUS_PATH,
- RIL_DBUS_INTERFACE,
+ ril_plugin_dbus_signal_string(dbus,
RIL_DBUS_SIGNAL_MMS_SIM_CHANGED,
- DBUS_TYPE_STRING, &dbus->plugin->mms_imsi,
- DBUS_TYPE_INVALID);
+ dbus->plugin->mms_imsi);
}
if (mask & RIL_PLUGIN_SIGNAL_ENABLED_SLOTS) {
ril_plugin_dbus_signal_path_array(dbus,
@@ -213,17 +211,17 @@
ril_plugin_dbus_enabled);
}
if (mask & RIL_PLUGIN_SIGNAL_VOICE_PATH) {
- ril_plugin_dbus_signal_path(dbus,
+ ril_plugin_dbus_signal_string(dbus,
RIL_DBUS_SIGNAL_DEFAULT_VOICE_MODEM_CHANGED,
dbus->plugin->default_voice_path);
}
if (mask & RIL_PLUGIN_SIGNAL_DATA_PATH) {
- ril_plugin_dbus_signal_path(dbus,
+ ril_plugin_dbus_signal_string(dbus,
RIL_DBUS_SIGNAL_DEFAULT_DATA_MODEM_CHANGED,
dbus->plugin->default_data_path);
}
if (mask & RIL_PLUGIN_SIGNAL_MMS_PATH) {
- ril_plugin_dbus_signal_path(dbus,
+ ril_plugin_dbus_signal_string(dbus,
RIL_DBUS_SIGNAL_MMS_MODEM_CHANGED,
dbus->plugin->mms_path);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_radio.c
^
|
@@ -89,7 +89,8 @@
GASSERT(priv->retry_id);
priv->retry_id = 0;
ril_radio_submit_power_request(self, ril_radio_power_should_be_on(self));
- return FALSE;
+
+ return G_SOURCE_REMOVE;
}
static void ril_radio_cancel_retry(struct ril_radio *self)
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_sim.c
^
|
@@ -752,7 +752,8 @@
GASSERT(sd->query_passwd_state_cb);
sd->query_passwd_state_timeout_id = 0;
ril_sim_finish_passwd_state_query(sd, OFONO_SIM_PASSWORD_INVALID);
- return FALSE;
+
+ return G_SOURCE_REMOVE;
}
static void ril_sim_query_passwd_state(struct ofono_sim *sim,
@@ -795,7 +796,8 @@
sd->pin_cbd_list = g_list_remove(sd->pin_cbd_list, cbd);
cbd->cb(ril_error_failure(&error), cbd->data);
ril_sim_pin_cbd_free(cbd);
- return FALSE;
+
+ return G_SOURCE_REMOVE;
}
static void ril_sim_pin_change_state_status_cb(struct ril_sim_card *sc,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_sim_dbus.c
^
|
@@ -43,7 +43,6 @@
#define RIL_SIM_DBUS_INTERFACE_VERSION (1)
#define RIL_SIM_DBUS_DISPLAY_NAME_CHANGED_SIGNAL "DisplayNameChanged"
-#define RIL_SIM_DBUS_ENABLE_4G_CHANGED_SIGNAL "Enable4GChanged"
static DBusMessage *ril_sim_dbus_get_all(DBusConnection *conn,
DBusMessage *msg, void *data)
@@ -157,8 +156,6 @@
static const GDBusSignalTable ril_sim_dbus_signals[] = {
{ GDBUS_SIGNAL(RIL_SIM_DBUS_DISPLAY_NAME_CHANGED_SIGNAL,
GDBUS_ARGS({ "name", "s" })) },
- { GDBUS_SIGNAL(RIL_SIM_DBUS_ENABLE_4G_CHANGED_SIGNAL,
- GDBUS_ARGS({ "enabled", "b" })) },
{ }
};
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_sim_info.c
^
|
@@ -0,0 +1,433 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ril_sim_info.h"
+#include "ril_log.h"
+
+#include <ofono/sim.h>
+
+#include "ofono.h"
+#include "storage.h"
+
+#define RIL_SIM_INFO_STORE "cache"
+#define RIL_SIM_INFO_STORE_GROUP "sim"
+#define RIL_SIM_INFO_STORE_SPN "spn"
+
+/* ICCID -> IMSI map */
+#define RIL_SIM_ICCID_MAP "iccidmap"
+#define RIL_SIM_ICCID_MAP_IMSI "imsi"
+
+typedef GObjectClass RilSimInfoClass;
+typedef struct ril_sim_info RilSimInfo;
+
+struct ril_sim_info_watch {
+ void (*set_value)(struct ril_sim_info *self, const char *value);
+ void (*remove)(struct ofono_sim *sim, unsigned int id);
+ unsigned int id;
+};
+
+struct ril_sim_info_priv {
+ char *iccid;
+ char *imsi;
+ char *spn;
+ struct ofono_sim *sim;
+ struct ril_sim_info_watch state_watch;
+ struct ril_sim_info_watch iccid_watch;
+ struct ril_sim_info_watch imsi_watch;
+ struct ril_sim_info_watch spn_watch;
+ gboolean update_imsi_cache;
+ gboolean update_iccid_map;
+};
+
+enum ril_sim_info_signal {
+ SIGNAL_ICCID_CHANGED,
+ SIGNAL_IMSI_CHANGED,
+ SIGNAL_SPN_CHANGED,
+ SIGNAL_COUNT
+};
+
+#define SIGNAL_ICCID_CHANGED_NAME "ril-siminfo-state-changed"
+#define SIGNAL_IMSI_CHANGED_NAME "ril-siminfo-status-changed"
+#define SIGNAL_SPN_CHANGED_NAME "ril-siminfo-spn-changed"
+
+static guint ril_sim_info_signals[SIGNAL_COUNT] = { 0 };
+
+G_DEFINE_TYPE(RilSimInfo, ril_sim_info, G_TYPE_OBJECT)
+#define RIL_SIMINFO_TYPE (ril_sim_info_get_type())
+#define RIL_SIMINFO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
+ RIL_SIMINFO_TYPE, RilSimInfo))
+
+#define NEW_SIGNAL(klass,name) \
+ ril_sim_info_signals[SIGNAL_##name##_CHANGED] = \
+ g_signal_new(SIGNAL_##name##_CHANGED_NAME, \
+ G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_FIRST, \
+ 0, NULL, NULL, NULL, G_TYPE_NONE, 0)
+
+static void ril_sim_info_signal_emit(struct ril_sim_info *self,
+ enum ril_sim_info_signal id)
+{
+ g_signal_emit(self, ril_sim_info_signals[id], 0);
+}
+
+static void ril_sim_info_watch_remove(struct ril_sim_info *self,
+ struct ril_sim_info_watch *watch)
+{
+ if (watch->id) {
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (priv->sim) {
+ watch->remove(priv->sim, watch->id);
+ }
+
+ watch->id = 0;
+ }
+
+ if (watch->set_value) {
+ watch->set_value(self, NULL);
+ }
+}
+
+static void ril_sim_info_remove_spn_watch(struct ofono_sim *sim, unsigned int id)
+{
+ ofono_sim_remove_spn_watch(sim, &id);
+}
+
+static void ril_sim_info_update_imsi_cache(struct ril_sim_info *self)
+{
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (priv->update_imsi_cache && priv->imsi && priv->imsi[0] &&
+ priv->spn && priv->spn[0]) {
+ const char *store = RIL_SIM_INFO_STORE;
+ GKeyFile *cache = storage_open(priv->imsi, store);
+
+ DBG("Updating " STORAGEDIR "/%s/%s", priv->imsi, store);
+ g_key_file_set_string(cache, RIL_SIM_INFO_STORE_GROUP,
+ RIL_SIM_INFO_STORE_SPN, priv->spn);
+ storage_close(priv->imsi, store, cache, TRUE);
+ priv->update_imsi_cache = FALSE;
+ }
+}
+
+static void ril_sim_info_update_iccid_map(struct ril_sim_info *self)
+{
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (priv->update_iccid_map && priv->iccid && priv->iccid[0] &&
+ priv->imsi && priv->imsi[0]) {
+ const char *store = RIL_SIM_ICCID_MAP;
+ GKeyFile *map = storage_open(NULL, store);
+
+ DBG("Updating " STORAGEDIR "/%s", store);
+ g_key_file_set_string(map, RIL_SIM_ICCID_MAP_IMSI,
+ priv->iccid, priv->imsi);
+ storage_close(NULL, store, map, TRUE);
+ priv->update_iccid_map = FALSE;
+ }
+}
+
+static void ril_sim_info_set_imsi(struct ril_sim_info *self, const char *imsi)
+{
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (g_strcmp0(priv->imsi, imsi)) {
+ g_free(priv->imsi);
+ self->imsi = priv->imsi = g_strdup(imsi);
+ priv->update_iccid_map = TRUE;
+ ril_sim_info_update_iccid_map(self);
+ ril_sim_info_update_imsi_cache(self);
+ ril_sim_info_signal_emit(self, SIGNAL_IMSI_CHANGED);
+ }
+}
+
+static void ril_sim_info_set_spn(struct ril_sim_info *self, const char *spn)
+{
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (g_strcmp0(priv->spn, spn)) {
+ g_free(priv->spn);
+ self->spn = priv->spn = g_strdup(spn);
+ priv->update_imsi_cache = TRUE;
+ ril_sim_info_update_imsi_cache(self);
+ ril_sim_info_signal_emit(self, SIGNAL_SPN_CHANGED);
+ }
+}
+
+static void ril_sim_info_load_cache(struct ril_sim_info *self)
+{
+ struct ril_sim_info_priv *priv = self->priv;
+
+ if (priv->iccid && priv->iccid[0]) {
+ GKeyFile *map = storage_open(NULL, RIL_SIM_ICCID_MAP);
+ char *imsi = g_key_file_get_string(map, RIL_SIM_ICCID_MAP_IMSI,
+ priv->iccid, NULL);
+ g_key_file_free(map);
+
+ if (imsi && imsi[0] && g_strcmp0(priv->imsi, imsi)) {
+ if (priv->imsi && priv->imsi[0]) {
+ /* Need to update ICCID -> IMSI map */
+ DBG("IMSI changed %s -> %s", priv->imsi, imsi);
+ priv->update_imsi_cache = TRUE;
+ }
+ g_free(priv->imsi);
+ self->imsi = priv->imsi = imsi;
+ DBG("imsi[%s] = %s", priv->iccid, imsi);
+ ril_sim_info_update_iccid_map(self);
+ ril_sim_info_signal_emit(self, SIGNAL_IMSI_CHANGED);
+ } else if (imsi) {
+ g_free(imsi);
+ } else {
+ DBG("No imsi for iccid %s", priv->iccid);
+ }
+ }
+
+ if (priv->imsi && priv->imsi[0]) {
+ GKeyFile *cache = storage_open(priv->imsi, RIL_SIM_INFO_STORE);
+ char *spn = g_key_file_get_string(cache,
+ RIL_SIM_INFO_STORE_GROUP,
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_sim_info.h
^
|
@@ -0,0 +1,52 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef RIL_SIM_INFO_H
+#define RIL_SIM_INFO_H
+
+#include "ril_types.h"
+
+struct ril_sim_info {
+ GObject object;
+ struct ril_sim_info_priv *priv;
+ const char *iccid;
+ const char *imsi;
+ const char *spn;
+};
+
+struct ofono_sim;
+typedef void (*ril_sim_info_cb_t)(struct ril_sim_info *info, void *arg);
+
+struct ril_sim_info *ril_sim_info_new(struct ofono_sim *sim);
+struct ril_sim_info *ril_sim_info_ref(struct ril_sim_info *info);
+void ril_sim_info_unref(struct ril_sim_info *si);
+void ril_sim_info_set_ofono_sim(struct ril_sim_info *si, struct ofono_sim *sim);
+gulong ril_sim_info_add_iccid_changed_handler(struct ril_sim_info *si,
+ ril_sim_info_cb_t cb, void *arg);
+gulong ril_sim_info_add_imsi_changed_handler(struct ril_sim_info *si,
+ ril_sim_info_cb_t cb, void *arg);
+gulong ril_sim_info_add_spn_changed_handler(struct ril_sim_info *si,
+ ril_sim_info_cb_t cb, void *arg);
+void ril_sim_info_remove_handler(struct ril_sim_info *si, gulong id);
+
+#endif /* RIL_SIM_INFO_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_sim_info_dbus.c
^
|
@@ -0,0 +1,243 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ril_plugin.h"
+#include "ril_sim_info.h"
+#include "ril_log.h"
+
+#include <ofono/dbus.h>
+
+#include <gdbus.h>
+
+#include "ofono.h"
+#include "storage.h"
+
+enum sim_info_event_id {
+ SIM_INFO_EVENT_ICCID,
+ SIM_INFO_EVENT_IMSI,
+ SIM_INFO_EVENT_SPN,
+ SIM_INFO_EVENT_COUNT
+};
+
+struct ril_sim_info_dbus {
+ struct ril_modem *md;
+ struct ril_sim_info *info;
+ DBusConnection *conn;
+ char *path;
+ gulong handler_id[SIM_INFO_EVENT_COUNT];
+};
+
+#define RIL_SIM_INFO_DBUS_INTERFACE "org.nemomobile.ofono.SimInfo"
+#define RIL_SIM_INFO_DBUS_INTERFACE_VERSION (1)
+
+#define RIL_SIM_INFO_DBUS_ICCID_CHANGED_SIGNAL "CardIdentifierChanged"
+#define RIL_SIM_INFO_DBUS_IMSI_CHANGED_SIGNAL "SubscriberIdentityChanged"
+#define RIL_SIM_INFO_DBUS_SPN_CHANGED_SIGNAL "ServiceProviderNameChanged"
+
+static void ril_sim_info_dbus_append_string(DBusMessageIter *it, const char *s)
+{
+ if (!s) s = "";
+ dbus_message_iter_append_basic(it, DBUS_TYPE_STRING, &s);
+}
+
+static DBusMessage *ril_sim_info_dbus_reply_with_string(DBusMessage *msg,
+ const char *str)
+{
+ DBusMessage *reply = dbus_message_new_method_return(msg);
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append(reply, &iter);
+ ril_sim_info_dbus_append_string(&iter, str);
+ return reply;
+}
+
+static DBusMessage *ril_sim_info_dbus_get_all(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ril_sim_info_dbus *dbus = data;
+ struct ril_sim_info *info = dbus->info;
+ DBusMessage *reply = dbus_message_new_method_return(msg);
+ const dbus_int32_t version = RIL_SIM_INFO_DBUS_INTERFACE_VERSION;
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append(reply, &iter);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &version);
+ ril_sim_info_dbus_append_string(&iter, info->iccid);
+ ril_sim_info_dbus_append_string(&iter, info->imsi);
+ ril_sim_info_dbus_append_string(&iter, info->spn);
+ return reply;
+}
+
+static DBusMessage *ril_sim_info_dbus_get_version(DBusConnection *dc,
+ DBusMessage *msg, void *data)
+{
+ DBusMessage *reply = dbus_message_new_method_return(msg);
+ dbus_int32_t version = RIL_SIM_INFO_DBUS_INTERFACE_VERSION;
+ DBusMessageIter iter;
+
+ dbus_message_iter_init_append(reply, &iter);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &version);
+ return reply;
+}
+
+static DBusMessage *ril_sim_info_dbus_get_iccid(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ril_sim_info_dbus *dbus = data;
+ return ril_sim_info_dbus_reply_with_string(msg, dbus->info->iccid);
+}
+
+static DBusMessage *ril_sim_info_dbus_get_imsi(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ril_sim_info_dbus *dbus = data;
+ return ril_sim_info_dbus_reply_with_string(msg, dbus->info->imsi);
+}
+
+static DBusMessage *ril_sim_info_dbus_get_spn(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct ril_sim_info_dbus *dbus = data;
+ return ril_sim_info_dbus_reply_with_string(msg, dbus->info->spn);
+}
+
+static const GDBusMethodTable ril_sim_info_dbus_methods[] = {
+ { GDBUS_METHOD("GetAll",
+ NULL, GDBUS_ARGS({"version", "i" },
+ {"iccid", "s" },
+ {"imsi", "s" },
+ {"spn" , "s"}),
+ ril_sim_info_dbus_get_all) },
+ { GDBUS_METHOD("GetInterfaceVersion",
+ NULL, GDBUS_ARGS({ "version", "i" }),
+ ril_sim_info_dbus_get_version) },
+ { GDBUS_METHOD("GetCardIdentifier",
+ NULL, GDBUS_ARGS({ "iccid", "s" }),
+ ril_sim_info_dbus_get_iccid) },
+ { GDBUS_METHOD("GetSubscriberIdentity",
+ NULL, GDBUS_ARGS({ "imsi", "s" }),
+ ril_sim_info_dbus_get_imsi) },
+ { GDBUS_METHOD("GetServiceProviderName",
+ NULL, GDBUS_ARGS({ "spn", "s" }),
+ ril_sim_info_dbus_get_spn) },
+ { }
+};
+
+static const GDBusSignalTable ril_sim_info_dbus_signals[] = {
+ { GDBUS_SIGNAL(RIL_SIM_INFO_DBUS_ICCID_CHANGED_SIGNAL,
+ GDBUS_ARGS({ "iccid", "s" })) },
+ { GDBUS_SIGNAL(RIL_SIM_INFO_DBUS_IMSI_CHANGED_SIGNAL,
+ GDBUS_ARGS({ "imsi", "s" })) },
+ { GDBUS_SIGNAL(RIL_SIM_INFO_DBUS_SPN_CHANGED_SIGNAL,
+ GDBUS_ARGS({ "spn", "s" })) },
+ { }
+};
+
+static void ril_sim_info_dbus_emit(struct ril_sim_info_dbus *dbus,
+ const char *signal, const char *value)
+{
+ const char *arg = value;
+ if (!arg) arg = "";
+ g_dbus_emit_signal(dbus->conn, dbus->path, RIL_SIM_INFO_DBUS_INTERFACE,
+ signal, DBUS_TYPE_STRING, &arg, DBUS_TYPE_INVALID);
+}
+
+static void ril_sim_info_dbus_iccid_cb(struct ril_sim_info *info, void *arg)
+{
+ struct ril_sim_info_dbus *dbus = arg;
+ ril_sim_info_dbus_emit(dbus, RIL_SIM_INFO_DBUS_ICCID_CHANGED_SIGNAL,
+ info->iccid);
+}
+
+static void ril_sim_info_dbus_imsi_cb(struct ril_sim_info *info, void *arg)
+{
+ struct ril_sim_info_dbus *dbus = arg;
+ ril_sim_info_dbus_emit(dbus, RIL_SIM_INFO_DBUS_IMSI_CHANGED_SIGNAL,
+ info->imsi);
+}
+
+static void ril_sim_info_dbus_spn_cb(struct ril_sim_info *info, void *arg)
+{
+ struct ril_sim_info_dbus *dbus = arg;
+ ril_sim_info_dbus_emit(dbus, RIL_SIM_INFO_DBUS_SPN_CHANGED_SIGNAL,
+ info->spn);
+}
+
+struct ril_sim_info_dbus *ril_sim_info_dbus_new(struct ril_modem *md,
+ struct ril_sim_info *info)
+{
+ struct ril_sim_info_dbus *dbus = g_new0(struct ril_sim_info_dbus, 1);
+
+ DBG("%s", ril_modem_get_path(md));
+ dbus->md = md;
+ dbus->path = g_strdup(ril_modem_get_path(md));
+ dbus->info = ril_sim_info_ref(info);
+ dbus->conn = dbus_connection_ref(ofono_dbus_get_connection());
+
+ /* Register D-Bus interface */
+ if (g_dbus_register_interface(dbus->conn, dbus->path,
+ RIL_SIM_INFO_DBUS_INTERFACE, ril_sim_info_dbus_methods,
+ ril_sim_info_dbus_signals, NULL, dbus, NULL)) {
+ ofono_modem_add_interface(md->ofono,
+ RIL_SIM_INFO_DBUS_INTERFACE);
+
+ dbus->handler_id[SIM_INFO_EVENT_ICCID] =
+ ril_sim_info_add_iccid_changed_handler(info,
+ ril_sim_info_dbus_iccid_cb, dbus);
+ dbus->handler_id[SIM_INFO_EVENT_IMSI] =
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/ril/ril_types.h
^
|
@@ -43,6 +43,7 @@
struct ril_radio;
struct ril_network;
struct ril_sim_card;
+struct ril_sim_info;
struct ril_plugin_dbus;
#endif /* RIL_TYPES_H */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/drivers/rilmodem/network-registration.c
^
|
@@ -58,14 +58,6 @@
int corestatus; /* Registration status previously reported to core */
};
-/* 27.007 Section 7.3 <stat> */
-enum operator_status {
- OPERATOR_STATUS_UNKNOWN = 0,
- OPERATOR_STATUS_AVAILABLE = 1,
- OPERATOR_STATUS_CURRENT = 2,
- OPERATOR_STATUS_FORBIDDEN = 3,
-};
-
struct ofono_netreg *current_netreg;
static void extract_mcc_mnc(const char *str, char *mcc, char *mnc)
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/include/sim.h
^
|
@@ -215,6 +215,22 @@
ofono_bool_t ofono_sim_remove_spn_watch(struct ofono_sim *sim, unsigned int *id);
+typedef void (*ofono_sim_iccid_event_cb_t)(const char *iccid, void *data);
+
+unsigned int ofono_sim_add_iccid_watch(struct ofono_sim *sim,
+ ofono_sim_iccid_event_cb_t cb, void *data,
+ ofono_destroy_func destroy);
+
+void ofono_sim_remove_iccid_watch(struct ofono_sim *sim, unsigned int id);
+
+typedef void (*ofono_sim_imsi_event_cb_t)(const char *imsi, void *data);
+
+unsigned int ofono_sim_add_imsi_watch(struct ofono_sim *sim,
+ ofono_sim_imsi_event_cb_t cb, void *data,
+ ofono_destroy_func destroy);
+
+void ofono_sim_remove_imsi_watch(struct ofono_sim *sim, unsigned int id);
+
void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted);
struct ofono_sim_context *ofono_sim_context_create(struct ofono_sim *sim);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/src/gprs.c
^
|
@@ -57,8 +57,6 @@
#define MAX_MESSAGE_CENTER_LENGTH 255
#define MAX_CONTEXTS 256
#define SUSPEND_TIMEOUT 8
-#define MAX_MMS_MTU 1280
-#define MAX_GPRS_MTU 1280
struct ofono_gprs {
GSList *contexts;
@@ -790,31 +788,6 @@
g_free(interface);
}
-static void pri_limit_mtu(const char *interface, int max_mtu)
-{
- struct ifreq ifr;
- int sk;
-
- if (interface == NULL)
- return;
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return;
-
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, interface, IFNAMSIZ);
-
- if (ioctl(sk, SIOCGIFMTU, &ifr) < 0 || ifr.ifr_mtu > max_mtu) {
- ifr.ifr_mtu = max_mtu;
-
- if (ioctl(sk, SIOCSIFMTU, &ifr) < 0)
- ofono_error("Failed to set MTU");
- }
-
- close(sk);
-}
-
static void pri_update_mms_context_settings(struct pri_context *ctx)
{
struct ofono_gprs_context *gc = ctx->context_driver;
@@ -832,8 +805,6 @@
if (ctx->proxy_host)
pri_setproxy(settings->interface, ctx->proxy_host);
-
- pri_limit_mtu(settings->interface, MAX_MMS_MTU);
}
static gboolean pri_str_changed(const char *val, const char *newval)
@@ -1130,9 +1101,6 @@
pri_context_signal_settings(ctx, gc->settings->ipv4 != NULL,
gc->settings->ipv6 != NULL);
-
- if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_INTERNET)
- pri_limit_mtu(gc->settings->interface, MAX_GPRS_MTU);
}
value = ctx->active;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/src/sim.c
^
|
@@ -53,6 +53,7 @@
/* Contents of the SIM file system, in rough initialization order */
char *iccid;
+ struct ofono_watchlist *iccid_watches;
char **language_prefs;
unsigned char *efli;
@@ -80,6 +81,7 @@
char *imsi;
char mcc[OFONO_MAX_MCC_LENGTH + 1];
char mnc[OFONO_MAX_MNC_LENGTH + 1];
+ struct ofono_watchlist *imsi_watches;
GSList *own_numbers;
GSList *new_numbers;
@@ -340,6 +342,94 @@
}
}
+static unsigned int add_watch_item(struct ofono_watchlist *watchlist,
+ void *notify, void *notify_data,
+ ofono_destroy_func destroy)
+{
+ struct ofono_watchlist_item *item;
+
+ item = g_new0(struct ofono_watchlist_item, 1);
+ item->notify = notify;
+ item->notify_data = notify_data;
+ item->destroy = destroy;
+
+ return __ofono_watchlist_add_item(watchlist, item);
+}
+
+static void iccid_watch_cb(gpointer data, gpointer user_data)
+{
+ struct ofono_watchlist_item *item = data;
+ struct ofono_sim *sim = user_data;
+ ofono_sim_iccid_event_cb_t cb = item->notify;
+
+ cb(sim->iccid, item->notify_data);
+}
+
+static inline void iccid_watches_notify(struct ofono_sim *sim)
+{
+ g_slist_foreach(sim->iccid_watches->items, iccid_watch_cb, sim);
+}
+
+unsigned int ofono_sim_add_iccid_watch(struct ofono_sim *sim,
+ ofono_sim_iccid_event_cb_t cb, void *data,
+ ofono_destroy_func destroy)
+{
+ unsigned int watch_id;
+
+ DBG("%p", sim);
+ if (sim == NULL)
+ return 0;
+
+ watch_id = add_watch_item(sim->iccid_watches, cb, data, destroy);
+
+ if (sim->iccid)
+ cb(sim->iccid, data);
+
+ return watch_id;
+}
+
+void ofono_sim_remove_iccid_watch(struct ofono_sim *sim, unsigned int id)
+{
+ __ofono_watchlist_remove_item(sim->iccid_watches, id);
+}
+
+static void imsi_watch_cb(gpointer data, gpointer user_data)
+{
+ struct ofono_watchlist_item *item = data;
+ struct ofono_sim *sim = user_data;
+ ofono_sim_imsi_event_cb_t cb = item->notify;
+
+ cb(sim->imsi, item->notify_data);
+}
+
+static inline void imsi_watches_notify(struct ofono_sim *sim)
+{
+ g_slist_foreach(sim->imsi_watches->items, imsi_watch_cb, sim);
+}
+
+unsigned int ofono_sim_add_imsi_watch(struct ofono_sim *sim,
+ ofono_sim_imsi_event_cb_t cb, void *data,
+ ofono_destroy_func destroy)
+{
+ unsigned int watch_id;
+
+ DBG("%p", sim);
+ if (sim == NULL)
+ return 0;
+
+ watch_id = add_watch_item(sim->imsi_watches, cb, data, destroy);
+
+ if (sim->imsi)
+ cb(sim->imsi, data);
+
+ return watch_id;
+}
+
+void ofono_sim_remove_imsi_watch(struct ofono_sim *sim, unsigned int id)
+{
+ __ofono_watchlist_remove_item(sim->imsi_watches, id);
+}
+
static DBusMessage *sim_get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -1487,6 +1577,7 @@
DBUS_TYPE_STRING, &str);
}
+ imsi_watches_notify(sim);
sim_set_ready(sim);
}
@@ -1860,6 +1951,7 @@
{
sim->context = ofono_sim_context_create(sim);
sim->spn_watches = __ofono_watchlist_new(g_free);
+ sim->imsi_watches = __ofono_watchlist_new(g_free);
ofono_sim_read(sim->context, SIM_EFPHASE_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
@@ -2089,6 +2181,7 @@
"CardIdentifier",
DBUS_TYPE_STRING,
&sim->iccid);
+ iccid_watches_notify(sim);
}
static void sim_iccid_changed(int id, void *userdata)
@@ -2471,6 +2564,11 @@
sim_spn_close(sim);
+ if (sim->imsi_watches) {
+ __ofono_watchlist_free(sim->imsi_watches);
+ sim->imsi_watches = NULL;
+ }
+
if (sim->context) {
ofono_sim_context_free(sim->context);
sim->context = NULL;
@@ -2898,6 +2996,9 @@
__ofono_modem_remove_atom_watch(modem, sim->hfp_watch);
+ __ofono_watchlist_free(sim->iccid_watches);
+ sim->iccid_watches = NULL;
+
__ofono_watchlist_free(sim->state_watches);
sim->state_watches = NULL;
@@ -3030,6 +3131,7 @@
ofono_modem_add_interface(modem, OFONO_SIM_MANAGER_INTERFACE);
sim->state_watches = __ofono_watchlist_new(g_free);
+ sim->iccid_watches = __ofono_watchlist_new(g_free);
sim->simfs = sim_fs_new(sim, sim->driver);
__ofono_atom_register(sim->atom, sim_unregister);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.17+git7.tar.xz/ofono/src/watch.c
^
|
@@ -41,6 +41,9 @@
{
item->id = ++watchlist->next_id;
+ if (item->id == 0)
+ item->id = ++watchlist->next_id;
+
watchlist->items = g_slist_prepend(watchlist->items, item);
return item->id;
|