diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-08-30 09:54:27 -0300 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-09-01 17:23:27 -0300 |
commit | 676f5e7dea3c6c160ffdf08d42bf83e72a5a6c3f (patch) | |
tree | 1eafa357750c5c25070d76b66b09cad19a50fd2c /src/adapter.c | |
parent | 75c562d773e5fe37f4257631318d7f918edc5b53 (diff) |
Adapter initialization cleanup
Diffstat (limited to 'src/adapter.c')
-rw-r--r-- | src/adapter.c | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/src/adapter.c b/src/adapter.c index a16d1a4b..786c4953 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -436,8 +436,8 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, return no_such_adapter(msg); if (!adapter->up && - (hcid.offmode == HCID_OFFMODE_NOSCAN || - (hcid.offmode == HCID_OFFMODE_DEVDOWN && + (main_opts.offmode == HCID_OFFMODE_NOSCAN || + (main_opts.offmode == HCID_OFFMODE_DEVDOWN && scan_enable != SCAN_DISABLED))) { /* Start HCI device */ if (ioctl(dd, HCIDEVUP, adapter->dev_id) == 0) @@ -454,7 +454,7 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, } if (adapter->up && scan_enable == SCAN_DISABLED && - hcid.offmode == HCID_OFFMODE_DEVDOWN) { + main_opts.offmode == HCID_OFFMODE_DEVDOWN) { if (ioctl(dd, HCIDEVDOWN, adapter->dev_id) < 0) { hci_close_dev(dd); return failed_strerror(msg, errno); @@ -1354,7 +1354,7 @@ static DBusMessage *adapter_discover_devices(DBusConnection *conn, if ((adapter->state & STD_INQUIRY) || (adapter->state & PERIODIC_INQUIRY)) goto done; - if (default_device.inqmode) + if (main_opts.inqmode) err = start_inquiry(adapter); else err = start_periodic_inquiry(adapter); @@ -2236,22 +2236,61 @@ static void load_drivers(struct adapter *adapter) } } +static int get_discoverable_timeout(const char *src) +{ + int timeout; + + if (read_discoverable_timeout(src, &timeout) == 0) + return timeout; + + return main_opts.discovto; +} + static void adapter_up(struct adapter *adapter, int dd) { struct hci_conn_list_req *cl = NULL; struct hci_conn_info *ci; - const char *mode; + const char *pmode; + char mode[14]; int i; adapter->up = 1; - adapter->discov_timeout = get_discoverable_timeout(adapter->dev_id); + adapter->discov_timeout = get_discoverable_timeout(adapter->address); adapter->state = DISCOVER_TYPE_NONE; - adapter->scan_mode = get_startup_scan(adapter->dev_id); + /* Set scan mode */ + if (read_device_mode(adapter->address, mode, sizeof(mode)) == 0) { + if (!strcmp(mode, "off") && main_opts.offmode == HCID_OFFMODE_NOSCAN) { + adapter->mode = MODE_OFF; + adapter->scan_mode= SCAN_DISABLED; + } else if (!strcmp(mode, "connectable")) { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } else if (!strcmp(mode, "discoverable")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_DISCOVERABLE; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } + } else if (!strcmp(mode, "limited")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_LIMITED; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + + } + } + } + hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &adapter->scan_mode); - adapter->mode = get_startup_mode(adapter->dev_id); if (adapter->mode == MODE_LIMITED) set_limited_discoverable(dd, adapter->dev.class, TRUE); @@ -2273,11 +2312,11 @@ static void adapter_up(struct adapter *adapter, int dd) } g_free(cl); - mode = mode2str(adapter->mode); + pmode = mode2str(adapter->mode); dbus_connection_emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE, "Mode", - DBUS_TYPE_STRING, &mode); + DBUS_TYPE_STRING, &pmode); load_drivers(adapter); load_devices(adapter); @@ -2743,7 +2782,7 @@ void adapter_set_state(struct adapter *adapter, int state) if (adapter->scheduler_id) goto done; } else if (adapter->disc_sessions && adapter->state & STD_INQUIRY) { - adapter->scheduler_id = g_timeout_add(default_device.inqmode * 1000, + adapter->scheduler_id = g_timeout_add(main_opts.inqmode * 1000, (GSourceFunc) start_inquiry, adapter); goto done; } |