summaryrefslogtreecommitdiffstats
path: root/src/adapter.c
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2008-08-30 09:54:27 -0300
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2008-09-01 17:23:27 -0300
commit676f5e7dea3c6c160ffdf08d42bf83e72a5a6c3f (patch)
tree1eafa357750c5c25070d76b66b09cad19a50fd2c /src/adapter.c
parent75c562d773e5fe37f4257631318d7f918edc5b53 (diff)
Adapter initialization cleanup
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c61
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;
}