+void modem_properties_changed_cb(void *data, DBusMessage *msg)
+{
+ DBusMessageIter iter, values, entry;
+ const char *property, *v;
+ char *dump;
+ int n;
+ json_t *object;
+
+ dbus_message_iter_init(msg, &iter);
+ dbus_message_iter_get_basic(&iter, &property);
+
+ if (!strcasecmp(property, "Interfaces")) {
+ dbus_message_iter_next(&iter);
+ dbus_message_iter_recurse(&iter, &values);
+
+ while (dbus_message_iter_get_arg_type(&values) == DBUS_TYPE_ARRAY) {
+ DBusMessageIter variant;
+ dbus_message_iter_recurse(&iter, &entry);
+ dbus_message_iter_recurse(&entry, &variant);
+ if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_INVALID) {
+ dbus_message_iter_get_basic(&variant, &v);
+ if (!strcasecmp(v, "org.ofono.VoiceCallManager")) {
+ object = json_object();
+ json_object_set(object, "ModemAdded", json_string(dbus_message_get_path(msg)));
+ dump = json_dumps(object, 0);
+ libwebsockets_broadcast(&protocols[PROTOCOL_DIALER], dump, strlen(dump));
+ free(dump);
+ }
+ } else {
+ // If the modem has removed all interfaces then its no longer
+ // available for making calls
+ object = json_object();
+ json_object_set(object, "ModemRemoved", json_string(dbus_message_get_path(msg)));
+ dump = json_dumps(object, 0);
+ libwebsockets_broadcast(&protocols[PROTOCOL_DIALER], dump, strlen(dump));
+ free(dump);
+ }
+ dbus_message_iter_next(&values);
+ }
+ }
+}
+