diff options
Diffstat (limited to 'examples/btscanner/device.cpp')
-rw-r--r-- | examples/btscanner/device.cpp | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/examples/btscanner/device.cpp b/examples/btscanner/device.cpp new file mode 100644 index 00000000..ea9579d2 --- /dev/null +++ b/examples/btscanner/device.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtBluetooth module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "device.h" +#include "service.h" + +#include <qbluetoothaddress.h> +#include <qbluetoothdevicediscoveryagent.h> +#include <qbluetoothlocaldevice.h> +#include <QMenu> +#include <QDebug> + +DeviceDiscoveryDialog::DeviceDiscoveryDialog(QWidget *parent) +: QDialog(parent), discoveryAgent(new QBluetoothDeviceDiscoveryAgent), + localDevice(new QBluetoothLocalDevice), + ui(new Ui_DeviceDiscovery) +{ + ui->setupUi(this); + +#if defined (Q_OS_SYMBIAN) || defined(Q_OS_WINCE) || defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) + setWindowState(Qt::WindowFullScreen); +#endif + + connect(ui->inquiryType, SIGNAL(toggled(bool)), this, SLOT(setGeneralUnlimited(bool))); + connect(ui->scan, SIGNAL(clicked()), this, SLOT(startScan())); + + connect(discoveryAgent, SIGNAL(deviceDiscovered(const QBluetoothDeviceInfo&)), + this, SLOT(addDevice(const QBluetoothDeviceInfo&))); + connect(discoveryAgent, SIGNAL(finished()), this, SLOT(scanFinished())); + + connect(ui->list, SIGNAL(itemActivated(QListWidgetItem*)), + this, SLOT(itemActivated(QListWidgetItem*))); + + connect(localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)), + this, SLOT(hostModeStateChanged(QBluetoothLocalDevice::HostMode))); + + hostModeStateChanged(localDevice->hostMode()); + // add context menu for devices to be able to pair device + ui->list->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->list, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayPairingMenu(QPoint))); + connect(localDevice, SIGNAL(pairingFinished(const QBluetoothAddress&, QBluetoothLocalDevice::Pairing)) + , this, SLOT(pairingDone(const QBluetoothAddress&, QBluetoothLocalDevice::Pairing))); + +} + +DeviceDiscoveryDialog::~DeviceDiscoveryDialog() +{ + delete discoveryAgent; +} + +void DeviceDiscoveryDialog::addDevice(const QBluetoothDeviceInfo &info) +{ + QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name()); + QList<QListWidgetItem *> items = ui->list->findItems(label, Qt::MatchExactly); + if (items.empty()) { + QListWidgetItem *item = new QListWidgetItem(label); + QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address()); + if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired ) + item->setTextColor(QColor(Qt::green)); + else + item->setTextColor(QColor(Qt::black)); + + ui->list->addItem(item); + } + +} + +void DeviceDiscoveryDialog::startScan() +{ + discoveryAgent->start(); + ui->scan->setEnabled(false); + ui->inquiryType->setEnabled(false); +} + +void DeviceDiscoveryDialog::scanFinished() +{ + ui->scan->setEnabled(true); + ui->inquiryType->setEnabled(true); +} + +void DeviceDiscoveryDialog::setGeneralUnlimited(bool unlimited) +{ + if (unlimited) + discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry); + else + discoveryAgent->setInquiryType(QBluetoothDeviceDiscoveryAgent::LimitedInquiry); +} + +void DeviceDiscoveryDialog::itemActivated(QListWidgetItem *item) +{ + QString text = item->text(); + + int index = text.indexOf(' '); + + if (index == -1) + return; + + QBluetoothAddress address(text.left(index)); + QString name(text.mid(index + 1)); + + ServiceDiscoveryDialog d(name, address); + d.exec(); +} + +void DeviceDiscoveryDialog::on_discoverable_clicked(bool clicked) +{ + if (clicked) + localDevice->setHostMode(QBluetoothLocalDevice::HostDiscoverable); + else + localDevice->setHostMode(QBluetoothLocalDevice::HostConnectable); +} + +void DeviceDiscoveryDialog::on_power_clicked(bool clicked) +{ + if (clicked) + localDevice->powerOn(); + else + localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff); +} + +void DeviceDiscoveryDialog::hostModeStateChanged(QBluetoothLocalDevice::HostMode mode) +{ + if (mode != QBluetoothLocalDevice::HostPoweredOff) + ui->power->setChecked(true); + else + ui->power->setChecked( false); + + if (mode == QBluetoothLocalDevice::HostDiscoverable) + ui->discoverable->setChecked(true); + else + ui->discoverable->setChecked(false); + + bool on = !(mode == QBluetoothLocalDevice::HostPoweredOff); + + + ui->scan->setEnabled(on); + ui->discoverable->setEnabled(on); +} +void DeviceDiscoveryDialog::displayPairingMenu(const QPoint &pos) +{ + QMenu menu(this); + QAction *pairAction = menu.addAction("Pair"); + QAction *removePairAction = menu.addAction("Remove Pairing"); + QAction *chosenAction = menu.exec(ui->list->viewport()->mapToGlobal(pos)); + QListWidgetItem *currentItem = ui->list->currentItem(); + + QString text = currentItem->text(); + int index = text.indexOf(' '); + if (index == -1) + return; + + QBluetoothAddress address (text.left(index)); + if (chosenAction == pairAction) { + localDevice->requestPairing(address, QBluetoothLocalDevice::Paired); + } else if (chosenAction == removePairAction) { + localDevice->requestPairing(address, QBluetoothLocalDevice::Unpaired); + } +} +void DeviceDiscoveryDialog::pairingDone(const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing pairing) +{ + QList<QListWidgetItem *> items = ui->list->findItems(address.toString(), Qt::MatchContains); + + if (pairing == QBluetoothLocalDevice::Paired || pairing == QBluetoothLocalDevice::AuthorizedPaired ) { + for (int var = 0; var < items.count(); ++var) { + QListWidgetItem *item = items.at(var); + item->setTextColor(QColor(Qt::green)); + } + } else { + for (int var = 0; var < items.count(); ++var) { + QListWidgetItem *item = items.at(var); + item->setTextColor(QColor(Qt::red)); + } + } +} |