summaryrefslogtreecommitdiffstats
path: root/src/call-barring.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/call-barring.c')
-rw-r--r--src/call-barring.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/call-barring.c b/src/call-barring.c
index 495b34b1..9044191a 100644
--- a/src/call-barring.c
+++ b/src/call-barring.c
@@ -126,14 +126,17 @@ static inline void emit_barring_changed(struct ofono_modem *modem, int start,
&value);
}
-static void update_barrings(struct ofono_modem *modem)
+static void update_barrings(struct ofono_modem *modem, int mask)
{
struct call_barring_data *cb = modem->call_barring;
int cls;
int i;
/* We're only interested in emitting signals for Voice, Fax & Data */
- for (cls = 1; cls <= BEARER_CLASS_FAX; cls = cls << 1) {
+ for (cls = 1; cls <= BEARER_CLASS_PAD; cls = cls << 1) {
+ if ((cls & mask) == 0)
+ continue;
+
emit_barring_changed(modem, cb->query_start, CB_OUTGOING_END,
"Outgoing", cls);
emit_barring_changed(modem, CB_INCOMING_START, cb->query_end,
@@ -304,7 +307,7 @@ static void cb_ss_query_next_lock_callback(const struct ofono_error *error,
}
generate_ss_query_reply(modem);
- update_barrings(modem);
+ update_barrings(modem, BEARER_CLASS_VOICE);
}
static gboolean cb_ss_query_next_lock(gpointer user)
@@ -544,7 +547,7 @@ static inline void cb_append_property(struct call_barring_data *cb,
&value);
}
-static void cb_get_properties_reply(struct ofono_modem *modem)
+static void cb_get_properties_reply(struct ofono_modem *modem, int mask)
{
struct call_barring_data *cb = modem->call_barring;
DBusMessage *reply;
@@ -563,7 +566,10 @@ static void cb_get_properties_reply(struct ofono_modem *modem)
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
PROPERTIES_ARRAY_SIGNATURE, &dict);
- for (j = 1; j <= BEARER_CLASS_FAX; j = j << 1) {
+ for (j = 1; j <= BEARER_CLASS_PAD; j = j << 1) {
+ if ((j & mask) == 0)
+ continue;
+
cb_append_property(cb, &dict, CB_OUTGOING_START,
CB_OUTGOING_END, j, "Outgoing");
cb_append_property(cb, &dict, CB_INCOMING_START,
@@ -594,8 +600,8 @@ static void get_query_lock_callback(const struct ofono_error *error,
return;
}
- cb_get_properties_reply(modem);
- update_barrings(modem);
+ cb_get_properties_reply(modem, BEARER_CLASS_VOICE);
+ update_barrings(modem, BEARER_CLASS_VOICE);
}
static gboolean get_query_next_lock(gpointer user)
@@ -624,7 +630,7 @@ static DBusMessage *cb_get_properties(DBusConnection *conn, DBusMessage *msg,
cb->pending = dbus_message_ref(msg);
if (cb->flags & CALL_BARRING_FLAG_CACHED)
- cb_get_properties_reply(modem);
+ cb_get_properties_reply(modem, BEARER_CLASS_VOICE);
else {
cb->query_next = CB_ALL_START;
get_query_next_lock(modem);
@@ -660,7 +666,7 @@ static void set_query_lock_callback(const struct ofono_error *error,
dbus_gsm_pending_reply(&cb->pending,
dbus_message_new_method_return(cb->pending));
- update_barrings(modem);
+ update_barrings(modem, BEARER_CLASS_VOICE);
}
static gboolean set_query_next_lock(gpointer user)
@@ -699,7 +705,7 @@ static void set_lock_callback(const struct ofono_error *error, void *data)
}
static gboolean cb_lock_property_lookup(const char *property, const char *value,
- int *out_which, int *out_cls,
+ int mask, int *out_which, int *out_cls,
int *out_mode)
{
int i, j;
@@ -707,7 +713,10 @@ static gboolean cb_lock_property_lookup(const char *property, const char *value,
size_t len;
int start, end;
- for (i = 1; i <= BEARER_CLASS_FAX; i = i << 1) {
+ for (i = 1; i <= BEARER_CLASS_PAD; i = i << 1) {
+ if ((i & mask) == 0)
+ continue;
+
prefix = bearer_class_to_string(i);
len = strlen(prefix);
@@ -715,7 +724,7 @@ static gboolean cb_lock_property_lookup(const char *property, const char *value,
break;
}
- if (i > BEARER_CLASS_FAX)
+ if (i > BEARER_CLASS_PAD)
return FALSE;
property += len;
@@ -795,7 +804,8 @@ static DBusMessage *cb_set_property(DBusConnection *conn, DBusMessage *msg,
dbus_message_iter_get_basic(&var, &value);
- if (!cb_lock_property_lookup(name, value, &lock, &cls, &mode))
+ if (!cb_lock_property_lookup(name, value, BEARER_CLASS_VOICE,
+ &lock, &cls, &mode))
return dbus_gsm_invalid_format(msg);
if (dbus_message_iter_next(&iter)) {