Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jb50608-ondemand' into 'master'
Disable cell info updates when no one listens for them

See merge request mer-core/ofono!274
  • Loading branch information
monich committed Jun 10, 2021
2 parents cefc03e + 3d14784 commit beb997d
Show file tree
Hide file tree
Showing 8 changed files with 510 additions and 21 deletions.
4 changes: 3 additions & 1 deletion ofono/Makefile.am
Expand Up @@ -126,7 +126,8 @@ builtin_sources += plugins/sailfish_manager/sailfish_cell_info.c \
plugins/sailfish_manager/sailfish_manager.c \
plugins/sailfish_manager/sailfish_manager_dbus.c \
plugins/sailfish_manager/sailfish_sim_info.c \
plugins/sailfish_manager/sailfish_sim_info_dbus.c
plugins/sailfish_manager/sailfish_sim_info_dbus.c \
plugins/sailfish_manager/sailfish_dbus_clients.c
endif


Expand Down Expand Up @@ -979,6 +980,7 @@ unit_tests += unit/test-sailfish_cell_info
unit_test_sailfish_cell_info_dbus_SOURCES = unit/test-dbus.c \
unit/test-sailfish_cell_info_dbus.c \
unit/fake_sailfish_cell_info.c \
unit/fake_sailfish_dbus_clients.c \
plugins/sailfish_manager/sailfish_cell_info.c \
plugins/sailfish_manager/sailfish_cell_info_dbus.c \
gdbus/object.c \
Expand Down
35 changes: 30 additions & 5 deletions ofono/drivers/ril/ril_cell_info.c
Expand Up @@ -47,6 +47,7 @@ struct ril_cell_info {
gulong event_id;
guint query_id;
guint set_rate_id;
gboolean enabled;
};

