42 #include "ui_remoteselector.h" 44 #include <qbluetoothdeviceinfo.h> 45 #include <qbluetoothaddress.h> 46 #include <qbluetoothtransferrequest.h> 47 #include <qbluetoothtransferreply.h> 48 #include <qbluetoothlocaldevice.h> 51 #include <QMessageBox> 52 #include <QFileDialog> 62 m_localDevice(new QBluetoothLocalDevice), m_pindisplay(0),
68 QBluetoothAddress adapterAddress = m_localDevice->address();
79 m_discoveryAgent =
new QBluetoothServiceDiscoveryAgent(adapterAddress);
81 connect(m_discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)),
82 this, SLOT(serviceDiscovered(QBluetoothServiceInfo)));
83 connect(m_discoveryAgent, SIGNAL(finished()),
this, SLOT(discoveryFinished()));
84 connect(m_discoveryAgent, SIGNAL(canceled()),
this, SLOT(discoveryFinished()));
86 ui->remoteDevices->setColumnWidth(3, 75);
87 ui->remoteDevices->setColumnWidth(4, 100);
89 connect(m_localDevice, SIGNAL(pairingDisplayPinCode(QBluetoothAddress,QString)),
90 this, SLOT(displayPin(QBluetoothAddress,QString)));
91 connect(m_localDevice, SIGNAL(pairingDisplayConfirmation(QBluetoothAddress,QString)),
92 this, SLOT(displayConfirmation(QBluetoothAddress,QString)));
93 connect(m_localDevice, SIGNAL(pairingFinished(QBluetoothAddress,QBluetoothLocalDevice::Pairing)),
94 this, SLOT(pairingFinished(QBluetoothAddress,QBluetoothLocalDevice::Pairing)));
95 connect(m_localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)),
96 this, SLOT(pairingError(QBluetoothLocalDevice::Error)));
98 ui->busyWidget->setMovie(
new QMovie(
":/icons/busy.gif"));
99 ui->busyWidget->movie()->start();
101 ui->pairingBusy->setMovie(
new QMovie(
":/icons/pairing.gif"));
102 ui->pairingBusy->hide();
104 ui->remoteDevices->clearContents();
105 ui->remoteDevices->setRowCount(0);
111 delete m_discoveryAgent;
112 delete m_localDevice;
117 ui->stopButton->setDisabled(
false);
118 if (m_discoveryAgent->isActive())
119 m_discoveryAgent->stop();
121 m_discoveryAgent->setUuidFilter(uuid);
122 m_discoveryAgent->start();
124 if (!m_discoveryAgent->isActive() ||
125 m_discoveryAgent->error() != QBluetoothServiceDiscoveryAgent::NoError) {
126 ui->status->setText(tr(
"Cannot find remote services."));
128 ui->status->setText(tr(
"Scanning..."));
129 ui->busyWidget->show();
130 ui->busyWidget->movie()->start();
139 void RemoteSelector::serviceDiscovered(
const QBluetoothServiceInfo &serviceInfo)
142 qDebug() <<
"Discovered service on" 143 << serviceInfo.device().name() << serviceInfo.device().address().toString();
144 qDebug() <<
"\tService name:" << serviceInfo.serviceName();
145 qDebug() <<
"\tDescription:" 146 << serviceInfo.attribute(QBluetoothServiceInfo::ServiceDescription).toString();
147 qDebug() <<
"\tProvider:" 148 << serviceInfo.attribute(QBluetoothServiceInfo::ServiceProvider).toString();
149 qDebug() <<
"\tL2CAP protocol service multiplexer:" 150 << serviceInfo.protocolServiceMultiplexer();
151 qDebug() <<
"\tRFCOMM server channel:" << serviceInfo.serverChannel();
155 if (serviceInfo.device().name().isEmpty())
156 remoteName = serviceInfo.device().address().toString();
158 remoteName = serviceInfo.device().name();
164 QMutableMapIterator<int, QBluetoothServiceInfo> i(m_discoveredServices);
167 if (serviceInfo.device().address() == i.value().device().address()){
168 i.setValue(serviceInfo);
173 int row = ui->remoteDevices->rowCount();
174 ui->remoteDevices->insertRow(row);
175 QTableWidgetItem *item =
new QTableWidgetItem(serviceInfo.device().address().toString());
176 ui->remoteDevices->setItem(row, 0, item);
177 item =
new QTableWidgetItem(serviceInfo.device().name());
178 ui->remoteDevices->setItem(row, 1, item);
179 item =
new QTableWidgetItem(serviceInfo.serviceName());
181 ui->remoteDevices->setItem(row, 2, item);
183 QBluetoothLocalDevice::Pairing p;
185 p = m_localDevice->pairingStatus(serviceInfo.device().address());
187 ui->remoteDevices->blockSignals(
true);
189 item =
new QTableWidgetItem();
190 if ((p&QBluetoothLocalDevice::Paired) || (p&QBluetoothLocalDevice::AuthorizedPaired))
191 item->setCheckState(Qt::Checked);
193 item->setCheckState(Qt::Unchecked);
194 ui->remoteDevices->setItem(row, 3, item);
196 item =
new QTableWidgetItem();
197 if (p&QBluetoothLocalDevice::AuthorizedPaired)
198 item->setCheckState(Qt::Checked);
200 item->setCheckState(Qt::Unchecked);
202 ui->remoteDevices->setItem(row, 4, item);
204 ui->remoteDevices->blockSignals(
false);
207 m_discoveredServices.insert(row, serviceInfo);
210 void RemoteSelector::discoveryFinished()
212 ui->status->setText(tr(
"Select the device to send to."));
213 ui->stopButton->setDisabled(
true);
214 ui->busyWidget->movie()->stop();
215 ui->busyWidget->hide();
223 void RemoteSelector::on_refreshPB_clicked()
226 ui->stopButton->setDisabled(
false);
229 void RemoteSelector::on_fileSelectPB_clicked()
231 ui->fileName->setText(QFileDialog::getOpenFileName());
232 if (m_service.isValid())
233 ui->sendButton->setDisabled(
false);
236 void RemoteSelector::on_sendButton_clicked()
238 QBluetoothTransferManager mgr;
239 QBluetoothTransferRequest req(m_service.device().address());
241 m_file =
new QFile(ui->fileName->text());
244 p->
setStatus(
"Sending to: " + m_service.device().name(),
"Waiting for start");
247 QBluetoothTransferReply *reply = mgr.put(req, m_file);
250 reply->setParent(
this);
252 qDebug() <<
"Failed to send file";
254 reply->deleteLater();
258 connect(reply, SIGNAL(transferProgress(qint64,qint64)), p, SLOT(uploadProgress(qint64,qint64)));
259 connect(reply, SIGNAL(finished(QBluetoothTransferReply*)), p, SLOT(finished(QBluetoothTransferReply*)));
260 connect(p, SIGNAL(rejected()), reply, SLOT(abort()));
263 void RemoteSelector::on_stopButton_clicked()
265 m_discoveryAgent->stop();
268 QString RemoteSelector::addressToName(
const QBluetoothAddress &address)
270 QMapIterator<int, QBluetoothServiceInfo> i(m_discoveredServices);
273 if (i.value().device().address() == address)
274 return i.value().device().name();
276 return address.toString();
279 void RemoteSelector::displayPin(
const QBluetoothAddress &address, QString pin)
282 m_pindisplay->deleteLater();
283 m_pindisplay =
new pinDisplay(QString(
"Enter pairing pin on: %1").arg(addressToName(address)), pin,
this);
284 m_pindisplay->show();
287 void RemoteSelector::displayConfirmation(
const QBluetoothAddress &address, QString pin)
292 m_pindisplay->deleteLater();
293 m_pindisplay =
new pinDisplay(QString(
"Confirm this pin is the same"), pin,
this);
294 connect(m_pindisplay, SIGNAL(accepted()),
this, SLOT(displayConfAccepted()));
295 connect(m_pindisplay, SIGNAL(rejected()),
this, SLOT(displayConfReject()));
296 m_pindisplay->setOkCancel();
297 m_pindisplay->show();
300 void RemoteSelector::displayConfAccepted()
302 m_localDevice->pairingConfirmation(
true);
304 void RemoteSelector::displayConfReject()
306 m_localDevice->pairingConfirmation(
false);
309 void RemoteSelector::pairingFinished(
const QBluetoothAddress &address, QBluetoothLocalDevice::Pairing status)
314 ui->pairingBusy->hide();
315 ui->pairingBusy->movie()->stop();
317 ui->remoteDevices->blockSignals(
true);
319 for (
int i = 0; i < m_discoveredServices.count(); i++){
320 if (m_discoveredServices.value(i).device().address() == address){
321 service = m_discoveredServices.value(i);
331 if (m_pairingError) {
332 msgBox.setText(
"Pairing failed with " + address.toString());
333 }
else if (status == QBluetoothLocalDevice::Paired
334 || status == QBluetoothLocalDevice::AuthorizedPaired) {
335 msgBox.setText(
"Paired successfully with " + address.toString());
337 msgBox.setText(
"Pairing released with " + address.toString());
340 if (service.isValid()){
341 if (status == QBluetoothLocalDevice::AuthorizedPaired){
342 ui->remoteDevices->item(row, 3)->setCheckState(Qt::Checked);
343 ui->remoteDevices->item(row, 4)->setCheckState(Qt::Checked);
345 else if (status == QBluetoothLocalDevice::Paired){
346 ui->remoteDevices->item(row, 3)->setCheckState(Qt::Checked);
347 ui->remoteDevices->item(row, 4)->setCheckState(Qt::Unchecked);
350 ui->remoteDevices->item(row, 3)->setCheckState(Qt::Unchecked);
351 ui->remoteDevices->item(row, 4)->setCheckState(Qt::Unchecked);
355 m_pairingError =
false;
358 ui->remoteDevices->blockSignals(
false);
361 void RemoteSelector::pairingError(QBluetoothLocalDevice::Error error)
363 if (error != QBluetoothLocalDevice::PairingError)
366 m_pairingError =
true;
367 pairingFinished(m_service.device().address(), QBluetoothLocalDevice::Unpaired);
370 void RemoteSelector::on_remoteDevices_cellClicked(
int row,
int column)
374 m_service = m_discoveredServices.value(row);
375 if (!ui->fileName->text().isEmpty()) {
376 ui->sendButton->setDisabled(
false);
380 void RemoteSelector::on_remoteDevices_itemChanged(QTableWidgetItem* item)
382 int row = item->row();
383 int column = item->column();
384 m_service = m_discoveredServices.value(row);
389 if (item->checkState() == Qt::Unchecked && column == 3){
390 m_localDevice->requestPairing(m_service.device().address(), QBluetoothLocalDevice::Unpaired);
393 else if ((item->checkState() == Qt::Checked && column == 3) ||
394 (item->checkState() == Qt::Unchecked && column == 4)){
395 m_localDevice->requestPairing(m_service.device().address(), QBluetoothLocalDevice::Paired);
396 ui->remoteDevices->blockSignals(
true);
397 ui->remoteDevices->item(row, column)->setCheckState(Qt::PartiallyChecked);
398 ui->remoteDevices->blockSignals(
false);
400 else if (item->checkState() == Qt::Checked && column == 4){
401 m_localDevice->requestPairing(m_service.device().address(), QBluetoothLocalDevice::AuthorizedPaired);
402 ui->remoteDevices->blockSignals(
true);
403 ui->remoteDevices->item(row, column)->setCheckState(Qt::PartiallyChecked);
404 ui->remoteDevices->blockSignals(
false);
406 ui->pairingBusy->show();
407 ui->pairingBusy->movie()->start();
void setStatus(QString title, QString filename)
QBluetoothServiceInfo service() const
RemoteSelector(QWidget *parent=0)