static gboolean setup_isi_serial(struct modem_info* modem) { struct serial_device_info* info; const char *value; info = modem->serial; if (g_strcmp0(udev_device_get_subsystem(info->dev), "net") != 0) return FALSE; value = udev_device_get_sysattr_value(info->dev, "type"); if (g_strcmp0(value, "820") != 0) return FALSE; /* OK, we want this device to be a modem */ value = udev_device_get_sysname(info->dev); if (value) ofono_modem_set_string(modem->modem, "Interface", value); value = udev_device_get_property_value(info->dev, "OFONO_ISI_ADDRESS"); if (value) ofono_modem_set_integer(modem->modem, "Address", atoi(value)); ofono_modem_set_string(modem->modem, "Device", info->devnode); return TRUE; }
static gboolean setup_isi(struct modem_info *modem) { const char *node = NULL; int addr = 0; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->sysattr); if (g_strcmp0(info->sysattr, "820") == 0) { if (g_strcmp0(info->interface, "2/254/0") == 0) addr = 16; node = info->devnode; } } if (node == NULL) return FALSE; DBG("interface=%s address=%d", node, addr); ofono_modem_set_string(modem->modem, "Interface", node); ofono_modem_set_integer(modem->modem, "Address", addr); return TRUE; }
static struct ofono_modem *create_modem(GKeyFile *keyfile, const char *group) { const char *driver = "phonesim"; struct ofono_modem *modem; char *value; DBG("group %s", group); value = g_key_file_get_string(keyfile, group, "Modem", NULL); if (value && g_str_equal(value, "hfp")) driver = "localhfp"; g_free(value); modem = ofono_modem_create(group, driver); if (modem == NULL) return NULL; value = g_key_file_get_string(keyfile, group, "Address", NULL); if (value == NULL) goto error; ofono_modem_set_string(modem, "Address", value); g_free(value); value = g_key_file_get_string(keyfile, group, "Port", NULL); if (value == NULL) goto error; ofono_modem_set_integer(modem, "Port", atoi(value)); g_free(value); value = g_key_file_get_string(keyfile, group, "Modem", NULL); if (value) { ofono_modem_set_string(modem, "Modem", value); g_free(value); } value = g_key_file_get_string(keyfile, group, "Multiplexer", NULL); if (value) { ofono_modem_set_string(modem, "Multiplexer", value); g_free(value); } DBG("%p", modem); return modem; error: ofono_error("Missing address or port setting for %s", group); ofono_modem_remove(modem); return NULL; }
static DBusMessage *control_add(DBusConnection *conn, DBusMessage *msg, void *data) { const char *driver = "phonesim"; struct ofono_modem *modem; DBusMessageIter iter; char *name; char *address; char *port; if (!dbus_message_iter_init(msg, &iter)) return __ofono_error_invalid_args(msg); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &address); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &port); modem = ofono_modem_create(name, driver); if (modem == NULL) return NULL; ofono_modem_set_string(modem, "Address", address); ofono_modem_set_integer(modem, "Port", atoi(port)); if (ofono_modem_register(modem) != 0) { ofono_modem_remove(modem); return __ofono_error_invalid_args(msg); } modem_list = g_slist_prepend(modem_list, modem); return dbus_message_new_method_return(msg); }
static gboolean handle_command_poll_interval(const struct stk_command *cmd, struct stk_response *rsp, struct ofono_stk *stk) { struct ofono_modem *modem = __ofono_atom_get_modem(stk->atom); int seconds; switch (cmd->poll_interval.duration.unit) { case STK_DURATION_TYPE_MINUTES: seconds = cmd->poll_interval.duration.interval * 60; break; case STK_DURATION_TYPE_SECONDS: seconds = cmd->poll_interval.duration.interval; break; case STK_DURATION_TYPE_SECOND_TENTHS: seconds = (4 + cmd->poll_interval.duration.interval) / 10; if (seconds < 1) seconds = 1; break; default: rsp->result.type = STK_RESULT_TYPE_DATA_NOT_UNDERSTOOD; return TRUE; } ofono_modem_set_integer(modem, "status-poll-interval", seconds); if (seconds > 255) { rsp->poll_interval.max_interval.unit = STK_DURATION_TYPE_MINUTES; rsp->poll_interval.max_interval.interval = seconds / 60; } else { rsp->poll_interval.max_interval.unit = STK_DURATION_TYPE_SECONDS; rsp->poll_interval.max_interval.interval = seconds; } return TRUE; }