enum ril_cell_info_signal {
Expand Down Expand Up @@ -331,7 +332,8 @@ static void ril_cell_info_list_cb(GRilIoChannel *io, int status,
DBG_(self, "");
GASSERT(self->query_id);
self->query_id = 0;
ril_cell_info_update_cells(self, (status == RIL_E_SUCCESS) ?
ril_cell_info_update_cells(self,
(status == RIL_E_SUCCESS && self->enabled) ?
ril_cell_info_parse_list(io->ril_version, data, len) : NULL);
}

Expand All @@ -348,12 +350,14 @@ static void ril_cell_info_set_rate_cb(GRilIoChannel *io, int status,
static gboolean ril_cell_info_retry(GRilIoRequest* request, int ril_status,
const void* response_data, guint response_len, void* user_data)
{
struct ril_cell_info *self = RIL_CELL_INFO(user_data);

switch (ril_status) {
case RIL_E_SUCCESS:
case RIL_E_RADIO_NOT_AVAILABLE:
return FALSE;
default:
return TRUE;
return self->enabled;
}
}

Expand All @@ -373,7 +377,8 @@ static void ril_cell_info_query(struct ril_cell_info *self)
static void ril_cell_info_set_rate(struct ril_cell_info *self)
{
GRilIoRequest *req = grilio_request_array_int32_new(1,
(self->update_rate_ms >= 0) ? self->update_rate_ms : INT_MAX);
(self->update_rate_ms >= 0 && self->enabled) ?
self->update_rate_ms : INT_MAX);

grilio_request_set_retry(req, RIL_RETRY_MS, MAX_RETRIES);
grilio_request_set_retry_func(req, ril_cell_info_retry);
Expand All @@ -387,7 +392,8 @@ static void ril_cell_info_set_rate(struct ril_cell_info *self)
static void ril_cell_info_refresh(struct ril_cell_info *self)
{
/* RIL_REQUEST_GET_CELL_INFO_LIST fails without SIM card */
if (self->radio->state == RADIO_STATE_ON && self->sim_card_ready) {
if (self->enabled && self->radio->state == RADIO_STATE_ON &&
self->sim_card_ready) {
ril_cell_info_query(self);
} else {
ril_cell_info_update_cells(self, NULL);
Expand Down Expand Up @@ -482,6 +488,21 @@ static void ril_cell_info_set_update_interval_proc
if (self->update_rate_ms != ms) {
self->update_rate_ms = ms;
DBG_(self, "%d ms", ms);
if (self->enabled && self->sim_card_ready) {
ril_cell_info_set_rate(self);
}
}
}

void ril_cell_info_set_enabled_proc(struct sailfish_cell_info *info,
gboolean enabled)
{
struct ril_cell_info *self = ril_cell_info_cast(info);

if (self->enabled != enabled) {
self->enabled = enabled;
DBG_(self, "%d", enabled);
ril_cell_info_refresh(self);
if (self->sim_card_ready) {
ril_cell_info_set_rate(self);
}
Expand All @@ -497,7 +518,8 @@ struct sailfish_cell_info *ril_cell_info_new(GRilIoChannel *io,
ril_cell_info_unref_proc,
ril_cell_info_add_cells_changed_handler_proc,
ril_cell_info_remove_handler_proc,
ril_cell_info_set_update_interval_proc
ril_cell_info_set_update_interval_proc,
ril_cell_info_set_enabled_proc
};

struct ril_cell_info *self = g_object_new(RIL_CELL_INFO_TYPE, 0);
Expand All @@ -519,6 +541,9 @@ struct sailfish_cell_info *ril_cell_info_new(GRilIoChannel *io,
ril_cell_info_sim_status_cb, self);
self->sim_card_ready = ril_sim_card_ready(sim_card);
ril_cell_info_refresh(self);

/* Disable updates by default */
self->enabled = FALSE;
if (self->sim_card_ready) {
ril_cell_info_set_rate(self);
}
Expand Down
8 changes: 8 additions & 0 deletions ofono/plugins/sailfish_manager/sailfish_cell_info.c
Expand Up @@ -128,6 +128,14 @@ void sailfish_cell_info_set_update_interval(struct sailfish_cell_info *info,
}
}

void sailfish_cell_info_set_enabled(struct sailfish_cell_info *info,
gboolean enabled)
{
if (info && info->proc->set_enabled) {
info->proc->set_enabled(info, enabled);
}
}

/*
* Local Variables:
* mode: C
Expand Down
3 changes: 3 additions & 0 deletions ofono/plugins/sailfish_manager/sailfish_cell_info.h
Expand Up @@ -89,6 +89,7 @@ struct sailfish_cell_info_proc {
sailfish_cell_info_cb_t cb, void *arg);
void (*remove_handler)(struct sailfish_cell_info *info, gulong id);
void (*set_update_interval)(struct sailfish_cell_info *info, int ms);
void (*set_enabled)(struct sailfish_cell_info *info, gboolean enabled);
};

/* Utilities */
Expand All @@ -107,6 +108,8 @@ void sailfish_cell_info_remove_handler(struct sailfish_cell_info *info,
gulong id);
void sailfish_cell_info_set_update_interval(struct sailfish_cell_info *info,
int ms);
void sailfish_cell_info_set_enabled(struct sailfish_cell_info *info,
gboolean enabled);

#endif /* SAILFISH_CELINFO_H */

Expand Down
76 changes: 61 additions & 15 deletions ofono/plugins/sailfish_manager/sailfish_cell_info_dbus.c
Expand Up @@ -15,7 +15,9 @@

#include "sailfish_cell_info_dbus.h"
#include "sailfish_cell_info.h"
#include "sailfish_dbus_clients.h"

#include <ofono.h>
#include <ofono/modem.h>
#include <ofono/dbus.h>
#include <ofono/log.h>
Expand All @@ -35,11 +37,13 @@ struct sailfish_cell_info_dbus {
gulong handler_id;
guint next_cell_id;
GSList *entries;
struct sailfish_dbus_clients *clients;
};

#define CELL_INFO_DBUS_INTERFACE "org.nemomobile.ofono.CellInfo"
#define CELL_INFO_DBUS_CELLS_ADDED_SIGNAL "CellsAdded"
#define CELL_INFO_DBUS_CELLS_REMOVED_SIGNAL "CellsRemoved"
#define CELL_INFO_DBUS_UNSUBSCRIBED_SIGNAL "Unsubscribed"

#define CELL_DBUS_INTERFACE_VERSION (1)
#define CELL_DBUS_INTERFACE "org.nemomobile.ofono.Cell"
Expand Down Expand Up @@ -336,7 +340,7 @@ static void sailfish_cell_info_dbus_emit_path_list
}
dbus_message_iter_close_container(&it, &array);

g_dbus_send_message(dbus->conn, signal);
sailfish_dbus_clients_send(dbus->clients, signal);
}

static int sailfish_cell_info_dbus_compare(const struct sailfish_cell *c1,
Expand Down Expand Up @@ -386,9 +390,10 @@ static void sailfish_cell_info_dbus_property_changed

for (i = 0; i < n && mask; i++) {
if (mask & prop[i].flag) {
ofono_dbus_signal_property_changed(dbus->conn,
entry->path, CELL_DBUS_INTERFACE,
prop[i].name, DBUS_TYPE_INT32,
sailfish_dbus_clients_signal_property_changed(
dbus->clients, entry->path,
CELL_DBUS_INTERFACE, prop[i].name,
DBUS_TYPE_INT32,
G_STRUCT_MEMBER_P(&cell->info, prop[i].off));
mask &= ~prop[i].flag;
}
Expand Down Expand Up @@ -496,25 +501,55 @@ static DBusMessage *sailfish_cell_info_dbus_get_cells(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct sailfish_cell_info_dbus *dbus = data;
DBusMessage *reply = dbus_message_new_method_return(msg);
DBusMessageIter it, array;
GSList *l;
struct sailfish_dbus_client *client;

dbus_message_iter_init_append(reply, &it);
dbus_message_iter_open_container(&it, DBUS_TYPE_ARRAY, "o", &array);
for (l = dbus->entries; l; l = l->next) {
const struct sailfish_cell_entry *entry = l->data;
dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH,
&entry->path);
client = sailfish_dbus_clients_new_client(dbus->clients, msg);
if (client) {
DBusMessage *reply = dbus_message_new_method_return(msg);
DBusMessageIter it, array;
GSList *l;

sailfish_cell_info_set_enabled(dbus->info, TRUE);
dbus_message_iter_init_append(reply, &it);
dbus_message_iter_open_container(&it, DBUS_TYPE_ARRAY,
"o", &array);
for (l = dbus->entries; l; l = l->next) {
const struct sailfish_cell_entry *entry = l->data;
dbus_message_iter_append_basic(&array,
DBUS_TYPE_OBJECT_PATH, &entry->path);
}
dbus_message_iter_close_container(&it, &array);
return reply;
}
dbus_message_iter_close_container(&it, &array);
return reply;
return __ofono_error_access_denied(msg);
}

static DBusMessage *sailfish_cell_info_dbus_unsubscribe(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct sailfish_cell_info_dbus *dbus = data;
struct sailfish_dbus_client *client;

DBG("");
client = sailfish_dbus_clients_lookup_client(dbus->clients, msg);
if (client) {
DBusMessage *signal = dbus_message_new_signal(
dbus_message_get_path(msg),
CELL_INFO_DBUS_INTERFACE,
CELL_INFO_DBUS_UNSUBSCRIBED_SIGNAL);
sailfish_dbus_clients_send_to(client, signal);
sailfish_dbus_clients_remove_client(client);
return dbus_message_new_method_return(msg);
}
return __ofono_error_access_denied(msg);
}

static const GDBusMethodTable sailfish_cell_info_dbus_methods[] = {
{ GDBUS_METHOD("GetCells", NULL,
GDBUS_ARGS({ "paths", "ao" }),
sailfish_cell_info_dbus_get_cells) },
{ GDBUS_METHOD("Unsubscribe", NULL, NULL,
sailfish_cell_info_dbus_unsubscribe) },
{ }
};

Expand All @@ -526,6 +561,12 @@ static const GDBusSignalTable sailfish_cell_info_dbus_signals[] = {
{ }
};

static void sailfish_cell_info_dbus_disable_cb(void *user_data)
{
struct sailfish_cell_info_dbus *dbus = user_data;
sailfish_cell_info_set_enabled(dbus->info, FALSE);
}

struct sailfish_cell_info_dbus *sailfish_cell_info_dbus_new
(struct ofono_modem *modem, struct sailfish_cell_info *info)
{
Expand All @@ -550,6 +591,10 @@ struct sailfish_cell_info_dbus *sailfish_cell_info_dbus_new
ofono_modem_add_interface(modem,
CELL_INFO_DBUS_INTERFACE);
sailfish_cell_info_dbus_update_entries(dbus, FALSE);
dbus->clients =
sailfish_dbus_clients_new(dbus->conn,
sailfish_cell_info_dbus_disable_cb,
dbus);
return dbus;
} else {
ofono_error("CellInfo D-Bus register failed");
Expand All @@ -565,6 +610,7 @@ void sailfish_cell_info_dbus_free(struct sailfish_cell_info_dbus *dbus)
GSList *l;

DBG("%s", dbus->path);
sailfish_dbus_clients_free(dbus->clients);
g_dbus_unregister_interface(dbus->conn, dbus->path,
CELL_INFO_DBUS_INTERFACE);

Expand Down

0 comments on commit beb997d

Please sign in to comment.