bluedevil5/sync-with-master.patch

4004 lines
149 KiB
Diff
Raw Normal View History

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e1f264..98a8c70 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,6 @@
project(bluedevil)
-set(PROJECT_VERSION "5.2.1")
+set(PROJECT_VERSION "5.2.90")
+set(PROJECT_VERSION_MAJOR 5)
cmake_minimum_required(VERSION 2.8.12)
@@ -8,7 +9,7 @@ configure_file(version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/version.h)
find_package(ECM REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
-set(QT_MIN_VERSION "5.2.0")
+set(QT_MIN_VERSION "5.4.0")
find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
Core
Widgets
diff --git a/README b/README
index b701b77..b819ed7 100644
--- a/README
+++ b/README
@@ -1,14 +1,11 @@
BlueDevil runtime dependencies:
- -obex-data-server
+ -bluez5
+ -General Bluetooth management
+
+ -bluez-obexd
-Be able to "Browse File" aka kio_obexftp
+ -Be able to "Send Files" (bluedevil-sendfile)
-Be able to receive files
- -obexd-client
- -Be able to Send files (bluedevil-sendfile)
-
- -If you're using Alsa:
- The best way of having "automagical headset configuration" is having the bluetooth.conf hook
- enabled
-
- NOTE: Be sure to install only obexd-client and not obexd-server, since the last will conflic
- with obex-data-server.
\ No newline at end of file
+ -pulseaudio-module-bluetooth
+ -Be able to connect A2DP profile
diff --git a/src/XmlMessages.sh b/src/XmlMessages.sh
new file mode 100755
index 0000000..05651f5
--- /dev/null
+++ b/src/XmlMessages.sh
@@ -0,0 +1,22 @@
+function get_files
+{
+ echo bluedevil-mime.xml
+}
+
+function po_for_file
+{
+ case "$1" in
+ bluedevil-mime.xml)
+ echo bluedevil_xml_mimetypes.po
+ ;;
+ esac
+}
+
+function tags_for_file
+{
+ case "$1" in
+ bluedevil-mime.xml)
+ echo comment
+ ;;
+ esac
+}
diff --git a/src/bluedevil-mime.xml b/src/bluedevil-mime.xml
index 669147d..dc4af15 100644
--- a/src/bluedevil-mime.xml
+++ b/src/bluedevil-mime.xml
@@ -17,27 +17,195 @@ Notes:
<sub-class-of type="inode/directory"/>
<generic-icon name="video-display"/>
<comment>Known Device</comment>
+ <comment xml:lang="bs">Poznat uređaj</comment>
+ <comment xml:lang="ca">Dispositiu conegut</comment>
+ <comment xml:lang="cs">Známé zařízení</comment>
+ <comment xml:lang="da">Kendt enhed</comment>
+ <comment xml:lang="de">Bekanntes Gerät</comment>
+ <comment xml:lang="el">Γνωστή συσκευή</comment>
+ <comment xml:lang="en_GB">Known Device</comment>
+ <comment xml:lang="es">Dispositivo conocido</comment>
+ <comment xml:lang="fi">Tunnettu laite</comment>
+ <comment xml:lang="fr">Périphérique connu</comment>
+ <comment xml:lang="it">Dispositivo conosciuto</comment>
+ <comment xml:lang="nl">Bekend apparaat</comment>
+ <comment xml:lang="pl">Znane urządzenie</comment>
+ <comment xml:lang="pt">Dispositivo Conhecido</comment>
+ <comment xml:lang="pt_BR">Dispositivo conhecido</comment>
+ <comment xml:lang="sk">Známe zariadenie</comment>
+ <comment xml:lang="sl">Znana naprava</comment>
+ <comment xml:lang="sr">познати уређај</comment>
+ <comment xml:lang="sr@ijekavian">познати уређај</comment>
+ <comment xml:lang="sr@ijekavianlatin">poznati uređaj</comment>
+ <comment xml:lang="sr@latin">poznati uređaj</comment>
+ <comment xml:lang="sv">Känd enhet</comment>
+ <comment xml:lang="uk">Відомий пристрій</comment>
+ <comment xml:lang="zh_TW">已知的裝置</comment>
</mime-type>
<mime-type type="inode/vnd.kde.bluedevil.device.discovered">
<sub-class-of type="inode/vnd.kde.bluedevil.device"/>
<generic-icon name="video-display"/>
<comment>Discovered Device</comment>
+ <comment xml:lang="bs">Otkriven uređaj</comment>
+ <comment xml:lang="ca">Dispositiu descobert</comment>
+ <comment xml:lang="cs">Objevené zařízení</comment>
+ <comment xml:lang="da">Opdaget enhed</comment>
+ <comment xml:lang="de">Erkanntes Gerät</comment>
+ <comment xml:lang="el">Ευρεθείσα συσκευή</comment>
+ <comment xml:lang="en_GB">Discovered Device</comment>
+ <comment xml:lang="es">Dispositivo descubierto</comment>
+ <comment xml:lang="fi">Löydetty palvelu</comment>
+ <comment xml:lang="fr">Périphérique découvert</comment>
+ <comment xml:lang="it">Dispositivo scoperto</comment>
+ <comment xml:lang="nl">Gevonden apparaat</comment>
+ <comment xml:lang="pl">Odkryte urządzenie</comment>
+ <comment xml:lang="pt">Dispositivo Descoberto</comment>
+ <comment xml:lang="pt_BR">Dispositivo descoberto</comment>
+ <comment xml:lang="sk">Objavené zariadenie</comment>
+ <comment xml:lang="sl">Odkrita naprava</comment>
+ <comment xml:lang="sr">откривени уређај</comment>
+ <comment xml:lang="sr@ijekavian">откривени уређај</comment>
+ <comment xml:lang="sr@ijekavianlatin">otkriveni uređaj</comment>
+ <comment xml:lang="sr@latin">otkriveni uređaj</comment>
+ <comment xml:lang="sv">Upptäckt enhet</comment>
+ <comment xml:lang="uk">Виявлений пристрій</comment>
+ <comment xml:lang="zh_TW">已發現的裝置</comment>
</mime-type>
<mime-type type="inode/vnd.kde.bluedevil.service">
<sub-class-of type="inode/directory"/>
<generic-icon name="preferences-system-bluetooth"/>
<comment>Service</comment>
+ <comment xml:lang="bs">Usluga</comment>
+ <comment xml:lang="ca">Servei</comment>
+ <comment xml:lang="cs">Služba</comment>
+ <comment xml:lang="da">Tjeneste</comment>
+ <comment xml:lang="de">Dienst</comment>
+ <comment xml:lang="el">Υπηρεσία</comment>
+ <comment xml:lang="en_GB">Service</comment>
+ <comment xml:lang="es">Servicio</comment>
+ <comment xml:lang="fi">Palvelu</comment>
+ <comment xml:lang="fr">Service</comment>
+ <comment xml:lang="it">Servizio</comment>
+ <comment xml:lang="nl">Service</comment>
+ <comment xml:lang="pl">Usługa</comment>
+ <comment xml:lang="pt">Serviço</comment>
+ <comment xml:lang="pt_BR">Serviço</comment>
+ <comment xml:lang="sk">Služba</comment>
+ <comment xml:lang="sl">Storitev</comment>
+ <comment xml:lang="sr">сервис</comment>
+ <comment xml:lang="sr@ijekavian">сервис</comment>
+ <comment xml:lang="sr@ijekavianlatin">servis</comment>
+ <comment xml:lang="sr@latin">servis</comment>
+ <comment xml:lang="sv">Tjänst</comment>
+ <comment xml:lang="uk">Служба</comment>
+ <comment xml:lang="zh_TW">服務</comment>
</mime-type>
<mime-type type="application/vnd.kde.bluedevil-audio">
<comment>Service</comment>
+ <comment xml:lang="bs">Usluga</comment>
+ <comment xml:lang="ca">Servei</comment>
+ <comment xml:lang="cs">Služba</comment>
+ <comment xml:lang="da">Tjeneste</comment>
+ <comment xml:lang="de">Dienst</comment>
+ <comment xml:lang="el">Υπηρεσία</comment>
+ <comment xml:lang="en_GB">Service</comment>
+ <comment xml:lang="es">Servicio</comment>
+ <comment xml:lang="fi">Palvelu</comment>
+ <comment xml:lang="fr">Service</comment>
+ <comment xml:lang="it">Servizio</comment>
+ <comment xml:lang="nl">Service</comment>
+ <comment xml:lang="pl">Usługa</comment>
+ <comment xml:lang="pt">Serviço</comment>
+ <comment xml:lang="pt_BR">Serviço</comment>
+ <comment xml:lang="sk">Služba</comment>
+ <comment xml:lang="sl">Storitev</comment>
+ <comment xml:lang="sr">сервис</comment>
+ <comment xml:lang="sr@ijekavian">сервис</comment>
+ <comment xml:lang="sr@ijekavianlatin">servis</comment>
+ <comment xml:lang="sr@latin">servis</comment>
+ <comment xml:lang="sv">Tjänst</comment>
+ <comment xml:lang="uk">Служба</comment>
+ <comment xml:lang="zh_TW">服務</comment>
</mime-type>
<mime-type type="application/vnd.kde.bluedevil-network-panu">
<comment>Service</comment>
+ <comment xml:lang="bs">Usluga</comment>
+ <comment xml:lang="ca">Servei</comment>
+ <comment xml:lang="cs">Služba</comment>
+ <comment xml:lang="da">Tjeneste</comment>
+ <comment xml:lang="de">Dienst</comment>
+ <comment xml:lang="el">Υπηρεσία</comment>
+ <comment xml:lang="en_GB">Service</comment>
+ <comment xml:lang="es">Servicio</comment>
+ <comment xml:lang="fi">Palvelu</comment>
+ <comment xml:lang="fr">Service</comment>
+ <comment xml:lang="it">Servizio</comment>
+ <comment xml:lang="nl">Service</comment>
+ <comment xml:lang="pl">Usługa</comment>
+ <comment xml:lang="pt">Serviço</comment>
+ <comment xml:lang="pt_BR">Serviço</comment>
+ <comment xml:lang="sk">Služba</comment>
+ <comment xml:lang="sl">Storitev</comment>
+ <comment xml:lang="sr">сервис</comment>
+ <comment xml:lang="sr@ijekavian">сервис</comment>
+ <comment xml:lang="sr@ijekavianlatin">servis</comment>
+ <comment xml:lang="sr@latin">servis</comment>
+ <comment xml:lang="sv">Tjänst</comment>
+ <comment xml:lang="uk">Служба</comment>
+ <comment xml:lang="zh_TW">服務</comment>
</mime-type>
<mime-type type="application/vnd.kde.bluedevil-network-dun">
<comment>Service</comment>
+ <comment xml:lang="bs">Usluga</comment>
+ <comment xml:lang="ca">Servei</comment>
+ <comment xml:lang="cs">Služba</comment>
+ <comment xml:lang="da">Tjeneste</comment>
+ <comment xml:lang="de">Dienst</comment>
+ <comment xml:lang="el">Υπηρεσία</comment>
+ <comment xml:lang="en_GB">Service</comment>
+ <comment xml:lang="es">Servicio</comment>
+ <comment xml:lang="fi">Palvelu</comment>
+ <comment xml:lang="fr">Service</comment>
+ <comment xml:lang="it">Servizio</comment>
+ <comment xml:lang="nl">Service</comment>
+ <comment xml:lang="pl">Usługa</comment>
+ <comment xml:lang="pt">Serviço</comment>
+ <comment xml:lang="pt_BR">Serviço</comment>
+ <comment xml:lang="sk">Služba</comment>
+ <comment xml:lang="sl">Storitev</comment>
+ <comment xml:lang="sr">сервис</comment>
+ <comment xml:lang="sr@ijekavian">сервис</comment>
+ <comment xml:lang="sr@ijekavianlatin">servis</comment>
+ <comment xml:lang="sr@latin">servis</comment>
+ <comment xml:lang="sv">Tjänst</comment>
+ <comment xml:lang="uk">Служба</comment>
+ <comment xml:lang="zh_TW">服務</comment>
</mime-type>
<mime-type type="application/vnd.kde.bluedevil-sendfile">
<comment>Service</comment>
+ <comment xml:lang="bs">Usluga</comment>
+ <comment xml:lang="ca">Servei</comment>
+ <comment xml:lang="cs">Služba</comment>
+ <comment xml:lang="da">Tjeneste</comment>
+ <comment xml:lang="de">Dienst</comment>
+ <comment xml:lang="el">Υπηρεσία</comment>
+ <comment xml:lang="en_GB">Service</comment>
+ <comment xml:lang="es">Servicio</comment>
+ <comment xml:lang="fi">Palvelu</comment>
+ <comment xml:lang="fr">Service</comment>
+ <comment xml:lang="it">Servizio</comment>
+ <comment xml:lang="nl">Service</comment>
+ <comment xml:lang="pl">Usługa</comment>
+ <comment xml:lang="pt">Serviço</comment>
+ <comment xml:lang="pt_BR">Serviço</comment>
+ <comment xml:lang="sk">Služba</comment>
+ <comment xml:lang="sl">Storitev</comment>
+ <comment xml:lang="sr">сервис</comment>
+ <comment xml:lang="sr@ijekavian">сервис</comment>
+ <comment xml:lang="sr@ijekavianlatin">servis</comment>
+ <comment xml:lang="sr@latin">servis</comment>
+ <comment xml:lang="sv">Tjänst</comment>
+ <comment xml:lang="uk">Служба</comment>
+ <comment xml:lang="zh_TW">服務</comment>
</mime-type>
</mime-info>
diff --git a/src/bluedevil.notifyrc b/src/bluedevil.notifyrc
index bda24b0..81433dd 100644
--- a/src/bluedevil.notifyrc
+++ b/src/bluedevil.notifyrc
@@ -1,16 +1,26 @@
[Global]
IconName=preferences-system-bluetooth
Comment=Bluetooth system
+Comment[ast]=Sistema Bluetooth
+Comment[bs]=Bluetooth sistem
Comment[ca]=Sistema Bluetooth
Comment[cs]=Systém Bluetooth
Comment[de]=Bluetooth-System
+Comment[el]=Σύστημα Bluetooth
Comment[en_GB]=Bluetooth system
Comment[es]=Sistema Bluetooth
+Comment[et]=Bluetoothi süsteem
Comment[fi]=Bluetooth-järjestelmä
Comment[fr]=Système Bluetooth
Comment[it]=Sistema Bluetooth
+Comment[ja]=Bluetooth システム
+Comment[kk]=Bluetooth жүйесі
+Comment[ko]=블루투스 시스템
+Comment[lt]=Bluetooth
+Comment[mr]=ब्लूटूथ प्रणाली
Comment[nb]=Blåtann-system
Comment[nl]=Bluetooth-systeem
+Comment[pa]=ਬਲਿਊਟੁੱਥ ਸਿਸਟਮ
Comment[pl]=System Bluetooth
Comment[pt]=Sistema Bluetooth
Comment[pt_BR]=Sistema Bluetooth
@@ -21,20 +31,31 @@ Comment[sr@ijekavian]=Блутут систем
Comment[sr@ijekavianlatin]=Bluetooth sistem
Comment[sr@latin]=Bluetooth sistem
Comment[sv]=Blåtandsystem
+Comment[tr]=Bluetooth sistemi
Comment[uk]=Система Bluetooth
Comment[x-test]=xxBluetooth systemxx
Comment[zh_CN]=蓝牙系统
+Comment[zh_TW]=藍牙系統
Name=Bluetooth
+Name[bs]=Blutut
Name[ca]=Bluetooth
Name[cs]=Bluetooth
Name[de]=Bluetooth
+Name[el]=Bluetooth
Name[en_GB]=Bluetooth
Name[es]=Bluetooth
+Name[et]=Bluetooth
Name[fi]=Bluetooth
Name[fr]=Bluetooth
Name[it]=Bluetooth
+Name[ja]=Bluetooth
+Name[kk]=Bluetooth
+Name[ko]=블루투스
+Name[lt]=Bluetooth
+Name[mr]=ब्लूटूथ
Name[nb]=Blåtann
Name[nl]=Bluetooth
+Name[pa]=ਬਲਿਊਟੁੱਥ
Name[pl]=Bluetooth
Name[pt]=Bluetooth
Name[pt_BR]=Bluetooth
@@ -45,18 +66,23 @@ Name[sr@ijekavian]=Блутут
Name[sr@ijekavianlatin]=Bluetooth
Name[sr@latin]=Bluetooth
Name[sv]=Blåtand
+Name[tr]=Bluetooth
Name[uk]=Bluetooth
Name[x-test]=xxBluetoothxx
Name[zh_CN]=蓝牙
+Name[zh_TW]=藍牙
Ignore=true
[Event/bluedevilAuthorize]
Name=Authorization Requested
+Name[bs]=Zahtijeva odobrenje
Name[ca]=Sol·licitud d'autorització
Name[cs]=Je vyžadováno udělení oprávnění
Name[de]=Autorisierung gefordert
+Name[el]=Απαιτείται ταυτοποίηση
Name[en_GB]=Authorisation Requested
Name[es]=Se ha solicitado autorización
+Name[et]=Autentimise nõue
Name[fi]=Valtuutusta pyydetty
Name[fr]=Autorisation demandée
Name[it]=Richiesta autorizzazione
@@ -72,15 +98,20 @@ Name[sr@ijekavian]=Неопходно овлашћивање
Name[sr@ijekavianlatin]=Neophodno ovlašćivanje
Name[sr@latin]=Neophodno ovlašćivanje
Name[sv]=Behörighet begärd
+Name[tr]=Yetkilendirme Gerekli
Name[uk]=Слід пройти розпізнавання
Name[x-test]=xxAuthorization Requestedxx
Name[zh_CN]=要求认证
+Name[zh_TW]=請求認證
Comment=A device wants to connect
+Comment[bs]=Uređaj se zeli konektovati
Comment[ca]=Un dispositiu es vol connectar
Comment[cs]=Zařízení se chce připojit
Comment[de]=Ein Gerät möchte sich verbinden
+Comment[el]=Μία συσκευή επιθυμεί να συνδεθεί
Comment[en_GB]=A device wants to connect
-Comment[es]=Un dispositivo quiere conectarse
+Comment[es]=Un dispositivo desea conectarse
+Comment[et]=Seade soovib ühendust luua
Comment[fi]=Laite haluaa ottaa yhteyden
Comment[fr]=Un périphérique veut se connecter
Comment[it]=Un dispositivo vuole connettersi
@@ -96,18 +127,23 @@ Comment[sr@ijekavian]=Уређај жели да се повеже
Comment[sr@ijekavianlatin]=Uređaj želi da se poveže
Comment[sr@latin]=Uređaj želi da se poveže
Comment[sv]=En enhet vill ansluta
+Comment[tr]=Bir aygıt bağlanmak istiyor
Comment[uk]=Отримано запит щодо з’єднання пристрою з комп’ютером
Comment[x-test]=xxA device wants to connectxx
Comment[zh_CN]=一个设备想要连接
+Comment[zh_TW]=某個裝置希望能與您連線
Action=Popup
[Event/bluedevilConfirmModechange]
Name=Confirm Mode Change
+Name[bs]=Povrdi promijene moda
Name[ca]=Confirmació del canvi de mode
Name[cs]=Potvrdit změnu režimu
Name[de]=Moduswechsel bestätigen
+Name[el]=Επιβεβαίωση αλλαγής λειτουργίας
Name[en_GB]=Confirm Mode Change
Name[es]=Confirmar el cambio de modo
+Name[et]=Režiimimuutuse kinnitus
Name[fi]=Vahvistan tilan vaihto
Name[fr]=Confirmer le changement de mode
Name[it]=Conferma cambio di modalità
@@ -123,13 +159,17 @@ Name[sr@ijekavian]=Потврди промену режима
Name[sr@ijekavianlatin]=Potvrdi promenu režima
Name[sr@latin]=Potvrdi promenu režima
Name[sv]=Bekräfta lägesändring
+Name[tr]=Kip Değişikliğini Onayla
Name[uk]=Підтвердження зміни режиму
Name[x-test]=xxConfirm Mode Changexx
Name[zh_CN]=确认模式变更
+Name[zh_TW]=確認模式變更
Comment=Bluetooth mode is about to be changed (normal to flight for example)
+Comment[bs]=Režim blututa će biti promijenjen (npr. s normalnog na ljetni)
Comment[ca]=El mode Bluetooth és a punt de canviar (de mode normal a mode avió per exemple)
Comment[cs]=Bude změněn režim Bluetooth (např. Normální na V letadle)
Comment[de]=Der Bluetooth-Modus ist im Begriff, sich zu ändern (z. B. von normal auf Flugzeugmodus)
+Comment[el]=Η λειτουργία του Bluetooth πρόκειται να αλλάξει (π.χ. από κανονική σε πτήσης)
Comment[en_GB]=Bluetooth mode is about to be changed (normal to flight for example)
Comment[es]=El modo Bluetooth está a punto de cambiar (de normal a vuelo, por ejemplo)
Comment[fi]=Bluetooth-tilaa muutetaan (esim. tavallisesta lentokonetilaksi)
@@ -147,23 +187,31 @@ Comment[sr@ijekavian]=Режим блутута ће бити промијење
Comment[sr@ijekavianlatin]=Režim Bluetootha će biti promijenjen (npr. s normalnog na ljetni)
Comment[sr@latin]=Režim Bluetootha će biti promenjen (npr. s normalnog na letni)
Comment[sv]=Blåtandläget ska just ändras (exempelvis från normal till flygning)
+Comment[th]=โหมดของบลูทูทจะถูกเปลี่ยนโหมด (เช่น จากโหมดปกติเป็นโหมดไฟลท์ เป็นต้น)
+Comment[tr]=Bluetooth kipi değiştirilmek üzere (örn. normal -> uçuş kipi)
+Comment[ug]=كۆكچىش ھالىتى ئۆزگەرتىلدى(مەسىلەن: نورمال - ئۈچۈشقا)
Comment[uk]=Зміна режиму роботи Bluetooth (наприклад, зі звичайного на автономний)
Comment[x-test]=xxBluetooth mode is about to be changed (normal to flight for example)xx
Comment[zh_CN]=蓝牙模式即将更改(例如从正常变到飞行模式)
+Comment[zh_TW]=即將改變藍牙模式(例如從一般模式轉換為飛航模式)
Action=Popup
[Event/bluedevilRequestConfirmation]
Name=Confirm PIN
+Name[bs]=Potvrdi pin
Name[ca]=Confirmació del PIN
Name[cs]=Potvrdit PIN
Name[de]=PIN bestätigen
+Name[el]=Επιβεβαίωση PIN
Name[en_GB]=Confirm PIN
Name[es]=Confirmar PIN
+Name[et]=PIN-i kinnitus
Name[fi]=Vahvista PIN
Name[fr]=Confirmer le code « PIN »
Name[it]=Conferma PIN
Name[nb]=Bekreft PIN
Name[nl]=PIN bevestigen
+Name[pa]=ਤਸਦੀਕ ਪਿਨ
Name[pl]=Potwierdź numer PIN
Name[pt]=Confirmar o PIN
Name[pt_BR]=Confirmar o PIN
@@ -174,15 +222,20 @@ Name[sr@ijekavian]=Потврди ПИН
Name[sr@ijekavianlatin]=Potvrdi PIN
Name[sr@latin]=Potvrdi PIN
Name[sv]=Bekräfta PIN-kod
+Name[tr]=PIN'i Onaylayın
Name[uk]=Підтвердження PIN
Name[x-test]=xxConfirm PINxx
Name[zh_CN]=确认 PIN
+Name[zh_TW]=確認 PIN 碼
Comment=Confirm a device request using matching PINs
+Comment[bs]=Potvrdi zahtjev uređaja koristeci odgovarajuce pinove
Comment[ca]=Confirma una sol·licitud d'un dispositiu usant PIN que coincideixin
Comment[cs]=Potvrďte požadavek zařízení použitím odpovídajících PINů
Comment[de]=Eine Geräteanforderung mit passenden PINs bestätigen
+Comment[el]=Επιβεβαίωση αίτησης συσκευής που χρησιμοποιεί ταιριαστά PIN
Comment[en_GB]=Confirm a device request using matching PINs
-Comment[es]=Confirmar la solicitud de un dispositivo usando un PIN coincidente
+Comment[es]=Confirmar la petición de un dispositivo usando PIN emparejados
+Comment[et]=Seadme nõude kinnitamine sobivate PIN-idega
Comment[fi]=Vahvista laitepyyntö käyttämällä samoja PIN-lukuja
Comment[fr]=Confirme une demande d'un périphérique utilisant une correspondance de codes « PIN »
Comment[it]=Conferma la richiesta di un dispositivo usando PIN corrispondenti
@@ -198,16 +251,20 @@ Comment[sr@ijekavian]=Потврдите захтев уређаја одгов
Comment[sr@ijekavianlatin]=Potvrdite zahtev uređaja odgovarajućim PINom
Comment[sr@latin]=Potvrdite zahtev uređaja odgovarajućim PINom
Comment[sv]=Bekräfta att en enhetsbegäran använder PIN-koder som stämmer
+Comment[tr]=Eşleştirme PIN'i kullanarak bir aygıt isteğini onaylayın
Comment[uk]=Підтвердження запиту пристрою відповідними PIN-кодами
Comment[x-test]=xxConfirm a device request using matching PINsxx
Comment[zh_CN]=确认设备请求使用了匹配的 PIN
+Comment[zh_TW]=利用比對 PIN 碼確認裝置的要求
Action=Popup
[Event/bluedevilRequestPin]
Name=Request PIN
+Name[bs]=Zahtijevaj PIN
Name[ca]=Sol·licita el PIN
Name[cs]=Vyžádat PIN
Name[de]=PIN anfordern
+Name[el]=Αίτηση PIN
Name[en_GB]=Request PIN
Name[es]=Solicitar PIN
Name[fi]=Pyydä PINiä
@@ -215,6 +272,7 @@ Name[fr]=Demande de code « PIN »
Name[it]=Richiesta PIN
Name[nb]=Be om PIN
Name[nl]=Om PIN verzoeken
+Name[pa]=ਬੇਨਤੀ ਪਿਨ
Name[pl]=Żąda numeru PIN
Name[pt]=Pedir o PIN
Name[pt_BR]=Solicitar o PIN
@@ -225,20 +283,31 @@ Name[sr@ijekavian]=Захтијевај ПИН
Name[sr@ijekavianlatin]=Zahtijevaj PIN
Name[sr@latin]=Zahtevaj PIN
Name[sv]=Begär PIN-kod
+Name[tr]=PIN iste
Name[uk]=Запит щодо PIN-коду
Name[x-test]=xxRequest PINxx
Name[zh_CN]=请求 PIN
+Name[zh_TW]=需要 PIN 碼
Comment=A PIN is needed
+Comment[bs]=Potreban je PIN
Comment[ca]=Es necessita un PIN
Comment[cs]=Je potřeba PIN
Comment[de]=Eine PIN wird benötigt
+Comment[el]=Απαιτείται PIN
Comment[en_GB]=A PIN is needed
Comment[es]=Se necesita un PIN
Comment[fi]=PIN vaaditaan
Comment[fr]=Un code « PIN » est nécessaire
Comment[it]=Un PIN è richiesto
+Comment[ja]=PIN が必要です
+Comment[kk]=PIN -коды керек
+Comment[km]=ត្រូវការ PIN
+Comment[ko]=PIN이 필요함
+Comment[lt]=Reikia PIN
+Comment[mr]=PIN ची गरज आहे
Comment[nb]=En PIN kreves
Comment[nl]=Er is een PIN nodig
+Comment[pa]=ਪਿਨ ਦੀ ਲੋੜ ਹੈ
Comment[pl]=Potrzebny jest numer PIN
Comment[pt]=É necessário um PIN
Comment[pt_BR]=É necessário um PIN
@@ -249,16 +318,20 @@ Comment[sr@ijekavian]=Потребан је ПИН
Comment[sr@ijekavianlatin]=Potreban je PIN
Comment[sr@latin]=Potreban je PIN
Comment[sv]=En PIN-kod behövs
+Comment[tr]=PIN gerekiyor
Comment[uk]=Потрібен PIN-код
Comment[x-test]=xxA PIN is neededxx
Comment[zh_CN]=需要 PIN
+Comment[zh_TW]=需要 PIN 碼
Action=Popup
[Event/bluedevilIncomingFile]
Name=Incoming File
+Name[bs]=Dolazeća datoteka
Name[ca]=Fitxer entrant
Name[cs]=Příchozí soubor
Name[de]=Eingehende Datei
+Name[el]=Εισερχόμενο αρχείο
Name[en_GB]=Incoming File
Name[es]=Archivo entrante
Name[fi]=Saapuva tiedosto
@@ -266,6 +339,7 @@ Name[fr]=Fichier entrant
Name[it]=File in arrivo
Name[nb]=Innkommende fil
Name[nl]=Bestand aangeboden
+Name[pa]=ਆ ਰਹੀ ਫਾਇਲ
Name[pl]=Przychodzący plik
Name[pt]=Ficheiro Recebido
Name[pt_BR]=Arquivo recebido
@@ -276,20 +350,26 @@ Name[sr@ijekavian]=Долазни фајл
Name[sr@ijekavianlatin]=Dolazni fajl
Name[sr@latin]=Dolazni fajl
Name[sv]=Inkommande fil
+Name[tr]=Gelen Dosya
Name[uk]=Вхідний файл
Name[x-test]=xxIncoming Filexx
Name[zh_CN]=正在传入的文件
+Name[zh_TW]=要傳進來的檔案
Comment=Incoming file transfer
+Comment[bs]=Dolazni transfer datoteke
Comment[ca]=Transferència de fitxer entrant
Comment[cs]=Příchozí přenos souboru
Comment[de]=Eingehende Dateiübertragung
+Comment[el]=Μεταφορά εισερχόμενου αρχείου
Comment[en_GB]=Incoming file transfer
Comment[es]=Transferencia de archivo entrante
+Comment[et]=Sisenev failiedastus
Comment[fi]=Saapuva tiedostonsiirto
Comment[fr]=Transfert de fichier entrant
Comment[it]=Trasferimento di file in arrivo
Comment[nb]=Innkommende filoverføring
Comment[nl]=Inkomende bestandsoverdracht
+Comment[pa]=ਆ ਰਹੀ ਫਾਇਲ ਟਰਾਂਸਫਰ
Comment[pl]=Przychodzące przesyłanie pliku
Comment[pt]=Transferência de ficheiro recebida
Comment[pt_BR]=Transferência de arquivo recebida
@@ -300,7 +380,9 @@ Comment[sr@ijekavian]=Долазни пренос фајла
Comment[sr@ijekavianlatin]=Dolazni prenos fajla
Comment[sr@latin]=Dolazni prenos fajla
Comment[sv]=Inkommande filöverföring
+Comment[tr]=Gelen dosya aktarımı
Comment[uk]=Вхідне перенесення файла
Comment[x-test]=xxIncoming file transferxx
Comment[zh_CN]=收到文件传输
+Comment[zh_TW]=進來的檔案傳輸
Action=Popup
diff --git a/src/daemon/kded/BlueDevilDaemon.cpp b/src/daemon/kded/BlueDevilDaemon.cpp
index 1211103..458ce92 100644
--- a/src/daemon/kded/BlueDevilDaemon.cpp
+++ b/src/daemon/kded/BlueDevilDaemon.cpp
@@ -38,6 +38,7 @@
#include <KLocalizedString>
#include <kfileplacesmodel.h>
#include <kdirnotify.h>
+#include <ksharedconfig.h>
#include <bluedevil/bluedevilmanager.h>
#include <bluedevil/bluedeviladapter.h>
@@ -64,7 +65,7 @@ struct BlueDevilDaemon::Private
Adapter *m_adapter;
QDBusServiceWatcher *m_monolithicWatcher;
FileReceiver *m_fileReceiver;
- QList <DeviceInfo> m_discovered;
+ KSharedConfig::Ptr m_config;
QTimer m_timer;
};
@@ -81,8 +82,8 @@ BlueDevilDaemon::BlueDevilDaemon(QObject *parent, const QList<QVariant>&)
d->m_fileReceiver = 0;
d->m_monolithicWatcher = new QDBusServiceWatcher(QStringLiteral("org.kde.bluedevilmonolithic")
, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForUnregistration, this);
- d->m_timer.setInterval(20000);
d->m_timer.setSingleShot(true);
+ d->m_config = KSharedConfig::openConfig("bluedevilglobalrc");
KAboutData aboutData(
QStringLiteral("bluedevildaemon"),
@@ -103,11 +104,27 @@ BlueDevilDaemon::BlueDevilDaemon(QObject *parent, const QList<QVariant>&)
KAboutData::registerPluginData(aboutData);
connect(d->m_monolithicWatcher, SIGNAL(serviceUnregistered(const QString &)), SLOT(monolithicFinished(const QString &)));
+ connect(&d->m_timer, SIGNAL(timeout()), SLOT(stopDiscovering()));
connect(Manager::self(), SIGNAL(usableAdapterChanged(Adapter*)),
this, SLOT(usableAdapterChanged(Adapter*)));
+ connect(Manager::self(), SIGNAL(adapterAdded(Adapter*)),
+ this, SLOT(adapterAdded(Adapter*)));
+ connect(Manager::self(), SIGNAL(adapterRemoved(Adapter*)),
+ this, SLOT(adapterRemoved(Adapter*)));
+
+ // Catch suspend/resume events
+ QDBusConnection::systemBus().connect(QStringLiteral("org.freedesktop.login1"),
+ QStringLiteral("/org/freedesktop/login1"),
+ QStringLiteral("org.freedesktop.login1.Manager"),
+ QStringLiteral("PrepareForSleep"),
+ this,
+ SLOT(login1PrepareForSleep(bool))
+ );
d->m_status = Private::Offline;
+
+ restoreAdaptersState();
usableAdapterChanged(Manager::self()->usableAdapter());
if (!Manager::self()->adapters().isEmpty()) {
@@ -117,6 +134,8 @@ BlueDevilDaemon::BlueDevilDaemon(QObject *parent, const QList<QVariant>&)
BlueDevilDaemon::~BlueDevilDaemon()
{
+ saveAdaptersState();
+
if (d->m_status == Private::Online) {
offlineMode();
}
@@ -124,6 +143,27 @@ BlueDevilDaemon::~BlueDevilDaemon()
delete d;
}
+static Adapter *adapterForAddress(const QString &address)
+{
+ Q_FOREACH (Adapter *adapter, Manager::self()->adapters()) {
+ if (adapter->address() == address) {
+ return adapter;
+ }
+ }
+ return 0;
+}
+
+void BlueDevilDaemon::login1PrepareForSleep(bool active)
+{
+ if (active) {
+ qCDebug(BLUEDAEMON) << "About to suspend";
+ saveAdaptersState();
+ } else {
+ qCDebug(BLUEDAEMON) << "About to resume";
+ restoreAdaptersState();
+ }
+}
+
bool BlueDevilDaemon::isOnline()
{
if (d->m_status == Private::Offline) {
@@ -132,41 +172,55 @@ bool BlueDevilDaemon::isOnline()
return true;
}
-QMapDeviceInfo BlueDevilDaemon::knownDevices()
+QMapDeviceInfo BlueDevilDaemon::allDevices()
{
QMapDeviceInfo devices;
+ QList<Device*> list = Manager::self()->usableAdapter()->devices();
- QList <Device* > list = Manager::self()->usableAdapter()->devices();
- qCDebug(BLUEDAEMON) << "List: " << list.length();
- DeviceInfo info;
- Q_FOREACH(Device *const device, list) {
- info[QStringLiteral("name")] = device->friendlyName();
- info[QStringLiteral("icon")] = device->icon();
- info[QStringLiteral("address")] = device->address();
- info[QStringLiteral("UUIDs")] = device->UUIDs().join(QStringLiteral(","));
- devices[device->address()] = info;
+ Q_FOREACH (Device *const device, list) {
+ devices[device->address()] = deviceToInfo(device);
}
- if (!d->m_timer.isActive()) {
- qCDebug(BLUEDAEMON) << "Start Discovery";
- Manager::self()->usableAdapter()->startStableDiscovery();
- d->m_discovered.clear();
- d->m_timer.start();
- }
+ return devices;
+}
- Q_FOREACH(const DeviceInfo& info, d->m_discovered) {
- if (!devices.contains(info[QStringLiteral("address")])) {
- devices[info[QStringLiteral("address")]] = info;
+DeviceInfo BlueDevilDaemon::device(const QString &address)
+{
+ Q_FOREACH (Device *const device, Manager::self()->devices()) {
+ if (device->address() == address) {
+ return deviceToInfo(device);
}
}
- return devices;
+
+ return DeviceInfo();
+}
+
+void BlueDevilDaemon::startDiscovering(quint32 timeout)
+{
+ if (!d->m_adapter) {
+ return;
+ }
+
+ qCDebug(BLUEDAEMON) << "Start discovering for" << timeout << "ms";
+
+ d->m_adapter->startDiscovery();
+
+ if (timeout > 0) {
+ d->m_timer.start(timeout);
+ }
}
void BlueDevilDaemon::stopDiscovering()
{
- qCDebug(BLUEDAEMON) << "Stopping discovering";
- d->m_timer.stop();
- Manager::self()->usableAdapter()->stopDiscovery();
+ if (!d->m_adapter) {
+ return;
+ }
+
+ qCDebug(BLUEDAEMON) << "Stop discovering";
+
+ if (d->m_adapter->isDiscovering()) {
+ d->m_adapter->stopDiscovery();
+ }
}
void BlueDevilDaemon::executeMonolithic()
@@ -203,9 +257,7 @@ void BlueDevilDaemon::onlineMode()
d->m_bluezAgent = new BluezAgent(new QObject());
connect(d->m_bluezAgent, SIGNAL(agentReleased()), this, SLOT(agentReleased()));
-
connect(d->m_adapter, SIGNAL(deviceFound(Device*)), this, SLOT(deviceFound(Device*)));
- connect(&d->m_timer, SIGNAL(timeout()), d->m_adapter, SLOT(stopDiscovery()));
FileReceiverSettings::self()->load();
if (!d->m_fileReceiver && FileReceiverSettings::self()->enabled()) {
@@ -271,9 +323,6 @@ void BlueDevilDaemon::offlineMode()
d->m_placesModel->removePlace(index);
}
- if (BlueDevil::Manager::self()->adapters().isEmpty()) {
- killMonolithic();
- }
d->m_status = Private::Offline;
}
@@ -301,10 +350,23 @@ void BlueDevilDaemon::usableAdapterChanged(Adapter *adapter)
}
}
+void BlueDevilDaemon::adapterAdded(Adapter *adapter)
+{
+ restoreAdapterState(adapter);
+}
+
+void BlueDevilDaemon::adapterRemoved(Adapter *adapter)
+{
+ Q_UNUSED(adapter)
+
+ if (BlueDevil::Manager::self()->adapters().isEmpty()) {
+ killMonolithic();
+ }
+}
+
void BlueDevilDaemon::deviceFound(Device *device)
{
qCDebug(BLUEDAEMON) << "DeviceFound: " << device->name();
- d->m_discovered.append(deviceToInfo(device));
org::kde::KDirNotify::emitFilesAdded(QUrl(QStringLiteral("bluetooth:/")));
}
@@ -314,18 +376,59 @@ void BlueDevilDaemon::monolithicQuit(QDBusPendingCallWatcher* watcher)
QDBusPendingReply<void> reply = *watcher;
if (reply.isError()) {
qDebug() << "Error response: " << reply.error().message();
- killMonolithic();
}
}
+void BlueDevilDaemon::saveAdaptersState()
+{
+ Manager *manager = Manager::self();
+ if (!manager) {
+ return;
+ }
+
+ KConfigGroup adaptersGroup = d->m_config->group("Adapters");
+
+ Q_FOREACH (Adapter *adapter, manager->adapters()) {
+ const QString key = QString("%1_powered").arg(adapter->address());
+ adaptersGroup.writeEntry<bool>(key, adapter->isPowered());
+ }
+
+ d->m_config->sync();
+}
+
+// New adapters are automatically powered on
+void BlueDevilDaemon::restoreAdaptersState()
+{
+ Manager *manager = Manager::self();
+ if (!manager) {
+ return;
+ }
+
+ KConfigGroup adaptersGroup = d->m_config->group("Adapters");
+
+ Q_FOREACH (Adapter *adapter, manager->adapters()) {
+ const QString key = QString("%1_powered").arg(adapter->address());
+ adapter->setPowered(adaptersGroup.readEntry<bool>(key, true));
+ }
+}
+
+void BlueDevilDaemon::restoreAdapterState(Adapter *adapter)
+{
+ KConfigGroup adaptersGroup = d->m_config->group("Adapters");
+
+ const QString key = QString("%1_powered").arg(adapter->address());
+ adapter->setPowered(adaptersGroup.readEntry<bool>(key, true));
+}
+
DeviceInfo BlueDevilDaemon::deviceToInfo(Device *const device) const
{
DeviceInfo info;
+
info[QStringLiteral("name")] = device->friendlyName();
info[QStringLiteral("icon")] = device->icon();
info[QStringLiteral("address")] = device->address();
- info[QStringLiteral("discovered")] = QStringLiteral("true");
- info[QStringLiteral("UUIDs")] = device->UUIDs().join(QStringLiteral(","));
+ info[QStringLiteral("UBI")] = device->UBI();
+ info[QStringLiteral("UUIDs")] = device->UUIDs().join(QLatin1Char(','));
return info;
}
diff --git a/src/daemon/kded/BlueDevilDaemon.h b/src/daemon/kded/BlueDevilDaemon.h
index a8688ae..5115f1b 100644
--- a/src/daemon/kded/BlueDevilDaemon.h
+++ b/src/daemon/kded/BlueDevilDaemon.h
@@ -49,16 +49,30 @@ public:
virtual ~BlueDevilDaemon();
public Q_SLOTS:
+ /**
+ * Returns whether the daemon is in online mode (eg. Bluez services are
+ * running and we have usable adapter)
+ */
Q_SCRIPTABLE bool isOnline();
/**
- * This slot will return a list of devices made of: configured and discovered devices.
- * Going deeper, the first time that this slot is called a discovery of X seconds will start
- * Then if this slot is consulted again it will return configured and discovered device. Once
- * the discovery ends it won't start a new discovery until N seconds pass.
+ * Returns QMap<Address, DeviceInfo> with all known devices
*/
- Q_SCRIPTABLE QMapDeviceInfo knownDevices();
+ Q_SCRIPTABLE QMapDeviceInfo allDevices();
+ /**
+ * Returns DeviceInfo for one device.
+ */
+ Q_SCRIPTABLE DeviceInfo device(const QString &address);
+
+ /**
+ * Starts discovery for timeout miliseconds (0 = forever)
+ */
+ Q_SCRIPTABLE void startDiscovering(quint32 timeout);
+
+ /**
+ * Stops discovery (if it was previously started)
+ */
Q_SCRIPTABLE void stopDiscovering();
private:
@@ -81,11 +95,16 @@ private Q_SLOTS:
*/
void usableAdapterChanged(Adapter *adapter);
+ void adapterAdded(Adapter *adapter);
+ void adapterRemoved(Adapter *adapter);
+
/**
* When the agent is released this is called to unload it
*/
void agentReleased();
+ void login1PrepareForSleep(bool active);
+
void deviceFound(Device*);
void monolithicQuit(QDBusPendingCallWatcher* watcher);
void monolithicFinished(const QString &);
@@ -94,7 +113,11 @@ private:
void executeMonolithic();
void killMonolithic();
- DeviceInfo deviceToInfo (Device *const device) const;
+ void saveAdaptersState();
+ void restoreAdaptersState();
+ void restoreAdapterState(Adapter *adapter);
+
+ DeviceInfo deviceToInfo(Device *const device) const;
private:
struct Private;
diff --git a/src/daemon/kded/CMakeLists.txt b/src/daemon/kded/CMakeLists.txt
index 3a8ddb7..651e68d 100644
--- a/src/daemon/kded/CMakeLists.txt
+++ b/src/daemon/kded/CMakeLists.txt
@@ -26,7 +26,7 @@ kconfig_add_kcfg_files(kded_bluedevil_SRCS ../../settings/filereceiversettings.k
add_library(kded_bluedevil MODULE ${kded_bluedevil_SRCS})
-kservice_desktop_to_json(kded_bluedevil bluedevil.desktop)
+kcoreaddons_desktop_to_json(kded_bluedevil bluedevil.desktop)
target_link_libraries(kded_bluedevil
Qt5::Gui
diff --git a/src/daemon/kded/bluedevil.desktop b/src/daemon/kded/bluedevil.desktop
index 6799d91..b65cc5a 100644
--- a/src/daemon/kded/bluedevil.desktop
+++ b/src/daemon/kded/bluedevil.desktop
@@ -9,16 +9,25 @@ X-KDE-Kded-load-on-demand=false
X-KDE-Kded-phase=1
Name=Bluetooth
+Name[bs]=Blutut
Name[ca]=Bluetooth
Name[cs]=Bluetooth
Name[de]=Bluetooth
+Name[el]=Bluetooth
Name[en_GB]=Bluetooth
Name[es]=Bluetooth
+Name[et]=Bluetooth
Name[fi]=Bluetooth
Name[fr]=Bluetooth
Name[it]=Bluetooth
+Name[ja]=Bluetooth
+Name[kk]=Bluetooth
+Name[ko]=블루투스
+Name[lt]=Bluetooth
+Name[mr]=ब्लूटूथ
Name[nb]=Blåtann
Name[nl]=Bluetooth
+Name[pa]=ਬਲਿਊਟੁੱਥ
Name[pl]=Bluetooth
Name[pt]=Bluetooth
Name[pt_BR]=Bluetooth
@@ -29,21 +38,27 @@ Name[sr@ijekavian]=Блутут
Name[sr@ijekavianlatin]=Bluetooth
Name[sr@latin]=Bluetooth
Name[sv]=Blåtand
+Name[tr]=Bluetooth
Name[uk]=Bluetooth
Name[x-test]=xxBluetoothxx
Name[zh_CN]=蓝牙
+Name[zh_TW]=藍牙
Comment=Handles Bluetooth events
+Comment[bs]=Obrađuje Bluetooth događaje
Comment[ca]=Gestiona els esdeveniments del Bluetooth
Comment[cs]=Ovládá události Bluetooth
Comment[de]=Verarbeitung von Bluetooth-Ereignissen
+Comment[el]=Χειρίζεται γεγονότα Bluetooth
Comment[en_GB]=Handles Bluetooth events
-Comment[es]=Gestiona los eventos de Bluetooth
+Comment[es]=Maneja eventos de Bluetooth
+Comment[et]=Bluetoothi sündmuste käitlemine
Comment[fi]=Käsittelee Bluetooth-tapahtumia
Comment[fr]=Gère les évènements Bluetooth
Comment[it]=Gestisce eventi Bluetooth
Comment[nb]=Håndterer Blåtann-hendelser
Comment[nl]=Behandelt bluetooth-gebeurtenissen
+Comment[pa]=ਬਲਿਊਟੁੱਥ ਘਟਨਾਵਾਂ ਕੰਟਰੋਲ ਕਰਨ ਲਈ
Comment[pl]=Obsługa zdarzeń Bluetooth
Comment[pt]=Lida com os eventos de Bluetooth
Comment[pt_BR]=Lida com os eventos de Bluetooth
@@ -54,6 +69,8 @@ Comment[sr@ijekavian]=Рукује блутут догађајима
Comment[sr@ijekavianlatin]=Rukuje bluetooth događajima
Comment[sr@latin]=Rukuje bluetooth događajima
Comment[sv]=Hanterar Blåtandhändelser
+Comment[tr]=Bluetooth olaylarını ele alır
Comment[uk]=Обробляє події Bluetooth
Comment[x-test]=xxHandles Bluetooth eventsxx
Comment[zh_CN]=处理蓝牙事件
+Comment[zh_TW]=處理藍牙事件
diff --git a/src/daemon/kded/filereceiver/filereceiver.cpp b/src/daemon/kded/filereceiver/filereceiver.cpp
index 00405b1..1c8570c 100644
--- a/src/daemon/kded/filereceiver/filereceiver.cpp
+++ b/src/daemon/kded/filereceiver/filereceiver.cpp
@@ -19,11 +19,11 @@
#include "filereceiver.h"
#include "../BlueDevilDaemon.h"
#include "obexagent.h"
-#include "obex_agent_manager.h"
#include <QDBusConnection>
#include <QDBusPendingCall>
#include <QDBusPendingCallWatcher>
+#include <QDBusServiceWatcher>
FileReceiver::FileReceiver(QObject* parent)
: QObject(parent)
@@ -32,14 +32,17 @@ FileReceiver::FileReceiver(QObject* parent)
qDBusRegisterMetaType<QVariantMap>();
new ObexAgent(this);
- org::bluez::obex::AgentManager1 *agent = new org::bluez::obex::AgentManager1(QStringLiteral("org.bluez.obex"),
- QStringLiteral("/org/bluez/obex"),
- QDBusConnection::sessionBus(),
- this);
+ m_agentManager = new org::bluez::obex::AgentManager1(QStringLiteral("org.bluez.obex"),
+ QStringLiteral("/org/bluez/obex"),
+ QDBusConnection::sessionBus(),
+ this);
- QDBusPendingReply <void > r = agent->RegisterAgent(QDBusObjectPath(QStringLiteral("/BlueDevil_receiveAgent")));
- QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(r, this);
- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(agentRegistered(QDBusPendingCallWatcher*)));
+ registerAgent();
+
+ // obexd should be set to auto-start by D-Bus (D-Bus activation), so this should restart it in case of crash
+ QDBusServiceWatcher *serviceWatcher = new QDBusServiceWatcher(QStringLiteral("org.bluez.obex"), QDBusConnection::sessionBus(),
+ QDBusServiceWatcher::WatchForUnregistration, this);
+ connect(serviceWatcher, SIGNAL(serviceUnregistered(QString)), this, SLOT(registerAgent()));
}
FileReceiver::~FileReceiver()
@@ -47,6 +50,13 @@ FileReceiver::~FileReceiver()
}
+void FileReceiver::registerAgent()
+{
+ QDBusPendingReply <void > r = m_agentManager->RegisterAgent(QDBusObjectPath(QStringLiteral("/BlueDevil_receiveAgent")));
+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(r, this);
+ connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(agentRegistered(QDBusPendingCallWatcher*)));
+}
+
void FileReceiver::agentRegistered(QDBusPendingCallWatcher* call)
{
QDBusPendingReply <void > r = *call;
diff --git a/src/daemon/kded/filereceiver/filereceiver.h b/src/daemon/kded/filereceiver/filereceiver.h
index e6dc6fb..dbfa94b 100644
--- a/src/daemon/kded/filereceiver/filereceiver.h
+++ b/src/daemon/kded/filereceiver/filereceiver.h
@@ -21,6 +21,8 @@
#include <QObject>
+#include "obex_agent_manager.h"
+
class QDBusPendingCallWatcher;
class FileReceiver : public QObject
{
@@ -30,7 +32,11 @@ class FileReceiver : public QObject
virtual ~FileReceiver();
private Q_SLOTS:
+ void registerAgent();
void agentRegistered(QDBusPendingCallWatcher* call);
+
+ private:
+ org::bluez::obex::AgentManager1 *m_agentManager;
};
#endif //FILE_RECEIVER_H
diff --git a/src/daemon/kded/filereceiver/receivefilejob.cpp b/src/daemon/kded/filereceiver/receivefilejob.cpp
index 5b9a8f4..a3e6190 100644
--- a/src/daemon/kded/filereceiver/receivefilejob.cpp
+++ b/src/daemon/kded/filereceiver/receivefilejob.cpp
@@ -95,18 +95,29 @@ void ReceiveFileJob::init()
this);
qCDebug(BLUEDAEMON) << m_session->destination();
- Device* device = Manager::self()->usableAdapter()->deviceForAddress(m_session->destination());
+ Device *device = 0;
+ bool isDeviceTrusted = false;
+
+ Q_FOREACH (Adapter *adapter, Manager::self()->adapters()) {
+ if (adapter->address() == m_session->source()) {
+ device = adapter->deviceForAddress(m_session->destination());
+ break;
+ }
+ }
+
qCDebug(BLUEDAEMON) << device;
m_deviceName = m_session->destination();
+
if (device) {
qCDebug(BLUEDAEMON) << device->name();
m_deviceName = device->name();
+ isDeviceTrusted = device->isTrusted();
}
FileReceiverSettings::self()->load();
qCDebug(BLUEDAEMON) << "Auto Accept: " << FileReceiverSettings::self()->autoAccept();
- if (FileReceiverSettings::self()->autoAccept() == 1 && device->isTrusted()) {
+ if (FileReceiverSettings::self()->autoAccept() == 1 && isDeviceTrusted) {
slotAccept();
return;
} else if (FileReceiverSettings::self()->autoAccept() == 2) {
diff --git a/src/fileitemactionplugin/CMakeLists.txt b/src/fileitemactionplugin/CMakeLists.txt
index 3737c68..39d6e33 100644
--- a/src/fileitemactionplugin/CMakeLists.txt
+++ b/src/fileitemactionplugin/CMakeLists.txt
@@ -1,9 +1,17 @@
-add_library(bluetoothfileitemaction MODULE sendfileitemaction.cpp)
-kservice_desktop_to_json(bluetoothfileitemaction bluedevilsendfile.desktop)
+set(fileitemactionplugin_SRCS
+ sendfileitemaction.cpp)
+
+set(kded_bluedevil.xml ${CMAKE_CURRENT_SOURCE_DIR}/kded_bluedevil.xml)
+set_source_files_properties(${kded_bluedevil.xml} PROPERTIES INCLUDE "types.h")
+qt5_add_dbus_interface(fileitemactionplugin_SRCS ${kded_bluedevil.xml} kded_bluedevil)
+
+add_library(bluetoothfileitemaction MODULE ${fileitemactionplugin_SRCS})
+kcoreaddons_desktop_to_json(bluetoothfileitemaction bluedevilsendfile.desktop)
target_link_libraries(bluetoothfileitemaction
Qt5::Widgets
KF5::I18n
KF5::KIOFileWidgets
${LibBlueDevil_LIBRARIES})
+
install(TARGETS bluetoothfileitemaction DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES bluedevilsendfile.desktop DESTINATION ${SERVICES_INSTALL_DIR})
diff --git a/src/fileitemactionplugin/bluedevilsendfile.desktop b/src/fileitemactionplugin/bluedevilsendfile.desktop
index 1896d55..4ce580d 100644
--- a/src/fileitemactionplugin/bluedevilsendfile.desktop
+++ b/src/fileitemactionplugin/bluedevilsendfile.desktop
@@ -1,16 +1,26 @@
[Desktop Entry]
Type=Service
Name=Send file via Bluetooth
+Name[bs]=Šalji datoteku preko Bluetoots
Name[ca]=Envia un fitxer per Bluetooth
Name[cs]=Poslat soubor přes Bluetooth
Name[de]=Datei über Bluetooth versenden
+Name[el]=Αποστολή αρχείου μέσω Bluetooth
Name[en_GB]=Send file via Bluetooth
-Name[es]=Enviar archivo usando Bluetooth
+Name[es]=Enviar archivo por Bluetooth
+Name[et]=Faili saatmine Bluetoothi kaudu
Name[fi]=Lähetä tiedosto Bluetoothin kautta
Name[fr]=Envoi de fichiers via Bluetooth
Name[it]=Invia file via Bluetooth
+Name[ja]=Bluetooth を通してファイルを送信
+Name[kk]=Bluetooth арқылы файлды жіберу
+Name[km]=ផ្ញើ​ឯកសារ​តាម​ប៊្លូធូស
+Name[ko]=블루투스로 파일 보내기
+Name[lt]=Siųsti per Bluetooth
+Name[mr]=ब्लूटूथ द्वारे फाईल पाठवा
Name[nb]=Send fil over Blåtann
Name[nl]=Verzendt bestand over bluetooth
+Name[pa]=ਫਾਇਲ ਨੂੰ ਬਲਿਊਟੁੱਥ ਰਾਹੀਂ ਭੇਜੋ
Name[pl]=Wyślij plik przez Bluetooth
Name[pt]=Enviar o ficheiro por Bluetooth
Name[pt_BR]=Enviar arquivo por Bluetooth
@@ -21,21 +31,32 @@ Name[sr@ijekavian]=Слање фајлова преко блутута
Name[sr@ijekavianlatin]=Slanje fajlova preko Bluetootha
Name[sr@latin]=Slanje fajlova preko Bluetootha
Name[sv]=Skicka fil via Blåtand
+Name[tr]=Bluetooth üzerinden dosya gönder
Name[uk]=Надіслати файл за допомогою Bluetooth
Name[x-test]=xxSend file via Bluetoothxx
Name[zh_CN]=通过蓝牙发送文件
+Name[zh_TW]=透過藍牙傳送檔案
X-KDE-Library=bluetoothfileitemaction
X-KDE-Submenu=Bluetooth
+X-KDE-Submenu[bs]=Blutut
X-KDE-Submenu[ca]=Bluetooth
X-KDE-Submenu[cs]=Bluetooth
X-KDE-Submenu[de]=Bluetooth
+X-KDE-Submenu[el]=Bluetooth
X-KDE-Submenu[en_GB]=Bluetooth
X-KDE-Submenu[es]=Bluetooth
X-KDE-Submenu[fi]=Bluetooth
X-KDE-Submenu[fr]=Bluetooth
X-KDE-Submenu[it]=Bluetooth
+X-KDE-Submenu[ja]=Bluetooth
+X-KDE-Submenu[kk]=Bluetooth
+X-KDE-Submenu[km]=ប៊្លូធូស
+X-KDE-Submenu[ko]=블루투스
+X-KDE-Submenu[lt]=Bluetooth
+X-KDE-Submenu[mr]=ब्लूटूथ
X-KDE-Submenu[nb]=Blåtann
X-KDE-Submenu[nl]=Bluetooth
+X-KDE-Submenu[pa]=ਬਲਿਊਟੁੱਥ
X-KDE-Submenu[pl]=Bluetooth
X-KDE-Submenu[pt]=Bluetooth
X-KDE-Submenu[pt_BR]=Bluetooth
@@ -46,9 +67,11 @@ X-KDE-Submenu[sr@ijekavian]=Блутут
X-KDE-Submenu[sr@ijekavianlatin]=Bluetooth
X-KDE-Submenu[sr@latin]=Bluetooth
X-KDE-Submenu[sv]=Blåtand
+X-KDE-Submenu[tr]=Bluetooth
X-KDE-Submenu[uk]=Bluetooth
X-KDE-Submenu[x-test]=xxBluetoothxx
X-KDE-Submenu[zh_CN]=蓝牙
+X-KDE-Submenu[zh_TW]=藍牙
Icon=preferences-system-bluetooth
ServiceTypes=KFileItemAction/Plugin
MimeType=application/octet-stream;
diff --git a/src/fileitemactionplugin/kded_bluedevil.xml b/src/fileitemactionplugin/kded_bluedevil.xml
new file mode 100644
index 0000000..e447897
--- /dev/null
+++ b/src/fileitemactionplugin/kded_bluedevil.xml
@@ -0,0 +1,23 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.kde.BlueDevil">
+ <method name="isOnline">
+ <arg type="b" direction="out"/>
+ </method>
+ <method name="allDevices">
+ <arg type="aa{ss}" direction="out"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QMapDeviceInfo"/>
+ </method>
+ <method name="device">
+ <arg name="address" type="s" direction="in"/>
+ <arg type="a{ss}" direction="out"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="DeviceInfo"/>
+ </method>
+ <method name="startDiscovering">
+ <arg name="timeout" type="u" direction="in"/>
+ </method>
+ <method name="stopDiscovering">
+ </method>
+ </interface>
+</node>
diff --git a/src/fileitemactionplugin/sendfileitemaction.cpp b/src/fileitemactionplugin/sendfileitemaction.cpp
index c750bc4..b240470 100644
--- a/src/fileitemactionplugin/sendfileitemaction.cpp
+++ b/src/fileitemactionplugin/sendfileitemaction.cpp
@@ -33,10 +33,6 @@
#include <KProcess>
#include <KLocalizedString>
-#include <bluedevil/bluedevil.h>
-
-using namespace BlueDevil;
-
K_PLUGIN_FACTORY_WITH_JSON(SendFileItemActionFactory,
"bluedevilsendfile.json",
registerPlugin<SendFileItemAction>();)
@@ -45,34 +41,37 @@ SendFileItemAction::SendFileItemAction(QObject* parent, const QVariantList& args
: KAbstractFileItemActionPlugin(parent)
{
Q_UNUSED(args)
+
+ qDBusRegisterMetaType<DeviceInfo>();
+ qDBusRegisterMetaType<QMapDeviceInfo>();
+
+ m_kded = new org::kde::BlueDevil(QStringLiteral("org.kde.kded5"), QStringLiteral("/modules/bluedevil"),
+ QDBusConnection::sessionBus(), this);
}
QList< QAction* > SendFileItemAction::actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget)
{
Q_UNUSED(parentWidget)
- QList< QAction* > list;
- m_fileItemInfos = fileItemInfos;
+ QList<QAction*> list;
- //If there is no adaptor, there is no bluetooth
- if (!Manager::self()->usableAdapter()) {
+ // Don't show the action for files that we can't send or when Bluetooth is offline.
+ if (!fileItemInfos.isLocal() || !m_kded->isOnline()) {
return list;
}
- Adapter *adapter = Manager::self()->usableAdapter();
+
+ m_fileItemInfos = fileItemInfos;
QAction *menuAction = new QAction(QIcon::fromTheme(QStringLiteral("preferences-system-bluetooth")), i18n("Send via Bluetooth"), this);
QMenu *menu = new QMenu();
- //If we have configured devices, put them first
- QList< Device * > devices = adapter->devices();
- if (!devices.isEmpty()) {
- Q_FOREACH(Device *device, devices) {
- if (device->UUIDs().contains(QLatin1String("00001105-0000-1000-8000-00805F9B34FB"), Qt::CaseInsensitive)) {
- QAction *action = new QAction(QIcon::fromTheme(device->icon()), device->name(), this);
- connect(action, SIGNAL(triggered(bool)), this, SLOT(deviceTriggered()));
- action->setData(device->UBI());
- menu->addAction(action);
- }
+ const QMapDeviceInfo &devices = m_kded->allDevices().value();
+ Q_FOREACH (const DeviceInfo &device, devices) {
+ if (device[QStringLiteral("UUIDs")].contains(QLatin1String("00001105-0000-1000-8000-00805F9B34FB"))) {
+ QAction *action = new QAction(QIcon::fromTheme(device[QStringLiteral("icon")]), device[QStringLiteral("name")], this);
+ connect(action, SIGNAL(triggered(bool)), this, SLOT(deviceTriggered()));
+ action->setData(device["UBI"]);
+ menu->addAction(action);
}
}
diff --git a/src/fileitemactionplugin/sendfileitemaction.h b/src/fileitemactionplugin/sendfileitemaction.h
index f9eecc3..389fb64 100644
--- a/src/fileitemactionplugin/sendfileitemaction.h
+++ b/src/fileitemactionplugin/sendfileitemaction.h
@@ -24,12 +24,14 @@
#include <KAbstractFileItemActionPlugin>
#include <KFileItemListProperties>
+#include "kded_bluedevil.h"
+
class QAction;
class QWidget;
class SendFileItemAction : public KAbstractFileItemActionPlugin
{
-Q_OBJECT
+ Q_OBJECT
public:
SendFileItemAction(QObject* parent, const QVariantList &args);
virtual QList< QAction* > actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget);
@@ -39,6 +41,7 @@ private Q_SLOTS:
void otherTriggered();
private:
+ org::kde::BlueDevil *m_kded;
KFileItemListProperties m_fileItemInfos;
};
diff --git a/src/fileitemactionplugin/types.h b/src/fileitemactionplugin/types.h
new file mode 100644
index 0000000..53f2e4a
--- /dev/null
+++ b/src/fileitemactionplugin/types.h
@@ -0,0 +1,11 @@
+#ifndef FILEITEMACTIONPLUGINTYPES
+#define FILEITEMACTIONPLUGINTYPES
+
+#include <QMetaType>
+
+typedef QMap<QString, QString> DeviceInfo;
+typedef QMap<QString, DeviceInfo> QMapDeviceInfo;
+Q_DECLARE_METATYPE(DeviceInfo)
+Q_DECLARE_METATYPE(QMapDeviceInfo)
+
+#endif
diff --git a/src/kcmodule/CMakeLists.txt b/src/kcmodule/CMakeLists.txt
index 64e6050..4145c1b 100644
--- a/src/kcmodule/CMakeLists.txt
+++ b/src/kcmodule/CMakeLists.txt
@@ -24,9 +24,9 @@ add_library(kcm_bluedevildevices MODULE ${kcm_bluedevildevices_PART_SRCS})
add_library(kcm_bluedeviladapters MODULE ${kcm_bluedeviladapters_PART_SRCS})
add_library(kcm_bluedeviltransfer MODULE ${kcm_bluedeviltransfer_PART_SRCS} ${kcm_bluedeviltransfer_PART_SRCS_UI})
-kservice_desktop_to_json(kcm_bluedevildevices bluedevildevices.desktop)
-kservice_desktop_to_json(kcm_bluedeviladapters bluedeviladapters.desktop)
-kservice_desktop_to_json(kcm_bluedeviltransfer bluedeviltransfer.desktop)
+kcoreaddons_desktop_to_json(kcm_bluedevildevices bluedevildevices.desktop)
+kcoreaddons_desktop_to_json(kcm_bluedeviladapters bluedeviladapters.desktop)
+kcoreaddons_desktop_to_json(kcm_bluedeviltransfer bluedeviltransfer.desktop)
target_link_libraries(kcm_bluedevildevices
Qt5::Widgets
diff --git a/src/kcmodule/bluedeviladapters.cpp b/src/kcmodule/bluedeviladapters.cpp
index 9185552..64dfce2 100644
--- a/src/kcmodule/bluedeviladapters.cpp
+++ b/src/kcmodule/bluedeviladapters.cpp
@@ -62,8 +62,8 @@ AdapterSettings::AdapterSettings(Adapter *adapter, KCModule *parent)
buttonGroup->addButton(m_alwaysVisible);
buttonGroup->addButton(m_temporaryVisible);
- m_name->setText(adapter->alias());
- m_nameOrig = adapter->alias();
+ m_name->setText(adapter->name());
+ m_nameOrig = adapter->name();
m_hiddenOrig = false;
m_alwaysVisibleOrig = false;
m_temporaryVisibleOrig = false;
@@ -119,9 +119,9 @@ AdapterSettings::AdapterSettings(Adapter *adapter, KCModule *parent)
connect(m_powered, SIGNAL(stateChanged(int)), this, SLOT(slotSettingsChanged()));
if (BlueDevil::Manager::self()->usableAdapter() == adapter) {
- setTitle(i18n("Default adapter: %1 (%2)", adapter->alias(), adapter->address()));
+ setTitle(i18n("Default adapter: %1 (%2)", adapter->name(), adapter->address()));
} else {
- setTitle(i18n("Adapter: %1 (%2)", adapter->alias(), adapter->address()));
+ setTitle(i18n("Adapter: %1 (%2)", adapter->name(), adapter->address()));
}
}
@@ -188,7 +188,7 @@ void AdapterSettings::readChanges()
{
blockSignals(true);
- m_nameOrig = m_adapter->alias();
+ m_nameOrig = m_adapter->name();
m_hiddenOrig = !m_adapter->isDiscoverable();
m_alwaysVisibleOrig = m_adapter->isDiscoverable() && !m_adapter->discoverableTimeout();
m_temporaryVisibleOrig = m_adapter->isDiscoverable() && m_adapter->discoverableTimeout();
@@ -204,9 +204,9 @@ void AdapterSettings::readChanges()
m_discoverTimeLabel->setText(i18np("1 minute", "%1 minutes", m_discoverTime->value()));
if (BlueDevil::Manager::self()->usableAdapter() == m_adapter) {
- setTitle(i18n("Default adapter: %1 (%2)", m_adapter->alias(), m_adapter->address()));
+ setTitle(i18n("Default adapter: %1 (%2)", m_adapter->name(), m_adapter->address()));
} else {
- setTitle(i18n("Adapter: %1 (%2)", m_adapter->alias(), m_adapter->address()));
+ setTitle(i18n("Adapter: %1 (%2)", m_adapter->name(), m_adapter->address()));
}
blockSignals(false);
diff --git a/src/kcmodule/bluedeviladapters.desktop b/src/kcmodule/bluedeviladapters.desktop
index f1f5e50..7a32916 100644
--- a/src/kcmodule/bluedeviladapters.desktop
+++ b/src/kcmodule/bluedeviladapters.desktop
@@ -12,16 +12,25 @@ X-KDE-System-Settings-Parent-Category=bluetooth
X-KDE-Weight=100
Name=Adapters
+Name[bs]=Adapteri
Name[ca]=Adaptadors
Name[cs]=Adaptéry
Name[de]=Adapter
+Name[el]=Προσαρμογείς
Name[en_GB]=Adapters
Name[es]=Adaptadores
Name[fi]=Sovittimet
Name[fr]=Adaptateurs
Name[it]=Adattatori
+Name[ja]=アダプタ
+Name[kk]=Адаптерлері
+Name[km]=អាដាប់ទ័រ
+Name[ko]=어댑터
+Name[lt]=Adapteriai
+Name[mr]=एडाप्टर्स
Name[nb]=Adaptere
Name[nl]=Adapters
+Name[pa]=ਅਡੈਪਟਰ
Name[pl]=Adaptery
Name[pt]=Adaptadores
Name[pt_BR]=Adaptadores
@@ -32,21 +41,27 @@ Name[sr@ijekavian]=Адаптери
Name[sr@ijekavianlatin]=Adapteri
Name[sr@latin]=Adapteri
Name[sv]=Anslutningar
+Name[tr]=Bağdaştırıcılar
Name[uk]=Адаптери
Name[x-test]=xxAdaptersxx
Name[zh_CN]=适配器
+Name[zh_TW]=轉接器
Comment=Configure Bluetooth adapters
+Comment[bs]=Konfigurisanje Blutut adaptera
Comment[ca]=Configura els adaptadors Bluetooth
Comment[cs]=Nastavte adaptéry Bluetooth
Comment[de]=Bluetooth-Adapter einrichten
+Comment[el]=Διαμόρφωση προσαρμογέων Bluetooth
Comment[en_GB]=Configure Bluetooth adapters
Comment[es]=Configurar adaptadores Bluetooth
+Comment[et]=Bluetoothi adapterite seadistamine
Comment[fi]=Bluetooth-sovittimien asetukset
Comment[fr]=Configure les adaptateurs Bluetooth
Comment[it]=Configura gli adattatori Bluetooth
Comment[nb]=Sett opp Blåtann-adaptere
Comment[nl]=Bluetooth-adapters instellen
+Comment[pa]=ਬਲਿਊਟੁੱਥ ਐਡਪਟਰ ਸੰਰਚਨਾ
Comment[pl]=Ustawienia adapterów Bluetooth
Comment[pt]=Configurar os adaptadores de Bluetooth
Comment[pt_BR]=Configura os adaptadores Bluetooth
@@ -57,14 +72,18 @@ Comment[sr@ijekavian]=Подесите блутут адаптере
Comment[sr@ijekavianlatin]=Podesite bluetooth adaptere
Comment[sr@latin]=Podesite bluetooth adaptere
Comment[sv]=Anpassa Blåtandanslutningar
+Comment[tr]=Bluetooth bağdaştırıcılarını yapılandır
Comment[uk]=Налаштування адаптерів Bluetooth
Comment[x-test]=xxConfigure Bluetooth adaptersxx
Comment[zh_CN]=配置蓝牙适配器
+Comment[zh_TW]=設定藍牙轉接器
X-KDE-Keywords=Network,Connectivity,Bluetooth
+X-KDE-Keywords[bs]=Network,Connectivity,Bluetooth
X-KDE-Keywords[ca]=Xarxa,Connectivitat,Bluetooth
X-KDE-Keywords[cs]=Síť,Konektivita,Bluetooth
X-KDE-Keywords[de]=Netzwerk,Verbindungen,Bluetooth
+X-KDE-Keywords[el]=Δίκτυο,Συνδεσιμότητα,Bluetooth
X-KDE-Keywords[en_GB]=Network,Connectivity,Bluetooth
X-KDE-Keywords[es]=Red,Conectividad,Bluetooth
X-KDE-Keywords[fi]=Verkko,Yhteydet,Bluetooth
@@ -72,6 +91,7 @@ X-KDE-Keywords[fr]=Réseau, connectivité, Bluetooth
X-KDE-Keywords[it]=Rete,Connettività,Bluetooth
X-KDE-Keywords[nb]=Nettverk,sammenkobling,blåtann
X-KDE-Keywords[nl]=Netwerkverbinding,connectiviteit,bluetooth
+X-KDE-Keywords[pa]=ਨੈਟਵਰਕ,ਕਨੈਕਟਵਿਟੀ,ਬਲਿਊਟੁੱਥ
X-KDE-Keywords[pl]=Sieć,Łączność,Bluetooth
X-KDE-Keywords[pt]=Rede,Conectividade,Bluetooth
X-KDE-Keywords[pt_BR]=Rede,Conectividade,Bluetooth
@@ -82,8 +102,10 @@ X-KDE-Keywords[sr@ijekavian]=Network,Connectivity,Bluetooth,мрежа,пове
X-KDE-Keywords[sr@ijekavianlatin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sr@latin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sv]=Nätverk,Anslutningar,Blåtand
+X-KDE-Keywords[tr]=Ağ, Bağlanılabilirlik, Bluetooth
X-KDE-Keywords[uk]=Network,Connectivity,Bluetooth,мережа,з’єднання,з'єднання
X-KDE-Keywords[x-test]=xxNetworkxx,xxConnectivityxx,xxBluetoothxx
X-KDE-Keywords[zh_CN]=Network,Connectivity,Bluetooth,网络,连接,蓝牙
+X-KDE-Keywords[zh_TW]=Network,Connectivity,Bluetooth
Categories=Qt;KDE;X-KDE-settings-bluetooth;
diff --git a/src/kcmodule/bluedevildevices.cpp b/src/kcmodule/bluedevildevices.cpp
index 1135d6f..50a92d0 100644
--- a/src/kcmodule/bluedevildevices.cpp
+++ b/src/kcmodule/bluedevildevices.cpp
@@ -518,7 +518,11 @@ void KCMBlueDevilDevices::usableAdapterChanged(Adapter *adapter)
if (adapter) {
connect(adapter, SIGNAL(discoverableChanged(bool)),
this, SLOT(adapterDiscoverableChanged()));
- connect(adapter, SIGNAL(devicesChanged(QList<Device*>)),
+ connect(adapter, SIGNAL(deviceChanged(Device*)),
+ this, SLOT(adapterDevicesChanged()));
+ connect(adapter, SIGNAL(deviceRemoved(Device*)),
+ this, SLOT(adapterDevicesChanged()));
+ connect(adapter, SIGNAL(deviceFound(Device*)),
this, SLOT(adapterDevicesChanged()));
}
fillRemoteDevicesModelInformation();
diff --git a/src/kcmodule/bluedevildevices.desktop b/src/kcmodule/bluedevildevices.desktop
index ecf6b45..38b83f9 100644
--- a/src/kcmodule/bluedevildevices.desktop
+++ b/src/kcmodule/bluedevildevices.desktop
@@ -12,16 +12,27 @@ X-KDE-System-Settings-Parent-Category=bluetooth
X-KDE-Weight=50
Name=Devices
+Name[bs]=uređaji
Name[ca]=Dispositius
Name[cs]=Zařízení
Name[de]=Geräte
+Name[el]=Συσκευές
Name[en_GB]=Devices
Name[es]=Dispositivos
Name[fi]=Laitteet
Name[fr]=Périphériques
Name[it]=Dispositivi
+Name[ja]=デバイス
+Name[kk]=Құрылғылар
+Name[km]=ឧបករណ៍​
+Name[ko]=장치
+Name[lt]=Įrenginiai
+Name[mai]=डिवाइस
+Name[mr]=साधने
+Name[ms]=Peranti
Name[nb]=Enheter
Name[nl]=Apparaten
+Name[pa]=ਯੰਤਰ
Name[pl]=Urządzenia
Name[pt]=Dispositivos
Name[pt_BR]=Dispositivos
@@ -32,19 +43,29 @@ Name[sr@ijekavian]=Уређаји
Name[sr@ijekavianlatin]=Uređaji
Name[sr@latin]=Uređaji
Name[sv]=Enheter
+Name[tr]=Aygıtlar
Name[uk]=Пристрої
Name[x-test]=xxDevicesxx
Name[zh_CN]=设备
+Name[zh_TW]=裝置
Comment=Manage Bluetooth devices
+Comment[bs]=Upravljanje Blutut uređaje
Comment[ca]=Gestiona els dispositius Bluetooth
Comment[cs]=Spravovat zařízení Bluetooth
Comment[de]=Bluetooth-Geräte verwalten
+Comment[el]=Διαχείριση συσκευών Bluetooth
Comment[en_GB]=Manage Bluetooth devices
-Comment[es]=Gestionar los dispositivos Bluetooth
+Comment[es]=Gestión de dispositivos Bluetooth
+Comment[et]=Bluetoothi seadmete haldamine
Comment[fi]=Bluetooth-laitteiden asetukset
Comment[fr]=Gère les périphériques Bluetooth
Comment[it]=Gestisci i dispositivi Bluetooth
+Comment[ja]=Bluetooth デバイスを管理
+Comment[kk]=Bluetooth құрылығыларын басқару
+Comment[ko]=블루투스 장치 관리
+Comment[lt]=Konfigūruoti Bluetooth failų gavimą
+Comment[mr]=ब्लूटूथ साधने व्यवस्थापीत करा
Comment[nb]=Håndter Blåtann-enheter
Comment[nl]=Bluetooth-apparaten beheren
Comment[pl]=Zarządzaj urządzeniami Bluetooth
@@ -57,14 +78,18 @@ Comment[sr@ijekavian]=Управљајте блутут уређајима
Comment[sr@ijekavianlatin]=Upravljajte bluetooth uređajima
Comment[sr@latin]=Upravljajte bluetooth uređajima
Comment[sv]=Hantera Blåtandenheter
+Comment[tr]=Bluetooth aygıtlarını yönet
Comment[uk]=Керування пристроями Bluetooth
Comment[x-test]=xxManage Bluetooth devicesxx
Comment[zh_CN]=管理蓝牙设备
+Comment[zh_TW]=管理藍牙裝置
X-KDE-Keywords=Network,Connectivity,Bluetooth
+X-KDE-Keywords[bs]=Network,Connectivity,Bluetooth
X-KDE-Keywords[ca]=Xarxa,Connectivitat,Bluetooth
X-KDE-Keywords[cs]=Síť,Konektivita,Bluetooth
X-KDE-Keywords[de]=Netzwerk,Verbindungen,Bluetooth
+X-KDE-Keywords[el]=Δίκτυο,Συνδεσιμότητα,Bluetooth
X-KDE-Keywords[en_GB]=Network,Connectivity,Bluetooth
X-KDE-Keywords[es]=Red,Conectividad,Bluetooth
X-KDE-Keywords[fi]=Verkko,Yhteydet,Bluetooth
@@ -72,6 +97,7 @@ X-KDE-Keywords[fr]=Réseau, connectivité, Bluetooth
X-KDE-Keywords[it]=Rete,Connettività,Bluetooth
X-KDE-Keywords[nb]=Nettverk,sammenkobling,blåtann
X-KDE-Keywords[nl]=Netwerkverbinding,connectiviteit,bluetooth
+X-KDE-Keywords[pa]=ਨੈਟਵਰਕ,ਕਨੈਕਟਵਿਟੀ,ਬਲਿਊਟੁੱਥ
X-KDE-Keywords[pl]=Sieć,Łączność,Bluetooth
X-KDE-Keywords[pt]=Rede,Conectividade,Bluetooth
X-KDE-Keywords[pt_BR]=Rede,Conectividade,Bluetooth
@@ -82,8 +108,10 @@ X-KDE-Keywords[sr@ijekavian]=Network,Connectivity,Bluetooth,мрежа,пове
X-KDE-Keywords[sr@ijekavianlatin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sr@latin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sv]=Nätverk,Anslutningar,Blåtand
+X-KDE-Keywords[tr]=Ağ, Bağlanılabilirlik, Bluetooth
X-KDE-Keywords[uk]=Network,Connectivity,Bluetooth,мережа,з’єднання,з'єднання
X-KDE-Keywords[x-test]=xxNetworkxx,xxConnectivityxx,xxBluetoothxx
X-KDE-Keywords[zh_CN]=Network,Connectivity,Bluetooth,网络,连接,蓝牙
+X-KDE-Keywords[zh_TW]=Network,Connectivity,Bluetooth
Categories=Qt;KDE;X-KDE-settings-bluetooth;
diff --git a/src/kcmodule/bluedeviltransfer.desktop b/src/kcmodule/bluedeviltransfer.desktop
index 804b118..5bea142 100644
--- a/src/kcmodule/bluedeviltransfer.desktop
+++ b/src/kcmodule/bluedeviltransfer.desktop
@@ -12,16 +12,20 @@ X-KDE-System-Settings-Parent-Category=bluetooth
X-KDE-Weight=60
Name=File Transfers
+Name[bs]=Transfer datoteke
Name[ca]=Transferències de fitxers
Name[cs]=Přenosy souborů
Name[de]=Dateiübertragungen
+Name[el]=Μεταφορές αρχείων
Name[en_GB]=File Transfers
-Name[es]=Transferencias de archivos
+Name[es]=Transferencias de archivo
+Name[et]=Failiedastused
Name[fi]=Tiedostonsiirto
Name[fr]=Transferts de fichiers
Name[it]=Trasferimenti di file
Name[nb]=Filoverføringer
Name[nl]=Bestandsoverdrachten
+Name[pa]=ਫਾਇਲ ਟਰਾਂਸਫਰ
Name[pl]=Przesyłanie plików
Name[pt]=Transferência de Ficheiros
Name[pt_BR]=Transferência de arquivos
@@ -32,21 +36,27 @@ Name[sr@ijekavian]=Преноси фајлова
Name[sr@ijekavianlatin]=Prenosi fajlova
Name[sr@latin]=Prenosi fajlova
Name[sv]=Filöverföringar
+Name[tr]=Dosya Aktarımı
Name[uk]=Перенесення файла
Name[x-test]=xxFile Transfersxx
Name[zh_CN]=文件传送
+Name[zh_TW]=檔案傳輸
Comment=Configure Bluetooth file sharing and transfers
+Comment[bs]=Konfiguriranje Blutut dijeljenje datoteka i prijenos
Comment[ca]=Configura la compartició i transferència de fitxers per Bluetooth
Comment[cs]=Nastavte sdílení souborů přes Bluetooth
Comment[de]=Dateifreigaben und Dateiübertragung für Bluetooth einrichten
+Comment[el]=Διαμόρφωση διαμοιρασμού και μεταφοράς αρχείων με Bluetooth
Comment[en_GB]=Configure Bluetooth file sharing and transfers
-Comment[es]=Configurar la función de compartir archivos y las transferencias por Bluetooth
+Comment[es]=Configurar compartición y transferencias de archivos por Bluetooth
+Comment[et]=Bluetoothi failide jagamise ja edastamine seadistamine
Comment[fi]=Bluetooth-tiedostonjaon ja -siirron asetukset
Comment[fr]=Configure le partage et les transferts de fichiers par Bluetooth
Comment[it]=Configura la condivisione e il trasferimento di file via Bluetooth
Comment[nb]=Sett opp deling og overføring av filer over Blåtann
Comment[nl]=Bestandsdeling en -overdracht via bluetooth instellen
+Comment[pa]=ਬਲਿਊਟੁੱਥ ਫਾਇਲ ਸਾਂਝ ਤੇ ਟਰਾਂਸਫਰ ਸੰਰਚਨਾ
Comment[pl]=Ustawienia udostępniania i przesyłanie plików przez Bluetooth
Comment[pt]=Configura a partilha e as transferências de ficheiros por Bluetooth
Comment[pt_BR]=Configura o compartilhamento e a transferência de arquivos por Bluetooth
@@ -57,14 +67,18 @@ Comment[sr@ijekavian]=Подесите преносе и дељење фајло
Comment[sr@ijekavianlatin]=Podesite prenose i deljenje fajlova preko Bluetoothom
Comment[sr@latin]=Podesite prenose i deljenje fajlova preko Bluetoothom
Comment[sv]=Anpassa fildelning och överföringar med Blåtand
+Comment[tr]=Bluetooth dosya paylaşımı ve transferlerini yapılandır
Comment[uk]=Налаштування надсилання та отримання файлів Bluetooth
Comment[x-test]=xxConfigure Bluetooth file sharing and transfersxx
Comment[zh_CN]=配置蓝牙文件共享和传输
+Comment[zh_TW]=設定藍牙檔案共用與傳輸
X-KDE-Keywords=Network,Connectivity,Bluetooth
+X-KDE-Keywords[bs]=Network,Connectivity,Bluetooth
X-KDE-Keywords[ca]=Xarxa,Connectivitat,Bluetooth
X-KDE-Keywords[cs]=Síť,Konektivita,Bluetooth
X-KDE-Keywords[de]=Netzwerk,Verbindungen,Bluetooth
+X-KDE-Keywords[el]=Δίκτυο,Συνδεσιμότητα,Bluetooth
X-KDE-Keywords[en_GB]=Network,Connectivity,Bluetooth
X-KDE-Keywords[es]=Red,Conectividad,Bluetooth
X-KDE-Keywords[fi]=Verkko,Yhteydet,Bluetooth
@@ -72,6 +86,7 @@ X-KDE-Keywords[fr]=Réseau, connectivité, Bluetooth
X-KDE-Keywords[it]=Rete,Connettività,Bluetooth
X-KDE-Keywords[nb]=Nettverk,sammenkobling,blåtann
X-KDE-Keywords[nl]=Netwerkverbinding,connectiviteit,bluetooth
+X-KDE-Keywords[pa]=ਨੈਟਵਰਕ,ਕਨੈਕਟਵਿਟੀ,ਬਲਿਊਟੁੱਥ
X-KDE-Keywords[pl]=Sieć,Łączność,Bluetooth
X-KDE-Keywords[pt]=Rede,Conectividade,Bluetooth
X-KDE-Keywords[pt_BR]=Rede,Conectividade,Bluetooth
@@ -82,8 +97,10 @@ X-KDE-Keywords[sr@ijekavian]=Network,Connectivity,Bluetooth,мрежа,пове
X-KDE-Keywords[sr@ijekavianlatin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sr@latin]=Network,Connectivity,Bluetooth,mreža,povezivanje,Bluetooth
X-KDE-Keywords[sv]=Nätverk,Anslutningar,Blåtand
+X-KDE-Keywords[tr]=Ağ, Bağlanılabilirlik, Bluetooth
X-KDE-Keywords[uk]=Network,Connectivity,Bluetooth,мережа,з’єднання,з'єднання
X-KDE-Keywords[x-test]=xxNetworkxx,xxConnectivityxx,xxBluetoothxx
X-KDE-Keywords[zh_CN]=Network,Connectivity,Bluetooth,网络,连接,蓝牙
+X-KDE-Keywords[zh_TW]=Network,Connectivity,Bluetooth
Categories=Qt;KDE;X-KDE-settings-bluetooth;
diff --git a/src/kcmodule/systemcheck.cpp b/src/kcmodule/systemcheck.cpp
index 122021b..43cd864 100644
--- a/src/kcmodule/systemcheck.cpp
+++ b/src/kcmodule/systemcheck.cpp
@@ -41,6 +41,7 @@ SystemCheck::SystemCheck(QWidget *parent)
, m_kded(new KDED(QStringLiteral("org.kde.kded5"), QStringLiteral("/kded"), QDBusConnection::sessionBus()))
, m_parent(parent)
, m_noAdaptersError(0)
+ , m_noUsableAdapterError(0)
, m_notDiscoverableAdapterError(0)
, m_disabledNotificationsError(0)
{
@@ -48,9 +49,6 @@ SystemCheck::SystemCheck(QWidget *parent)
SystemCheck::~SystemCheck()
{
- m_noAdaptersError = 0;
- m_notDiscoverableAdapterError = 0;
- m_disabledNotificationsError = 0;
delete m_kded;
}
@@ -66,6 +64,16 @@ void SystemCheck::createWarnings(QVBoxLayout *layout)
m_noAdaptersError->setText(i18n("No Bluetooth adapters have been found."));
layout->addWidget(m_noAdaptersError);
+ m_noUsableAdapterError = new KMessageWidget(m_parent);
+ m_noUsableAdapterError->setMessageType(KMessageWidget::Warning);
+ m_noUsableAdapterError->setCloseButtonVisible(false);
+ m_noUsableAdapterError->setText(i18n("Your Bluetooth adapter is powered off."));
+
+ QAction *fixNoUsableAdapter = new QAction(QIcon::fromTheme(QStringLiteral("dialog-ok-apply")), i18nc("Action to fix a problem", "Fix it"), m_noUsableAdapterError);
+ connect(fixNoUsableAdapter, SIGNAL(triggered(bool)), this, SLOT(fixNoUsableAdapterError()));
+ m_noUsableAdapterError->addAction(fixNoUsableAdapter);
+ layout->addWidget(m_noUsableAdapterError);
+
m_notDiscoverableAdapterError = new KMessageWidget(m_parent);
m_notDiscoverableAdapterError->setMessageType(KMessageWidget::Warning);
m_notDiscoverableAdapterError->setCloseButtonVisible(false);
@@ -142,6 +150,7 @@ void SystemCheck::updateInformationState()
{
m_noAdaptersError->setEnabled(true);
m_noAdaptersError->setVisible(false);
+ m_noUsableAdapterError->setVisible(false);
m_notDiscoverableAdapterError->setVisible(false);
m_disabledNotificationsError->setVisible(false);
m_noKDEDRunning->setVisible(false);
@@ -151,9 +160,14 @@ void SystemCheck::updateInformationState()
return;
}
+ if (BlueDevil::Manager::self()->adapters().isEmpty()) {
+ m_noAdaptersError->setVisible(true);
+ return;
+ }
+
BlueDevil::Adapter *const usableAdapter = BlueDevil::Manager::self()->usableAdapter();
if (!usableAdapter) {
- m_noAdaptersError->setVisible(true);
+ m_noUsableAdapterError->setVisible(true);
return;
}
if (!usableAdapter->isDiscoverable()) {
@@ -176,6 +190,12 @@ void SystemCheck::fixNoKDEDRunning()
m_kded->loadModule(QStringLiteral("bluedevil"));
}
+void SystemCheck::fixNoUsableAdapterError()
+{
+ m_noUsableAdapterError->setVisible(false);
+ BlueDevil::Manager::self()->adapters().first()->setPowered(true);
+}
+
void SystemCheck::fixNotDiscoverableAdapterError()
{
m_notDiscoverableAdapterError->setVisible(false);
diff --git a/src/kcmodule/systemcheck.h b/src/kcmodule/systemcheck.h
index 74f9128..cccf899 100644
--- a/src/kcmodule/systemcheck.h
+++ b/src/kcmodule/systemcheck.h
@@ -36,17 +36,6 @@ public:
SystemCheck(QWidget *parent);
virtual ~SystemCheck();
- struct SystemCheckResult {
- enum Result {
- NoWarnings = 0,
- BluetoothDisabled,
- NoAdapters,
- NotificationsDisabled,
- DefaultAdapterHidden
- } result;
- QWidget *warningWidget;
- };
-
void createWarnings(QVBoxLayout *layout);
bool checkKDEDModuleLoaded();
@@ -61,6 +50,7 @@ public Q_SLOTS:
private Q_SLOTS:
void fixNoKDEDRunning();
+ void fixNoUsableAdapterError();
void fixNotDiscoverableAdapterError();
void fixDisabledNotificationsError();
@@ -68,6 +58,7 @@ private:
KDED *m_kded;
QWidget *m_parent;
KMessageWidget *m_noAdaptersError;
+ KMessageWidget *m_noUsableAdapterError;
KMessageWidget *m_noKDEDRunning;
KMessageWidget *m_notDiscoverableAdapterError;
KMessageWidget *m_disabledNotificationsError;
diff --git a/src/kio/bluetooth/kded_bluedevil.xml b/src/kio/bluetooth/kded_bluedevil.xml
index cb4d6fd..e447897 100644
--- a/src/kio/bluetooth/kded_bluedevil.xml
+++ b/src/kio/bluetooth/kded_bluedevil.xml
@@ -5,11 +5,19 @@
<method name="isOnline">
<arg type="b" direction="out"/>
</method>
- <method name="knownDevices">
+ <method name="allDevices">
<arg type="aa{ss}" direction="out"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QMapDeviceInfo"/>
</method>
+ <method name="device">
+ <arg name="address" type="s" direction="in"/>
+ <arg type="a{ss}" direction="out"/>
+ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="DeviceInfo"/>
+ </method>
+ <method name="startDiscovering">
+ <arg name="timeout" type="u" direction="in"/>
+ </method>
<method name="stopDiscovering">
</method>
</interface>
-</node>
\ No newline at end of file
+</node>
diff --git a/src/kio/bluetooth/kiobluetooth.cpp b/src/kio/bluetooth/kiobluetooth.cpp
index e7b1289..6f9c700 100644
--- a/src/kio/bluetooth/kiobluetooth.cpp
+++ b/src/kio/bluetooth/kiobluetooth.cpp
@@ -30,10 +30,6 @@
#include <KProcess>
#include <KLocalizedString>
-#include <bluedevil/bluedevil.h>
-
-using namespace BlueDevil;
-
extern "C" int Q_DECL_EXPORT kdemain(int argc, char **argv)
{
QCoreApplication app(argc, argv);
@@ -62,21 +58,22 @@ KioBluetooth::KioBluetooth(const QByteArray &pool, const QByteArray &app)
s.mimetype = QStringLiteral("application/vnd.kde.bluedevil-sendfile");
s.uuid = QStringLiteral("00001105-0000-1000-8000-00805F9B34FB");
m_supportedServices.insert(QStringLiteral("00001105-0000-1000-8000-00805F9B34FB"), s);
+
s.name = i18n("Browse Files");
s.icon = QStringLiteral("edit-find");
s.mimetype = QString();
s.uuid = QStringLiteral("00001106-0000-1000-8000-00805F9B34FB");
m_supportedServices.insert(QStringLiteral("00001106-0000-1000-8000-00805F9B34FB"), s);
- if (!Manager::self()->usableAdapter()) {
- qCDebug(BLUETOOTH) << "No available interface";
- infoMessage(i18n("No Bluetooth adapters have been found."));
- return;
- }
-
qCDebug(BLUETOOTH) << "Kio Bluetooth instanced!";
m_kded = new org::kde::BlueDevil(QStringLiteral("org.kde.kded5"), QStringLiteral("/modules/bluedevil"),
QDBusConnection::sessionBus(), 0);
+
+ if (!m_kded->isOnline()) {
+ qCDebug(BLUETOOTH) << "Bluetooth is offline";
+ infoMessage(i18n("No Bluetooth adapters have been found."));
+ return;
+ }
}
QList<KioBluetooth::Service> KioBluetooth::getSupportedServices(const QStringList &uuids)
@@ -93,14 +90,22 @@ QList<KioBluetooth::Service> KioBluetooth::getSupportedServices(const QStringLis
void KioBluetooth::listRemoteDeviceServices()
{
- m_kded->stopDiscovering();
infoMessage(i18n("Retrieving services..."));
qCDebug(BLUETOOTH) << "Listing remote devices";
- m_currentHost = Manager::self()->usableAdapter()->deviceForAddress(m_currentHostname.replace('-', ':').toUpper());
- m_currentHostServices = getSupportedServices(m_currentHost->UUIDs());
+
+ const DeviceInfo &info = m_kded->device(m_currentHostAddress).value();
+ if (info.isEmpty()) {
+ qCDebug(BLUETOOTH) << "Invalid hostname!";
+ infoMessage(i18n("This address is unavailable."));
+ finished();
+ return;
+ }
+
+ m_currentHostServices = getSupportedServices(info.value(QStringLiteral("UUIDs")).split(QLatin1Char(',')));
qCDebug(BLUETOOTH) << "Num of supported services: " << m_currentHostServices.size();
+
totalSize(m_currentHostServices.count());
int i = 1;
Q_FOREACH (const Service &service, m_currentHostServices) {
@@ -137,11 +142,15 @@ void KioBluetooth::listRemoteDeviceServices()
void KioBluetooth::listDevices()
{
qCDebug(BLUETOOTH) << "Asking kded for devices";
- QMapDeviceInfo devices = m_kded->knownDevices().value();
+ const QMapDeviceInfo &devices = m_kded->allDevices().value();
qCDebug(BLUETOOTH) << devices.keys();
+
Q_FOREACH(const DeviceInfo device, devices) {
listDevice(device);
}
+
+ m_kded->startDiscovering(10 * 1000);
+
infoMessage(i18n("Scanning for new devices..."));
finished();
}
@@ -207,24 +216,25 @@ void KioBluetooth::get(const QUrl &url)
finished();
}
-void KioBluetooth::setHost(const QString &constHostname, quint16 port, const QString &user,
+void KioBluetooth::setHost(const QString &hostname, quint16 port, const QString &user,
const QString &pass)
{
- qCDebug(BLUETOOTH) << "Setting host: " << constHostname;
+ qCDebug(BLUETOOTH) << "Setting host: " << hostname;
// In this kio only the hostname (constHostname) is used
Q_UNUSED(port)
Q_UNUSED(user)
Q_UNUSED(pass)
- QString hostname = constHostname;
- hostname = hostname.replace(QLatin1Char('-'), QLatin1Char(':')).toUpper();
if (hostname.isEmpty()) {
m_hasCurrentHost = false;
} else {
m_hasCurrentHost = true;
- m_currentHostname = constHostname;
m_currentHostServices.clear();
+
+ m_currentHostname = hostname;
+ m_currentHostAddress = hostname.toUpper();
+ m_currentHostAddress.replace(QLatin1Char('-'), QLatin1Char(':'));
}
}
diff --git a/src/kio/bluetooth/kiobluetooth.h b/src/kio/bluetooth/kiobluetooth.h
index a353ca9..294835a 100644
--- a/src/kio/bluetooth/kiobluetooth.h
+++ b/src/kio/bluetooth/kiobluetooth.h
@@ -36,13 +36,6 @@
*/
class KioBluetoothPrivate;
-namespace BlueDevil {
- class Device;
- class Adapter;
-}
-
-using namespace BlueDevil;
-
class KioBluetooth : public QObject, public KIO::SlaveBase
{
Q_OBJECT
@@ -81,7 +74,7 @@ public:
* difference with @p listDir
*
*/
- void setHost(const QString &constHostname, quint16 port, const QString &user, const QString &pass);
+ void setHost(const QString &hostname, quint16 port, const QString &user, const QString &pass);
/**
* Returns a list of supported service names corresponding to the given uuids list. If an uuid is
@@ -120,10 +113,9 @@ private:
QString m_currentHostname;
/**
- * Represents the current host when @p hasCurrentHost is set to true. This is set in
- * @p listRemoteDeviceServices function.
+ * Uppercase colon separated address (ex. 00:2A:5E:8E:6E:F5)
*/
- Device *m_currentHost;
+ QString m_currentHostAddress;
/**
* When @p hasCurrentHost to true, this list holds the list of service names provided by the
@@ -133,12 +125,6 @@ private:
/**
* This is an array containing as key the uuid and as value the name of the service that the
- * given uuid represents.
- */
- QMap<QString, QString> m_serviceNames;
-
- /**
- * This is an array containing as key the uuid and as value the name of the service that the
* given uuid represents, and a representative icon. It only contains the supported service names.
*/
QMap<QString, Service> m_supportedServices;
diff --git a/src/kio/obexftp/daemon/CMakeLists.txt b/src/kio/obexftp/daemon/CMakeLists.txt
index b7ad5d2..8a4ff87 100644
--- a/src/kio/obexftp/daemon/CMakeLists.txt
+++ b/src/kio/obexftp/daemon/CMakeLists.txt
@@ -12,7 +12,7 @@ qt5_add_dbus_interface(kded_obexftp_SRCS org.freedesktop.DBus.ObjectManager.xml
add_library(kded_obexftpdaemon MODULE ${kded_obexftp_SRCS})
-kservice_desktop_to_json(kded_obexftpdaemon obexftpdaemon.desktop)
+kcoreaddons_desktop_to_json(kded_obexftpdaemon obexftpdaemon.desktop)
target_link_libraries(kded_obexftpdaemon
Qt5::Core
diff --git a/src/kio/obexftp/daemon/ObexFtpDaemon.cpp b/src/kio/obexftp/daemon/ObexFtpDaemon.cpp
index af66c7c..4170193 100644
--- a/src/kio/obexftp/daemon/ObexFtpDaemon.cpp
+++ b/src/kio/obexftp/daemon/ObexFtpDaemon.cpp
@@ -29,10 +29,6 @@
#include <KPluginFactory>
#include <KLocalizedString>
-#include <bluedevil/bluedevilmanager.h>
-#include <bluedevil/bluedeviladapter.h>
-
-using namespace BlueDevil;
K_PLUGIN_FACTORY_WITH_JSON(ObexFtpFactory,
"obexftpdaemon.json",
registerPlugin<ObexFtpDaemon>();)
@@ -58,8 +54,6 @@ ObexFtpDaemon::ObexFtpDaemon(QObject *parent, const QList<QVariant>&)
qDBusRegisterMetaType<DBusManagerStruct>();
qDBusRegisterMetaType<QVariantMapMap>();
- d->m_status = Private::Offline;
-
KAboutData aboutData(QStringLiteral("obexftpdaemon"),
i18n("ObexFtp Daemon"),
bluedevil_version,
@@ -70,13 +64,10 @@ ObexFtpDaemon::ObexFtpDaemon(QObject *parent, const QList<QVariant>&)
aboutData.addAuthor(i18n("Alejandro Fiestas Olivares"), i18n("Maintainer"),
QStringLiteral("afiestas@kde.org"), QStringLiteral("http://www.afiestas.org"));
- connect(Manager::self(), SIGNAL(usableAdapterChanged(Adapter*)),
- SLOT(usableAdapterChanged(Adapter*)));
-
+ d->m_status = Private::Offline;
d->m_interface = new OrgFreedesktopDBusObjectManagerInterface(QStringLiteral("org.bluez.obex"),
QStringLiteral("/"),
QDBusConnection::sessionBus(), this);
-
connect(d->m_interface, SIGNAL(InterfacesRemoved(QDBusObjectPath,QStringList)),
SLOT(interfaceRemoved(QDBusObjectPath,QStringList)));
@@ -84,11 +75,13 @@ ObexFtpDaemon::ObexFtpDaemon(QObject *parent, const QList<QVariant>&)
QDBusConnection::sessionBus(),
QDBusServiceWatcher::WatchForUnregistration, this);
- connect(d->m_serviceWatcher, SIGNAL(serviceUnregistered(QString)), SLOT(serviceUnregistered(QString)));
+ connect(d->m_serviceWatcher, SIGNAL(serviceRegistered(QString)), SLOT(serviceRegistered()));
+ connect(d->m_serviceWatcher, SIGNAL(serviceUnregistered(QString)), SLOT(serviceUnregistered()));
- //WARNING this blocks if org.bluez in system bus is dead
- if (Manager::self()->usableAdapter()) {
+ if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.bluez.obex"))) {
onlineMode();
+ } else {
+ offlineMode();
}
}
@@ -114,6 +107,7 @@ void ObexFtpDaemon::onlineMode()
void ObexFtpDaemon::offlineMode()
{
qCDebug(OBEXDAEMON) << "Offline mode";
+
if (d->m_status == Private::Offline) {
qCDebug(OBEXDAEMON) << "Already in offlineMode";
return;
@@ -125,33 +119,28 @@ void ObexFtpDaemon::offlineMode()
d->m_status = Private::Offline;
}
-void ObexFtpDaemon::usableAdapterChanged(Adapter *adapter)
+bool ObexFtpDaemon::isOnline()
{
- if (!adapter) {
- offlineMode();
- return;
- }
-
- onlineMode();
+ return d->m_status == Private::Online;
}
-QString ObexFtpDaemon::session(QString address, const QDBusMessage& msg)
+QString ObexFtpDaemon::session(const QString &address, const QString &target, const QDBusMessage& msg)
{
- qCDebug(OBEXDAEMON) << address;
- address.replace(QLatin1Char('-'), QLatin1Char(':'));
-
if (d->m_sessionMap.contains(address)) {
return d->m_sessionMap[address];
}
- //At this point we always want delayed reply
+ qCDebug(OBEXDAEMON) << "Creating session for" << address << "target" << target;
+
+ // At this point we always want delayed reply
msg.setDelayedReply(true);
+
if (d->m_wipSessions.contains(address)) {
d->m_wipSessions[address]->addMessage(msg);
return QString();
}
- CreateSessionJob *job = new CreateSessionJob(address, msg);
+ CreateSessionJob *job = new CreateSessionJob(address, target, msg);
connect(job, SIGNAL(finished(KJob*)), SLOT(sessionCreated(KJob*)));
job->start();
@@ -159,30 +148,46 @@ QString ObexFtpDaemon::session(QString address, const QDBusMessage& msg)
return QString();
}
+bool ObexFtpDaemon::cancelTransfer(const QString &transfer)
+{
+ // We need this function because kio_obexftp is not owner of the transfer,
+ // and thus cannot cancel it.
+
+ QDBusMessage call = QDBusMessage::createMethodCall(QStringLiteral("org.bluez.obex"),
+ transfer,
+ QStringLiteral("org.bluez.obex.Transfer1"),
+ QStringLiteral("Cancel"));
+
+ QDBusReply<void> reply = QDBusConnection::sessionBus().call(call);
+ return reply.isValid();
+}
+
void ObexFtpDaemon::sessionCreated(KJob* job)
{
CreateSessionJob* cJob = qobject_cast<CreateSessionJob*>(job);
qCDebug(OBEXDAEMON) << cJob->path();
d->m_wipSessions.remove(cJob->address());
- d->m_sessionMap.insert(cJob->address(), cJob->path());
- d->m_reverseSessionMap.insert(cJob->path(), cJob->address());
- const QList<QDBusMessage> messages = cJob->messages();
- Q_FOREACH(const QDBusMessage &msg, messages) {
+ Q_FOREACH (const QDBusMessage &msg, cJob->messages()) {
QDBusMessage reply = msg.createReply(cJob->path());
- QDBusConnection::sessionBus().asyncCall(reply);
+ QDBusConnection::sessionBus().send(reply);
+ }
+
+ if (!cJob->error()) {
+ d->m_sessionMap.insert(cJob->address(), cJob->path());
+ d->m_reverseSessionMap.insert(cJob->path(), cJob->address());
}
}
-void ObexFtpDaemon::serviceUnregistered(const QString& service)
+void ObexFtpDaemon::serviceRegistered()
{
- if (service != QLatin1String("org.bluez.obex")) {
- return;
- }
+ onlineMode();
+}
- d->m_sessionMap.clear();
- d->m_reverseSessionMap.clear();
+void ObexFtpDaemon::serviceUnregistered()
+{
+ offlineMode();
}
void ObexFtpDaemon::interfaceRemoved(const QDBusObjectPath &dbusPath, const QStringList& interfaces)
diff --git a/src/kio/obexftp/daemon/ObexFtpDaemon.h b/src/kio/obexftp/daemon/ObexFtpDaemon.h
index d56b73d..28c34ab 100644
--- a/src/kio/obexftp/daemon/ObexFtpDaemon.h
+++ b/src/kio/obexftp/daemon/ObexFtpDaemon.h
@@ -30,44 +30,28 @@ class QDBusMessage;
class QDBusObjectPath;
class QDBusPendingCallWatcher;
-namespace BlueDevil {
- class Adapter;
-};
-using namespace BlueDevil;
-
-class Q_DECL_EXPORT ObexFtpDaemon
- : public KDEDModule
+class Q_DECL_EXPORT ObexFtpDaemon : public KDEDModule
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.ObexFtp")
public:
- /**
- * Connects to usableAdapterChanged
- */
ObexFtpDaemon(QObject *parent, const QList<QVariant>&);
virtual ~ObexFtpDaemon();
public Q_SLOTS:
- Q_SCRIPTABLE QString session(QString address, const QDBusMessage &msg);
+ Q_SCRIPTABLE bool isOnline();
+ Q_SCRIPTABLE QString session(const QString &address, const QString &target, const QDBusMessage &msg);
+ Q_SCRIPTABLE bool cancelTransfer(const QString &transfer);
private Q_SLOTS:
- void usableAdapterChanged(Adapter* adapter);
void sessionCreated(KJob* job);
- void serviceUnregistered(const QString &service);
+ void serviceRegistered();
+ void serviceUnregistered();
void interfaceRemoved(const QDBusObjectPath &path, const QStringList &interfaces);
private:
- /**
- * Called by constructor or eventually by adapterAdded initialize all the helpers
- * @see helpers
- */
- void onlineMode();
-
- /**
- * Called eventually adapterRemoved shutdown all the helpers
- * @see helpers
- */
+ void onlineMode();
void offlineMode();
struct Private;
diff --git a/src/kio/obexftp/daemon/createsessionjob.cpp b/src/kio/obexftp/daemon/createsessionjob.cpp
index 2eba356..c019156 100644
--- a/src/kio/obexftp/daemon/createsessionjob.cpp
+++ b/src/kio/obexftp/daemon/createsessionjob.cpp
@@ -24,9 +24,10 @@
#include <QDebug>
// class
-CreateSessionJob::CreateSessionJob(const QString& address, const QDBusMessage& msg, QObject* parent)
+CreateSessionJob::CreateSessionJob(const QString &address, const QString &target, const QDBusMessage &msg, QObject *parent)
: KJob(parent)
, m_address(address)
+ , m_target(target)
, m_client(0)
{
m_messages.append(msg);
@@ -52,7 +53,7 @@ void CreateSessionJob::addMessage(const QDBusMessage& msg)
m_messages.append(msg);
}
-const QList< QDBusMessage > CreateSessionJob::messages() const
+const QList<QDBusMessage> CreateSessionJob::messages() const
{
return m_messages;
}
@@ -61,8 +62,7 @@ void CreateSessionJob::createSession()
{
qCDebug(OBEXDAEMON);
QVariantMap args;
- args[QStringLiteral("Target")] = QStringLiteral("ftp");
-// args["Source"] = "00:02:72:D6:8F:2C";
+ args[QStringLiteral("Target")] = m_target;
m_client = new OrgBluezObexClient1Interface(QStringLiteral("org.bluez.obex"),
QStringLiteral("/org/bluez/obex"),
QDBusConnection::sessionBus(), this);
@@ -70,7 +70,6 @@ void CreateSessionJob::createSession()
QDBusPendingReply <QDBusObjectPath > reply = m_client->CreateSession(m_address, args);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply);
- qCDebug(OBEXDAEMON) << "DROGUES";
connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(sessionCreated(QDBusPendingCallWatcher*)));
}
@@ -83,12 +82,7 @@ void CreateSessionJob::sessionCreated(QDBusPendingCallWatcher* watcher)
qCDebug(OBEXDAEMON) << "Error:";
qCDebug(OBEXDAEMON) << reply.error().name();
qCDebug(OBEXDAEMON) << reply.error().message();
-// Q_FOREACH(const QDBusMessage &msg, m_msgs) {
-// qCDebug(OBEXDAEMON) << msg.service() << msg.path();
-// QDBusMessage errorMsg = msg.createErrorReply("org.kde.kded.Error", i18n("Can't stablish connection"));
-// QDBusConnection::sessionBus().send(errorMsg);
-// }C
-// m_status = Error;
+
setError(reply.error().type());
setErrorText(reply.error().message());
emitResult();
diff --git a/src/kio/obexftp/daemon/createsessionjob.h b/src/kio/obexftp/daemon/createsessionjob.h
index a457b02..667384b 100644
--- a/src/kio/obexftp/daemon/createsessionjob.h
+++ b/src/kio/obexftp/daemon/createsessionjob.h
@@ -29,7 +29,7 @@ class CreateSessionJob : public KJob
{
Q_OBJECT
public:
- explicit CreateSessionJob(const QString &address, const QDBusMessage &msg, QObject* parent = 0);
+ explicit CreateSessionJob(const QString &address, const QString &target, const QDBusMessage &msg, QObject *parent = 0);
virtual void start();
QString path();
@@ -44,9 +44,10 @@ private Q_SLOTS:
private:
QString m_path;
QString m_address;
+ QString m_target;
QList<QDBusMessage> m_messages;
OrgBluezObexClient1Interface* m_client;
};
-#endif //CREATE_SESSION_JOB_H
\ No newline at end of file
+#endif //CREATE_SESSION_JOB_H
diff --git a/src/kio/obexftp/daemon/obexftpdaemon.desktop b/src/kio/obexftp/daemon/obexftpdaemon.desktop
index 07b7b2e..b23a6d1 100644
--- a/src/kio/obexftp/daemon/obexftpdaemon.desktop
+++ b/src/kio/obexftp/daemon/obexftpdaemon.desktop
@@ -9,16 +9,20 @@ X-KDE-Kded-load-on-demand=true
X-KDE-Kded-phase=1
Name=Bluetooth File Transfer
+Name[bs]=Transfer Bluetooth Daoteke
Name[ca]=Transferència de fitxer per Bluetooth
Name[cs]=Přenos souborů Bluetooth
Name[de]=Bluetooth-Dateiübertragung
+Name[el]=Μεταφορά αρχείων με Bluetooth
Name[en_GB]=Bluetooth File Transfer
-Name[es]=Transferencia de archivos por Bluetooth
+Name[es]=Transferencia de archivo por Bluetooth
+Name[et]=Bluetoothi failiedastus
Name[fi]=Bluetooth-tiedostonsiirto
Name[fr]=Transfert de fichiers Bluetooth
Name[it]=Trasferimento file via Bluetooth
Name[nb]=Blåtann filoverføring
Name[nl]=Bestandsoverdracht via bluetooth
+Name[pa]=ਬਲਿਊਟੁੱਥ ਫਾਇਲ ਟਰਾਂਸਫਰ
Name[pl]=Przesyłanie plików Bluetooth
Name[pt]=Transferência de Ficheiros por Bluetooth
Name[pt_BR]=Transferência de arquivos por Bluetooth
@@ -29,16 +33,21 @@ Name[sr@ijekavian]=Блутут пренос фајла
Name[sr@ijekavianlatin]=Bluetooth prenos fajla
Name[sr@latin]=Bluetooth prenos fajla
Name[sv]=Filöverföring med Blåtand
+Name[tr]=Bluetooth Dosya Aktarımı
Name[uk]=Перенесення файла за допомогою Bluetooth
Name[x-test]=xxBluetooth File Transferxx
Name[zh_CN]=蓝牙文件传输
+Name[zh_TW]=藍牙檔案傳輸
Comment=Supports Bluetooth file transfer using ObexFTP
+Comment[bs]=Podržava Blutut prijenos datoteka koristeći ObexFTP
Comment[ca]=Accepta transferència de fitxer per Bluetooth usant ObexFTP
Comment[cs]=Podporuje přenos souborů Bluetooth použitím ObexFTP
Comment[de]=Unterstützt Bluetooth-Datenübertragung mittels ObexFTP
+Comment[el]=Υποστηρίζει μεταφορά αρχείων με Bluetooth με χρήση ObexFTP
Comment[en_GB]=Supports Bluetooth file transfer using ObexFTP
-Comment[es]=Permite la transferencia de archivos por Bluetooth usando ObexFTP
+Comment[es]=Permite transferencias de archivos por Bluetooth usando ObexFTP
+Comment[et]=Bluetoothi failiedastuse toetamine ObexFTP vahendusel
Comment[fi]=Tukee Bluetooth-tiedostonsiirtoa ObexFTP:tä käyttäen
Comment[fr]=Prend en charge le transfert de fichiers Bluetooth à l'aide de « ObexFTP »
Comment[it]=Supporta i trasferimenti di file Bluetooth usando ObexFTP
@@ -54,6 +63,8 @@ Comment[sr@ijekavian]=Подршка за блутут преносе фајло
Comment[sr@ijekavianlatin]=Podrška za bluetooth prenose fajlova pomoću ObexFTPa
Comment[sr@latin]=Podrška za bluetooth prenose fajlova pomoću ObexFTPa
Comment[sv]=Stöder filöverföringar för Blåtand med ObexFTP
+Comment[tr]=ObexFTP kullanarak Bluetooth dosya transferlerini destekler
Comment[uk]=Підтримує перенесення файлів Bluetooth за допомогою ObexFTP
Comment[x-test]=xxSupports Bluetooth file transfer using ObexFTPxx
Comment[zh_CN]=支持使用 ObexFTP 进行蓝牙文件传输
+Comment[zh_TW]=使用 ObexFTP 支援藍牙檔案傳輸
diff --git a/src/kio/obexftp/kded_obexftp.xml b/src/kio/obexftp/kded_obexftp.xml
index 24c6c5c..06e3b14 100644
--- a/src/kio/obexftp/kded_obexftp.xml
+++ b/src/kio/obexftp/kded_obexftp.xml
@@ -3,9 +3,17 @@
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.kde.ObexFtp">
+ <method name="isOnline">
+ <arg name="online" type="b" direction="out"/>
+ </method>
<method name="session">
<arg name="address" type="s" direction="in"/>
+ <arg name="target" type="s" direction="in"/>
<arg name="sessionPath" type="s" direction="out"/>
</method>
+ <method name="cancelTransfer">
+ <arg name="transfer" type="s" direction="in"/>
+ <arg name="success" type="b" direction="out"/>
+ </method>
</interface>
-</node>
\ No newline at end of file
+</node>
diff --git a/src/kio/obexftp/kio_obexftp.cpp b/src/kio/obexftp/kio_obexftp.cpp
index b5b93d8..17eefec 100644
--- a/src/kio/obexftp/kio_obexftp.cpp
+++ b/src/kio/obexftp/kio_obexftp.cpp
@@ -61,16 +61,21 @@ static QString urlFileName(const QUrl &url)
return u.fileName();
}
+static bool urlIsRoot(const QUrl &url)
+{
+ const QString &directory = urlDirectory(url);
+ return (directory.isEmpty() || directory == QLatin1String("/")) && urlFileName(url).isEmpty();
+}
+
KioFtp::KioFtp(const QByteArray &pool, const QByteArray &app)
: SlaveBase(QByteArrayLiteral("obexftp"), pool, app)
- , m_settingHost(false)
, m_transfer(0)
{
- qDBusRegisterMetaType<QVariantMapList>();
-
m_timer = new QTimer();
m_timer->setInterval(100);
+ qDBusRegisterMetaType<DeviceInfo>();
+ qDBusRegisterMetaType<QVariantMapList>();
m_kded = new org::kde::ObexFtp(QStringLiteral("org.kde.kded5"), QStringLiteral("/modules/obexftpdaemon"),
QDBusConnection::sessionBus(), 0);
}
@@ -88,6 +93,63 @@ void KioFtp::launchProgressBar()
m_timer->start();
}
+void KioFtp::connectToHost()
+{
+ // Prefer pcsuite target on S60 devices
+ if (m_uuids.contains(QLatin1String("00005005-0000-1000-8000-0002EE000001"))) {
+ if (createSession("pcsuite")) {
+ return;
+ }
+ // Fallback to ftp
+ }
+
+ createSession("ftp");
+}
+
+bool KioFtp::testConnection()
+{
+ if (!m_kded->isOnline().value()) {
+ error(KIO::ERR_SLAVE_DEFINED, i18n("Obexd service is not running."));
+ return false;
+ }
+
+ connectToHost();
+
+ if (!m_transfer) {
+ error(KIO::ERR_COULD_NOT_CONNECT, m_host);
+ return false;
+ }
+ return true;
+}
+
+bool KioFtp::createSession(const QString &target)
+{
+ QDBusPendingReply<QString> reply = m_kded->session(m_host, target);
+ reply.waitForFinished();
+
+ const QString &sessionPath = reply.value();
+
+ if (reply.isError() || sessionPath.isEmpty()) {
+ qCDebug(OBEXFTP) << reply.error().message();
+ qCDebug(OBEXFTP) << reply.error().name();
+
+ delete m_transfer;
+ m_transfer = 0;
+ m_sessionPath.clear();
+ return false;
+ }
+
+ if (m_sessionPath != sessionPath) {
+ m_statMap.clear();
+ delete m_transfer;
+ m_transfer = new org::bluez::obex::FileTransfer1(QStringLiteral("org.bluez.obex"), sessionPath, QDBusConnection::sessionBus());
+ m_sessionPath = sessionPath;
+ }
+
+ return true;
+}
+
+
void KioFtp::updateProcess()
{
if (m_counter == 49) {
@@ -102,34 +164,27 @@ void KioFtp::updateProcess()
void KioFtp::listDir(const QUrl &url)
{
+ if (!testConnection()) {
+ return;
+ }
+
qCDebug(OBEXFTP) << "listdir: " << url;
infoMessage(i18n("Retrieving information from remote device..."));
- qCDebug(OBEXFTP) << "Asking for listFolder";
-
- //TODO: Check if changeFolder fails
- m_transfer->ChangeFolder(url.path()).waitForFinished();
+ qCDebug(OBEXFTP) << "Asking for listFolder" << url.path();
- QDBusPendingReply <QVariantMapList > reply = m_transfer->ListFolder();
- reply.waitForFinished();
-
- if (reply.isError()) {
- qCDebug(OBEXFTP) << reply.error().message();
- error(KIO::ERR_SLAVE_DEFINED, i18n("Bluetooth is not enabled"));
+ if (!changeFolder(url.path())) {
return;
}
- QVariantMapList folderList = reply.value();
- Q_FOREACH(const QVariantMap folder, folderList) {
- KIO::UDSEntry entry = entryFromInfo(folder);
- QUrl statUrl = url.adjusted(QUrl::RemoveFilename);
- statUrl.setPath(statUrl.path() + folder[QStringLiteral("Name")].toString());
- if (!m_statMap.contains(statUrl.toDisplayString())) {
- qCDebug(OBEXFTP) << "Stat: " << statUrl.toDisplayString() << entry.numberValue(KIO::UDSEntry::UDS_SIZE);
- m_statMap.insert(statUrl.toDisplayString(), entry);
- }
+ bool ok;
+ const QList<KIO::UDSEntry> &list = listFolder(url, &ok);
+ if (!ok) {
+ return;
+ }
+ Q_FOREACH (const KIO::UDSEntry &entry, list) {
listEntry(entry);
}
@@ -141,10 +196,13 @@ void KioFtp::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFl
Q_UNUSED(permissions)
Q_UNUSED(flags)
+ if (!testConnection()) {
+ return;
+ }
+
qCDebug(OBEXFTP) << "copy: " << src.url() << " to " << dest.url();
copyHelper(src, dest);
-
finished();
}
@@ -154,11 +212,15 @@ void KioFtp::rename(const QUrl& src, const QUrl& dest, KIO::JobFlags flags)
Q_UNUSED(dest)
Q_UNUSED(flags)
- error(KIO::ERR_UNSUPPORTED_ACTION, src.toDisplayString());
+ error(KIO::ERR_UNSUPPORTED_ACTION, QString());
}
void KioFtp::get(const QUrl& url)
{
+ if (!testConnection()) {
+ return;
+ }
+
QTemporaryFile tempFile(QString(QStringLiteral("%1/kioftp_XXXXXX.%2")).arg(QDir::tempPath(), urlFileName(url)));
tempFile.open();//Create the file
qCDebug(OBEXFTP) << tempFile.fileName();
@@ -180,6 +242,10 @@ void KioFtp::get(const QUrl& url)
finished();
}
+bool KioFtp::cancelTransfer(const QString &transfer)
+{
+ return m_kded->cancelTransfer(transfer);
+}
void KioFtp::setHost(const QString &host, quint16 port, const QString &user, const QString &pass)
{
@@ -187,35 +253,38 @@ void KioFtp::setHost(const QString &host, quint16 port, const QString &user, con
Q_UNUSED(user)
Q_UNUSED(pass)
- infoMessage(i18n("Connecting to the device"));
+ m_host = host;
+ m_host = m_host.replace(QLatin1Char('-'), QLatin1Char(':')).toUpper();
- qCDebug(OBEXFTP) << "setHost: " << host;
+ QDBusMessage call = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kded5"),
+ QStringLiteral("/modules/bluedevil"),
+ QStringLiteral("org.kde.BlueDevil"),
+ QStringLiteral("device"));
+ call << m_host;
+ QDBusReply<DeviceInfo> reply = QDBusConnection::sessionBus().call(call);
+ DeviceInfo info = reply.value();
- qCDebug(OBEXFTP) << "Waiting to stablish the connection 2";
- QDBusPendingReply <QString > reply = m_kded->session(host);
- reply.waitForFinished();
+ m_uuids = info[QStringLiteral("UUIDs")];
- qCDebug(OBEXFTP) << "AFTER" << reply.isError();
- if (reply.isError()) {
- qCDebug(OBEXFTP) << reply.error().message();
- qCDebug(OBEXFTP) << reply.error().name();
- }
-
- qCDebug(OBEXFTP) << "Got a path" << reply.value();
+ infoMessage(i18n("Connecting to the device"));
- m_address = host;
- m_sessionPath = reply.value();
- m_transfer = new org::bluez::obex::FileTransfer1("org.bluez.obex", m_sessionPath, QDBusConnection::sessionBus());
- m_statMap.clear();
+ connectToHost();
}
void KioFtp::del(const QUrl& url, bool isfile)
{
Q_UNUSED(isfile)
- qCDebug(OBEXFTP) << "Del: " << url.url();
- m_transfer->ChangeFolder(urlDirectory(url)).waitForFinished();
- m_transfer->Delete(urlFileName(url)).waitForFinished();
+ if (!testConnection()) {
+ return;
+ }
+ if (!changeFolder(urlDirectory(url))) {
+ return;
+ }
+ if (!deleteFile(urlFileName(url))) {
+ return;
+ }
+
finished();
}
@@ -223,14 +292,28 @@ void KioFtp::mkdir(const QUrl& url, int permissions)
{
Q_UNUSED(permissions)
+ if (!testConnection()) {
+ return;
+ }
+
qCDebug(OBEXFTP) << "MkDir: " << url.url();
- m_transfer->ChangeFolder(urlDirectory(url)).waitForFinished();
- m_transfer->CreateFolder(urlFileName(url)).waitForFinished();
+
+ if (!changeFolder(urlDirectory(url))) {
+ return;
+ }
+ if (!createFolder(urlFileName(url))) {
+ return;
+ }
+
finished();
}
void KioFtp::stat(const QUrl &url)
{
+ if (!testConnection()) {
+ return;
+ }
+
qCDebug(OBEXFTP) << "Stat: " << url.url();
qCDebug(OBEXFTP) << "Stat Dir: " << urlDirectory(url);
qCDebug(OBEXFTP) << "Stat File: " << urlFileName(url);
@@ -245,8 +328,7 @@ void KioFtp::stat(const QUrl &url)
void KioFtp::copyHelper(const QUrl& src, const QUrl& dest)
{
if (src.scheme() == QLatin1String("obexftp") && dest.scheme() == QLatin1String("obexftp")) {
- error(KIO::ERR_UNSUPPORTED_ACTION, src.toDisplayString());
- //TODO: with obexd this seems possible, we should at least try
+ copyWithinObexftp(src, dest);
return;
}
@@ -261,55 +343,49 @@ void KioFtp::copyHelper(const QUrl& src, const QUrl& dest)
}
qCDebug(OBEXFTP) << "This shouldn't happen...";
- finished();
}
-void KioFtp::copyFromObexftp(const QUrl& src, const QUrl& dest)
+void KioFtp::copyWithinObexftp(const QUrl &src, const QUrl &dest)
{
qCDebug(OBEXFTP) << "Source: " << src << "Dest:" << dest;
- //Just in case the url is not in the stat, some times happens...
- if (!m_statMap.contains(src.toDisplayString())) {
- qCDebug(OBEXFTP) << "The url is not in the cache, stating it";
- statHelper(src);
- }
+ copyFile(src.path(), dest.path());
+}
+
+void KioFtp::copyFromObexftp(const QUrl& src, const QUrl& dest)
+{
+ qCDebug(OBEXFTP) << "Source: " << src << "Dest:" << dest;
- if (m_statMap.value(src.toDisplayString()).isDir()) {
- qCDebug(OBEXFTP) << "Skipping to copy: " << src.toDisplayString();
- //TODO: Check if dir copying works with obexd
- error(KIO::ERR_IS_DIRECTORY, src.toDisplayString());
+ if (!changeFolder(urlDirectory(src))) {
return;
}
- qCDebug(OBEXFTP) << "Changing dir:" << urlDirectory(src);
- m_transfer->ChangeFolder(urlDirectory(src)).waitForFinished();
-
- QString dbusPath = m_transfer->GetFile(dest.path(), urlFileName(src)).value().path();
+ const QString &dbusPath = m_transfer->GetFile(dest.path(), urlFileName(src)).value().path();
qCDebug(OBEXFTP) << "Path from GetFile:" << dbusPath;
int size = m_statMap[src.toDisplayString()].numberValue(KIO::UDSEntry::UDS_SIZE);
+ totalSize(size);
+
TransferFileJob *getFile = new TransferFileJob(dbusPath, this);
- getFile->setSize(size);
getFile->exec();
-
- finished();
}
void KioFtp::copyToObexftp(const QUrl& src, const QUrl& dest)
{
qCDebug(OBEXFTP) << "Source:" << src << "Dest:" << dest;
- qCDebug(OBEXFTP) << "Changing folder: " << urlDirectory(dest);
- m_transfer->ChangeFolder(urlDirectory(dest));
- QString dbusPath = m_transfer->PutFile(src.path(), urlFileName(dest)).value().path();
+ if (!changeFolder(urlDirectory(dest))) {
+ return;
+ }
+
+ const QString &dbusPath = m_transfer->PutFile(src.path(), urlFileName(dest)).value().path();
qCDebug(OBEXFTP) << "Path from PutFile: " << dbusPath;
- QFile file(src.path());
+ int size = QFile(src.path()).size();
+ totalSize(size);
+
TransferFileJob *putFile = new TransferFileJob(dbusPath, this);
- putFile->setSize(file.size());
putFile->exec();
-
- finished();
}
void KioFtp::statHelper(const QUrl& url)
@@ -322,10 +398,10 @@ void KioFtp::statHelper(const QUrl& url)
return;
}
- if ((urlDirectory(url) == QLatin1String("/") || urlDirectory(url).isEmpty()) && urlFileName(url).isEmpty()) {
+ if (urlIsRoot(url)) {
qCDebug(OBEXFTP) << "Url is root";
KIO::UDSEntry entry;
- entry.insert(KIO::UDSEntry::UDS_NAME, QString::fromLatin1("/"));
+ entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("/"));
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700);
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
@@ -333,53 +409,145 @@ void KioFtp::statHelper(const QUrl& url)
qCDebug(OBEXFTP) << "Adding stat cached: " << url.toDisplayString();
m_statMap[url.toDisplayString()] = entry;
statEntry(entry);
-
return;
}
qCDebug(OBEXFTP) << "statMap does NOT contains the url";
- //TODO: Check if changeFolder fails
- m_transfer->ChangeFolder(urlDirectory(url)).waitForFinished();
- QVariantMapList folderList = m_transfer->ListFolder().value();
- qCDebug(OBEXFTP) << urlDirectory(url) << folderList.count();
- Q_FOREACH(const QVariantMap folder, folderList) {
- KIO::UDSEntry entry = entryFromInfo(folder);
-
- QString fileName = folder[QStringLiteral("Name")].toString();
- if (urlFileName(url) == fileName) {
- statEntry(entry);
+
+ if (!changeFolder(urlDirectory(url))) {
+ return;
+ }
+
+ bool ok;
+ const QList<KIO::UDSEntry> &list = listFolder(url, &ok);
+ if (!ok) {
+ return;
+ }
+
+ Q_FOREACH (const KIO::UDSEntry &entry, list) {
+ statEntry(entry);
+ }
+
+ qCDebug(OBEXFTP) << "Finished";
+}
+
+QList<KIO::UDSEntry> KioFtp::listFolder(const QUrl &url, bool *ok)
+{
+ QList<KIO::UDSEntry> list;
+
+ QDBusPendingReply<QVariantMapList> reply = m_transfer->ListFolder();
+ reply.waitForFinished();
+
+ if (reply.isError()) {
+ error(KIO::ERR_CANNOT_OPEN_FOR_READING, urlDirectory(url));
+ *ok = false;
+ return list;
+ }
+
+ Q_FOREACH (const QVariantMap &item, reply.value()) {
+ KIO::UDSEntry entry;
+ entry.insert(KIO::UDSEntry::UDS_NAME, item[QStringLiteral("Name")].toString());
+ entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, item[QStringLiteral("Label")].toString());
+ entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700);
+ entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, QDateTime::fromString(item[QStringLiteral("Modified")].toString(), "yyyyMMddThhmmssZ").toTime_t());
+ entry.insert(KIO::UDSEntry::UDS_SIZE, item[QStringLiteral("Size")].toLongLong());
+ if (item[QStringLiteral("Type")] == QLatin1String("folder")) {
+ entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+ entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
+ } else {
+ entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
+ }
+ if (urlIsRoot(url)) {
+ updateRootEntryIcon(entry, item[QStringLiteral("Mem-type")].toString());
}
+ list.append(entry);
//Most probably the client of the kio will stat each file
//so since we are on it, let's cache all of them.
QUrl statUrl = url.adjusted(QUrl::RemoveFilename);
- statUrl.setPath(statUrl.path() + fileName);
+ statUrl.setPath(statUrl.path() + item[QStringLiteral("Name")].toString());
if (!m_statMap.contains(statUrl.toDisplayString())) {
qCDebug(OBEXFTP) << "Stat: " << statUrl.toDisplayString() << entry.stringValue(KIO::UDSEntry::UDS_NAME) << entry.numberValue(KIO::UDSEntry::UDS_SIZE);
m_statMap.insert(statUrl.toDisplayString(), entry);
}
}
- qCDebug(OBEXFTP) << "Finished";
+ *ok = true;
+ return list;
}
-KIO::UDSEntry KioFtp::entryFromInfo(const QVariantMap& info)
+bool KioFtp::changeFolder(const QString &folder)
{
- qCDebug(OBEXFTP) << info;
+ QDBusPendingReply<> reply = m_transfer->ChangeFolder(folder);
+ reply.waitForFinished();
+
+ if (reply.isError()) {
+ error(KIO::ERR_CANNOT_ENTER_DIRECTORY, folder);
+ return false;
+ }
+ return true;
+}
- KIO::UDSEntry entry;
- entry.insert(KIO::UDSEntry::UDS_NAME, info[QStringLiteral("Name")].toString());
- entry.insert(KIO::UDSEntry::UDS_CREATION_TIME, info[QStringLiteral("Created")].toString());
- entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700);
- entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, info[QStringLiteral("Modified")].toString());
+bool KioFtp::createFolder(const QString &folder)
+{
+ QDBusPendingReply<> reply = m_transfer->CreateFolder(folder);
+ reply.waitForFinished();
- if (info[QStringLiteral("Type")].toString() == QLatin1String("folder")) {
- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
- entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("inode/directory"));
- } else {
- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
- entry.insert(KIO::UDSEntry::UDS_SIZE, info[QStringLiteral("Size")].toLongLong());
+ if (reply.isError()) {
+ error(KIO::ERR_COULD_NOT_MKDIR, folder);
+ return false;
}
+ return true;
+}
- return entry;
+bool KioFtp::copyFile(const QString &src, const QString &dest)
+{
+ QDBusPendingReply<> reply = m_transfer->CopyFile(src, dest);
+ reply.waitForFinished();
+
+ if (reply.isError()) {
+ qCDebug(OBEXFTP) << reply.error().message();
+ // Copying files within obexftp is currently not implemented in obexd
+ if (reply.error().message() == QLatin1String("Not Implemented")) {
+ error(KIO::ERR_UNSUPPORTED_ACTION, src);
+ } else {
+ error(KIO::ERR_COULD_NOT_WRITE, src);
+ }
+ return false;
+ }
+ return true;
+}
+
+bool KioFtp::deleteFile(const QString &file)
+{
+ QDBusPendingReply<> reply = m_transfer->Delete(file);
+ reply.waitForFinished();
+
+ if (reply.isError()) {
+ error(KIO::ERR_CANNOT_DELETE, file);
+ return false;
+ }
+ return true;
+}
+
+void KioFtp::updateRootEntryIcon(KIO::UDSEntry &entry, const QString &memoryType)
+{
+ const QString &path = entry.stringValue(KIO::UDSEntry::UDS_NAME);
+
+ // Nokia (mount-points are C: D: E: ...)
+ if (path.size() == 2 && path.at(1) == QLatin1Char(':')) {
+ if (memoryType.startsWith(QLatin1String("DEV"))) {
+ entry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("drive-removable-media"));
+ } else if (memoryType == QLatin1String("MMC")) {
+ entry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("media-flash-sd-mmc"));
+ }
+ }
+ // Android
+ if (entry.stringValue(KIO::UDSEntry::UDS_NAME) == QLatin1String("PHONE_MEMORY")) {
+ entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18n("Phone memory"));
+ entry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("smartphone"));
+ } else if (entry.stringValue(KIO::UDSEntry::UDS_NAME) == QLatin1String("EXTERNAL_MEMORY")) {
+ entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18n("External memory"));
+ entry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("media-flash-sd-mmc"));
+ }
}
diff --git a/src/kio/obexftp/kio_obexftp.h b/src/kio/obexftp/kio_obexftp.h
index 3215fda..eefda10 100644
--- a/src/kio/obexftp/kio_obexftp.h
+++ b/src/kio/obexftp/kio_obexftp.h
@@ -29,6 +29,8 @@
#include <kio/slavebase.h>
+typedef QMap<QString, QString> DeviceInfo;
+
class OrgBluezObexFileTransfer1Interface;
class KioFtp
: public QObject
@@ -49,26 +51,39 @@ public:
virtual void rename(const QUrl& src, const QUrl& dest, KIO::JobFlags flags);
virtual void get(const QUrl& url);
+ bool cancelTransfer(const QString &transfer);
+
private Q_SLOTS:
void updateProcess();
- KIO::UDSEntry entryFromInfo(const QVariantMap &info);
+private:
void copyHelper(const QUrl &src, const QUrl &dest);
+ void copyWithinObexftp(const QUrl &src, const QUrl &dest);
void copyFromObexftp(const QUrl &src, const QUrl &dest);
void copyToObexftp(const QUrl &src, const QUrl &dest);
void statHelper(const QUrl &url);
+
+ QList<KIO::UDSEntry> listFolder(const QUrl &url, bool *ok);
+ bool changeFolder(const QString &folder);
+ bool createFolder(const QString &folder);
+ bool copyFile(const QString &src, const QString &dest);
+ bool deleteFile(const QString &file);
+
+ void updateRootEntryIcon(KIO::UDSEntry &entry, const QString &memoryType);
void launchProgressBar();
+ void connectToHost();
+ bool testConnection();
+ bool createSession(const QString &target);
private:
- int m_counter;
- bool m_settingHost;
+ int m_counter;
QMap<QString, KIO::UDSEntry> m_statMap;
- QString m_address;
- QString m_sessionPath;
- QTimer *m_timer;
- org::kde::ObexFtp *m_kded;
+ QString m_host;
+ QString m_uuids;
+ QString m_sessionPath;
+ QTimer *m_timer;
+ org::kde::ObexFtp *m_kded;
OrgBluezObexFileTransfer1Interface *m_transfer;
-
};
#endif // KIO_OBEXFTP_H
diff --git a/src/kio/obexftp/transferfilejob.cpp b/src/kio/obexftp/transferfilejob.cpp
index b6267e3..9a06534 100644
--- a/src/kio/obexftp/transferfilejob.cpp
+++ b/src/kio/obexftp/transferfilejob.cpp
@@ -35,7 +35,6 @@ TransferFileJob::TransferFileJob(const QString& path, KioFtp* parent)
, m_speedBytes(0)
, m_parent(parent)
{
-
}
TransferFileJob::~TransferFileJob()
@@ -51,16 +50,7 @@ void TransferFileJob::start()
bool TransferFileJob::doKill()
{
- QDBusPendingReply <void > reply = m_transfer->Cancel();
- reply.waitForFinished();
-
- return !reply.isError();
-}
-
-void TransferFileJob::setSize(int size)
-{
- qCDebug(OBEXFTP) << size;
- m_parent->totalSize(size);
+ return m_parent->cancelTransfer(m_path);
}
void TransferFileJob::createObjects()
@@ -98,7 +88,6 @@ void TransferFileJob::statusChanged(const QVariant& value)
m_time = QTime::currentTime();
return;
} else if (status == QLatin1String("complete")) {
- m_parent->finished();
emitResult();
return;
} else if (status == QLatin1String("error")) {
@@ -115,7 +104,7 @@ void TransferFileJob::transferChanged(const QVariant& value)
qCDebug(OBEXFTP) << "Transferred: " << value;
if (m_parent->wasKilled()) {
qCDebug(OBEXFTP) << "Kio was killed, aborting task";
- m_transfer->Cancel().waitForFinished();
+ doKill();
emitResult();
return;
}
diff --git a/src/kio/obexftp/transferfilejob.h b/src/kio/obexftp/transferfilejob.h
index d82cd30..d594359 100644
--- a/src/kio/obexftp/transferfilejob.h
+++ b/src/kio/obexftp/transferfilejob.h
@@ -39,7 +39,6 @@ public:
virtual ~TransferFileJob();
- void setSize(int size);
private Q_SLOTS:
void createObjects();
void propertiesChanged(const QString &interface , const QVariantMap &properties , const QStringList &invalidProps);
@@ -56,4 +55,4 @@ private:
};
-#endif //KIO_GET_FILE_JOB_H
\ No newline at end of file
+#endif //KIO_GET_FILE_JOB_H
diff --git a/src/monolithic/bluedevil-monolithic.desktop b/src/monolithic/bluedevil-monolithic.desktop
index 3911e87..f69c51d 100644
--- a/src/monolithic/bluedevil-monolithic.desktop
+++ b/src/monolithic/bluedevil-monolithic.desktop
@@ -2,14 +2,22 @@
Type=Application
Version=1.0
Name=BlueDevil
+Name[bs]=BlueDevil
Name[ca]=BlueDevil
Name[cs]=BlueDevil
Name[de]=BlueDevil
+Name[el]=BlueDevil
Name[en_GB]=BlueDevil
Name[es]=BlueDevil
Name[fi]=BlueDevil
Name[fr]=BlueDevil
Name[it]=BlueDevil
+Name[ja]=BlueDevil
+Name[kk]=BlueDevil
+Name[km]=BlueDevil
+Name[ko]=BlueDevil
+Name[lt]=BlueDevil
+Name[mr]=ब्लु-डेव्हिल
Name[nb]=BlueDevil
Name[nl]=BlueDevil
Name[pl]=BlueDevil
@@ -22,20 +30,31 @@ Name[sr@ijekavian]=Блудевил
Name[sr@ijekavianlatin]=BlueDevil
Name[sr@latin]=BlueDevil
Name[sv]=Blådjävul
+Name[tr]=BlueDevil
Name[uk]=BlueDevil
Name[x-test]=xxBlueDevilxx
Name[zh_CN]=BlueDevil
+Name[zh_TW]=BlueDevil
GenericName=BlueDevil
+GenericName[bs]=BlueDevil
GenericName[ca]=BlueDevil
GenericName[cs]=BlueDevil
GenericName[de]=BlueDevil
+GenericName[el]=BlueDevil
GenericName[en_GB]=BlueDevil
GenericName[es]=BlueDevil
GenericName[fi]=BlueDevil
GenericName[fr]=BlueDevil
GenericName[it]=BlueDevil
+GenericName[ja]=BlueDevil
+GenericName[kk]=BlueDevil
+GenericName[km]=BlueDevil
+GenericName[ko]=BlueDevil
+GenericName[lt]=BlueDevil
+GenericName[mr]=ब्लु-डेव्हिल
GenericName[nb]=BlueDevil
GenericName[nl]=BlueDevil
+GenericName[pa]=BlueDevil
GenericName[pl]=BlueDevil
GenericName[pt]=BlueDevil
GenericName[pt_BR]=BlueDevil
@@ -46,21 +65,32 @@ GenericName[sr@ijekavian]=Блудевил
GenericName[sr@ijekavianlatin]=BlueDevil
GenericName[sr@latin]=BlueDevil
GenericName[sv]=Blådjävul
+GenericName[tr]=BlueDevil
GenericName[uk]=BlueDevil
GenericName[x-test]=xxBlueDevilxx
GenericName[zh_CN]=BlueDevil
+GenericName[zh_TW]=BlueDevil
Exec=bluedevil-monolithic
Comment=KDE Bluetooth support
+Comment[bs]=Podrška blututa u KDEu
Comment[ca]=Implementació Bluetooth del KDE
Comment[cs]=Podpora Bluetooth v KDE
Comment[de]=KDE-Bluetooth-Unterstützung
+Comment[el]=Υποστήριξη Bluetooth στο KDE
Comment[en_GB]=KDE Bluetooth support
Comment[es]=Implementación Bluetooth para KDE
Comment[fi]=KDE:n Bluetooth-tuki
Comment[fr]=Prise en charge de Bluetooth pour KDE
Comment[it]=Supporto Bluetooth per KDE
+Comment[ja]=KDE Bluetooth サポート
+Comment[kk]=KDE Bluetooth қолдауы
+Comment[km]=គាំទ្រ​ប៊្លូធូស​របស់​ KDE
+Comment[ko]=KDE 블루투스 지원
+Comment[lt]=KDE Bluetooth palaikymas
+Comment[mr]=केडीई ब्लूटूथ समर्थन
Comment[nb]=KDE Blåtann-støtte
Comment[nl]=KDE Bluetooth ondersteuning
+Comment[pa]=KDE ਬਲਿਊਟੁੱਥ ਸਹਿਯੋਗ
Comment[pl]=Obsługa Bluetooth w KDE
Comment[pt]=Suporte para Bluetooth no KDE
Comment[pt_BR]=Suporte para Bluetooth do KDE
@@ -71,9 +101,11 @@ Comment[sr@ijekavian]=Подршка блутута у КДЕ‑у
Comment[sr@ijekavianlatin]=Podrška Bluetootha u KDEu
Comment[sr@latin]=Podrška Bluetootha u KDEu
Comment[sv]=KDE:s Blåtandstöd
+Comment[tr]=KDE Bluetooth desteği
Comment[uk]=Підтримка Bluetooth у KDE
Comment[x-test]=xxKDE Bluetooth supportxx
Comment[zh_CN]=KDE 蓝牙支持
+Comment[zh_TW]=KDE 藍牙支援
Icon=preferences-system-bluetooth
Terminal=false
Categories=Qt;KDE;X-Bluetooth;Network;
diff --git a/src/monolithic/monolithic.cpp b/src/monolithic/monolithic.cpp
index 5480752..fb6a23c 100644
--- a/src/monolithic/monolithic.cpp
+++ b/src/monolithic/monolithic.cpp
@@ -47,7 +47,7 @@ Monolithic::Monolithic(QObject* parent)
offlineMode();
- if (!Manager::self()->adapters().isEmpty()) {
+ if (Manager::self()->usableAdapter()) {
onlineMode();
}
@@ -58,7 +58,6 @@ Monolithic::Monolithic(QObject* parent)
setStandardActionsEnabled(false);
setAssociatedWidget(contextMenu());
- setStatus(KStatusNotifierItem::Active);
poweredChanged();
}
@@ -175,9 +174,11 @@ void Monolithic::regenerateDeviceEntries()
//Shortcut configuration actions, mainly checkables for discovering and powering
menu->addSeparator();
+ Adapter *usableAdapter = Manager::self()->usableAdapter();
+
QAction *discoverable = new QAction(i18n("Discoverable"), menu);
discoverable->setCheckable(true);
- discoverable->setChecked(Manager::self()->usableAdapter()->isDiscoverable());
+ discoverable->setChecked(usableAdapter && usableAdapter->isDiscoverable());
connect(discoverable, SIGNAL(toggled(bool)), this, SLOT(activeDiscoverable(bool)));
menu->addAction(discoverable);
@@ -219,6 +220,8 @@ void Monolithic::setupDevice(Device *device)
void Monolithic::onlineMode()
{
+ setStatus(Active);
+
QList<Adapter*> adapters = Manager::self()->adapters();
Q_FOREACH(Adapter *adapter, adapters) {
connect(adapter, SIGNAL(deviceFound(Device*)), SLOT(deviceCreated(Device*)));
@@ -350,6 +353,7 @@ void Monolithic::deviceCreated(Device *device)
void Monolithic::offlineMode()
{
+ setStatus(Passive);
setTooltipTitleStatus(false);
QMenu *const menu = contextMenu();
diff --git a/src/sendfile/bluedevil-sendfile.desktop b/src/sendfile/bluedevil-sendfile.desktop
index 4e7169e..d1cbd29 100644
--- a/src/sendfile/bluedevil-sendfile.desktop
+++ b/src/sendfile/bluedevil-sendfile.desktop
@@ -2,9 +2,11 @@
Type=Application
Version=1.0
Name=BlueDevil Send File
+Name[bs]=Bludevilovo slanje datoteke
Name[ca]=Envia fitxer amb BlueDevil
Name[cs]=Posílání souborů BlueDevil
Name[de]=BlueDevil-Dateiversand
+Name[el]=Αποστολή αρχείου μέσω BlueDevil
Name[en_GB]=BlueDevil Send File
Name[es]=Enviar archivo con BlueDevil
Name[fi]=BlueDevil-tiedostonlähetys
@@ -22,13 +24,17 @@ Name[sr@ijekavian]=Блудевилово слање фајла
Name[sr@ijekavianlatin]=BlueDevilovo slanje fajla
Name[sr@latin]=BlueDevilovo slanje fajla
Name[sv]=Blådjävul skicka fil
+Name[tr]=BlueDevil Dosya Gönder
Name[uk]=Надсилання файла BlueDevil
Name[x-test]=xxBlueDevil Send Filexx
Name[zh_CN]=BlueDevil 发送文件
+Name[zh_TW]=BlueDevil 傳送檔案
GenericName=BlueDevil Send File
+GenericName[bs]=Bludevilovo slanje datoteke
GenericName[ca]=Envia fitxers amb BlueDevil
GenericName[cs]=Posílání souborů BlueDevil
GenericName[de]=BlueDevil-Dateiversand
+GenericName[el]=Αποστολή αρχείου μέσω BlueDevil
GenericName[en_GB]=BlueDevil Send File
GenericName[es]=Enviar archivo con BlueDevil
GenericName[fi]=BlueDevil-tiedostonlähetys
@@ -46,15 +52,19 @@ GenericName[sr@ijekavian]=Блудевилово слање фајла
GenericName[sr@ijekavianlatin]=BlueDevilovo slanje fajla
GenericName[sr@latin]=BlueDevilovo slanje fajla
GenericName[sv]=Blådjävul skicka fil
+GenericName[tr]=BlueDevil Dosya Gönder
GenericName[uk]=Надсилання файла BlueDevil
GenericName[x-test]=xxBlueDevil Send Filexx
GenericName[zh_CN]=BlueDevil 发送文件
+GenericName[zh_TW]=BlueDevil 傳送檔案
MimeType=application/vnd.kde.bluedevil-sendfile;
Exec=bluedevil-sendfile -k%U
Comment=BlueDevil Send File
+Comment[bs]=Bludevilovo slanje datoteke
Comment[ca]=Envia fitxers amb BlueDevil
Comment[cs]=Posílání souborů BlueDevil
Comment[de]=BlueDevil-Dateiversand
+Comment[el]=Αποστολή αρχείου μέσω BlueDevil
Comment[en_GB]=BlueDevil Send File
Comment[es]=Enviar archivo con BlueDevil
Comment[fi]=BlueDevil-tiedostonlähetys
@@ -72,9 +82,11 @@ Comment[sr@ijekavian]=Блудевилово слање фајла
Comment[sr@ijekavianlatin]=BlueDevilovo slanje fajla
Comment[sr@latin]=BlueDevilovo slanje fajla
Comment[sv]=Blådjävul skicka fil
+Comment[tr]=BlueDevil Dosya Gönder
Comment[uk]=Надсилання файла BlueDevil
Comment[x-test]=xxBlueDevil Send Filexx
Comment[zh_CN]=BlueDevil 发送文件
+Comment[zh_TW]=BlueDevil 傳送檔案
Icon=preferences-system-bluetooth
Terminal=false
Categories=Qt;KDE;X-Bluetooth;Network;
diff --git a/src/settings/filereceiver.kcfg b/src/settings/filereceiver.kcfg
index 5740f9a..a2e6521 100644
--- a/src/settings/filereceiver.kcfg
+++ b/src/settings/filereceiver.kcfg
@@ -3,14 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
- <!-- Includes -->
<kcfgfile name="bluedevilreceiverrc"/>
- <include>QFile</include>
- <include>QDir</include>
- <include>QStandardPaths</include>
- <include>KIO/Global</include>
-<!-- File Receiving -->
+ <!-- File Receiving -->
<group name="General">
<entry name="enabled" type="bool" key="enabled">
<label>Enable or disable receiving files</label>
@@ -18,7 +13,7 @@ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
</entry>
<entry name="saveUrl" type="Url" key="saveUrl">
<label>Save received files to:</label>
- <default code="true">QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation))</default>
+ <default code="true">QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation))</default>
</entry>
<entry name="autoAccept" type="int" key="autoAccept">
<label>Whether allow to modify shared files</label>
diff --git a/src/wizard/CMakeLists.txt b/src/wizard/CMakeLists.txt
index d615f3d..491612e 100644
--- a/src/wizard/CMakeLists.txt
+++ b/src/wizard/CMakeLists.txt
@@ -11,6 +11,7 @@ set(wizard_SRCS
pages/keyboardpairing.cpp
pages/ssppairing.cpp
pages/fail.cpp
+ pages/success.cpp
)
ki18n_wrap_ui(wizard_SRCS
@@ -20,6 +21,7 @@ ki18n_wrap_ui(wizard_SRCS
pages/keyboardpairing.ui
pages/ssppairing.ui
pages/fail.ui
+ pages/success.ui
)
add_executable(bluedevil-wizard ${wizard_SRCS})
diff --git a/src/wizard/bluedevil-wizard.desktop b/src/wizard/bluedevil-wizard.desktop
index c349f89..0779901 100644
--- a/src/wizard/bluedevil-wizard.desktop
+++ b/src/wizard/bluedevil-wizard.desktop
@@ -2,16 +2,25 @@
Type=Application
Version=1.0
Name=BlueDevil Wizard
+Name[bs]=Bludevilov čarobnjak
Name[ca]=Assistent del BlueDevil
Name[cs]=Průvodce Bluedevil
Name[de]=BlueDevil-Assistent
+Name[el]=Οδηγός BlueDevil
Name[en_GB]=BlueDevil Wizard
Name[es]=Asistente de BlueDevil
Name[fi]=Opastettu BlueDevil-toiminto
Name[fr]=Assistant pour BlueDevil
Name[it]=Procedura guidata di BlueDevil
+Name[ja]=BlueDevil ウィザード
+Name[kk]=BlueDevil шебері
+Name[km]=អ្នក​ជំនួយការ BlueDevil
+Name[ko]=BlueDevil 마법사
+Name[lt]=BlueDevil vedlys
+Name[mr]=ब्लु-डेव्हिल विझार्ड
Name[nb]=BlueDevil veiviser
Name[nl]=BlueDevil assistent
+Name[pa]=BlueDevil ਸਹਾਇਕ
Name[pl]=Pomocnik BlueDevil
Name[pt]=Assistente BlueDevil
Name[pt_BR]=Assistente BlueDevil
@@ -22,20 +31,31 @@ Name[sr@ijekavian]=Блудевилов чаробњак
Name[sr@ijekavianlatin]=BlueDevilov čarobnjak
Name[sr@latin]=BlueDevilov čarobnjak
Name[sv]=Blådjävul guide
+Name[tr]=BlueDevil Sihirbazı
Name[uk]=Майстер BlueDevil
Name[x-test]=xxBlueDevil Wizardxx
Name[zh_CN]=BlueDevil 向导
+Name[zh_TW]=BlueDevil 精靈
GenericName=BlueDevil Wizard
+GenericName[bs]=Bludevilov čarobnjak
GenericName[ca]=Assistent del BlueDevil
GenericName[cs]=Průvodce Bluedevil
GenericName[de]=BlueDevil-Assistent
+GenericName[el]=Οδηγός BlueDevil
GenericName[en_GB]=BlueDevil Wizard
GenericName[es]=Asistente de BlueDevil
GenericName[fi]=Opastettu BlueDevil-toiminto
GenericName[fr]=Assistant pour BlueDevil
GenericName[it]=Procedura guidata di BlueDevil
+GenericName[ja]=BlueDevil ウィザード
+GenericName[kk]=BlueDevil шебері
+GenericName[km]=អ្នកជំនួយការ​ BlueDevil
+GenericName[ko]=BlueDevil 마법사
+GenericName[lt]=BlueDevil vedlys
+GenericName[mr]=ब्लु-डेव्हिल विझार्ड
GenericName[nb]=BlueDevil veiviser
GenericName[nl]=BlueDevil assistent
+GenericName[pa]=BlueDevil ਸਹਾਇਕ
GenericName[pl]=Pomocnik BlueDevil
GenericName[pt]=Assistente BlueDevil
GenericName[pt_BR]=Assistente BlueDevil
@@ -46,21 +66,32 @@ GenericName[sr@ijekavian]=Блудевилов чаробњак
GenericName[sr@ijekavianlatin]=BlueDevilov čarobnjak
GenericName[sr@latin]=BlueDevilov čarobnjak
GenericName[sv]=Blådjävul guide
+GenericName[tr]=BlueDevil Sihirbazı
GenericName[uk]=Майстер BlueDevil
GenericName[x-test]=xxBlueDevil Wizardxx
GenericName[zh_CN]=BlueDevil 向导
+GenericName[zh_TW]=BlueDevil 精靈
Exec=bluedevil-wizard %U
Comment=BlueDevil Wizard
+Comment[bs]=Bludevilov čarobnjak
Comment[ca]=Assistent del BlueDevil
Comment[cs]=BlueDevil
Comment[de]=BlueDevil-Assistent
+Comment[el]=Οδηγός BlueDevil
Comment[en_GB]=BlueDevil Wizard
Comment[es]=Asistente de BlueDevil
Comment[fi]=Opastettu BlueDevil-toiminto
Comment[fr]=Assistant pour BlueDevil
Comment[it]=Procedura guidata di BlueDevil
+Comment[ja]=BlueDevil ウィザード
+Comment[kk]=BlueDevil шебері
+Comment[km]=អ្នក​ជំនួយការ​ BlueDevil
+Comment[ko]=BlueDevil 마법사
+Comment[lt]=BlueDevil vedlys
+Comment[mr]=ब्लु-डेव्हिल विझार्ड
Comment[nb]=BlueDevil veiviser
Comment[nl]=BlueDevil assistent
+Comment[pa]=BlueDevil ਸਹਾਇਕ
Comment[pl]=Pomocnik BlueDevil
Comment[pt]=Assistente BlueDevil
Comment[pt_BR]=Assistente BlueDevil
@@ -71,9 +102,11 @@ Comment[sr@ijekavian]=Блудевилов чаробњак
Comment[sr@ijekavianlatin]=BlueDevilov čarobnjak
Comment[sr@latin]=BlueDevilov čarobnjak
Comment[sv]=Blådjävul guide
+Comment[tr]=BlueDevil Sihirbazı
Comment[uk]=Майстер BlueDevil
Comment[x-test]=xxBlueDevil Wizardxx
Comment[zh_CN]=BlueDevil 向导
+Comment[zh_TW]=BlueDevil 精靈
Icon=preferences-system-bluetooth
Terminal=false
Categories=Qt;KDE;X-Bluetooth;Network;
diff --git a/src/wizard/bluewizard.cpp b/src/wizard/bluewizard.cpp
index 02f54b7..cd1fe3d 100644
--- a/src/wizard/bluewizard.cpp
+++ b/src/wizard/bluewizard.cpp
@@ -23,6 +23,7 @@
#include "pages/legacypairingdatabase.h"
#include "pages/keyboardpairing.h"
#include "pages/ssppairing.h"
+#include "pages/success.h"
#include "pages/fail.h"
#include "debug_p.h"
@@ -61,6 +62,7 @@ BlueWizard::BlueWizard(const QUrl &url)
setPage(LegacyPairingDatabase, new LegacyPairingPageDatabase(this));
setPage(KeyboardPairing, new KeyboardPairingPage(this));
setPage(SSPPairing, new SSPPairingPage(this));
+ setPage(Success, new SuccessPage(this));
setPage(Fail, new FailPage(this));
QPushButton *backButton = new QPushButton(this);
diff --git a/src/wizard/bluewizard.h b/src/wizard/bluewizard.h
index ce817d1..d995fb8 100644
--- a/src/wizard/bluewizard.h
+++ b/src/wizard/bluewizard.h
@@ -51,7 +51,7 @@ public:
WizardAgent* agent() const;
- enum {Discover, NoPairing, LegacyPairing, LegacyPairingDatabase, KeyboardPairing, SSPPairing, Fail, Connect};
+ enum {Discover, NoPairing, LegacyPairing, LegacyPairingDatabase, KeyboardPairing, SSPPairing, Success, Fail, Connect};
public Q_SLOTS:
void restartWizard();
diff --git a/src/wizard/pages/discover.ui b/src/wizard/pages/discover.ui
index c43f080..aec410d 100644
--- a/src/wizard/pages/discover.ui
+++ b/src/wizard/pages/discover.ui
@@ -114,9 +114,6 @@
<height>40</height>
</size>
</property>
- <property name="inputMask">
- <string>999999999; </string>
- </property>
<property name="readOnly">
<bool>false</bool>
</property>
diff --git a/src/wizard/pages/discoverpage.cpp b/src/wizard/pages/discoverpage.cpp
index de3f10e..35cc186 100644
--- a/src/wizard/pages/discoverpage.cpp
+++ b/src/wizard/pages/discoverpage.cpp
@@ -26,6 +26,7 @@
#include <QListView>
#include <QLabel>
#include <QTimer>
+#include <QRegExpValidator>
#include <KLocalizedString>
#include <kiconloader.h>
@@ -64,6 +65,10 @@ void DiscoverPage::initializePage()
list << QWizard::CancelButton;
m_wizard->setButtonLayout(list);
+ QRegExp rx("[0-9]{0,9}");
+ QRegExpValidator *validator = new QRegExpValidator(rx);
+ pinText->setValidator(validator);
+
connect(Manager::self()->usableAdapter(), SIGNAL(unpairedDeviceFound(Device*)), this,
SLOT(deviceFound(Device*)));
connect(manualPin, SIGNAL(toggled(bool)), pinText, SLOT(setEnabled(bool)));
@@ -76,7 +81,7 @@ void DiscoverPage::initializePage()
bool DiscoverPage::isComplete() const
{
- if (m_wizard->deviceAddress().isEmpty()) {
+ if (m_wizard->deviceAddress().isEmpty() || !m_wizard->device()) {
return false;
}
if (manualPin->isChecked() && pinText->text().isEmpty()) {
@@ -193,7 +198,7 @@ int DiscoverPage::nextId() const
return BlueWizard::Discover;
}
- if (m_wizard->deviceAddress().isEmpty()) {
+ if (m_wizard->deviceAddress().isEmpty() || !m_wizard->device()) {
return BlueWizard::Discover;
}
diff --git a/src/wizard/pages/fail.cpp b/src/wizard/pages/fail.cpp
index 422920f..b9a6119 100644
--- a/src/wizard/pages/fail.cpp
+++ b/src/wizard/pages/fail.cpp
@@ -40,6 +40,8 @@ FailPage::FailPage(BlueWizard* parent)
, m_wizard(parent)
{
setupUi(this);
+
+ failIcon->setPixmap(QIcon::fromTheme(QStringLiteral("task-reject")).pixmap(48));
}
void FailPage::initializePage()
diff --git a/src/wizard/pages/fail.ui b/src/wizard/pages/fail.ui
index 0470e8f..375a4fb 100644
--- a/src/wizard/pages/fail.ui
+++ b/src/wizard/pages/fail.ui
@@ -30,6 +30,16 @@
</spacer>
</item>
<item>
+ <widget class="QLabel" name="failIcon">
+ <property name="maximumSize">
+ <size>
+ <width>48</width>
+ <height>48</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="failLbl">
<property name="text">
<string/>
diff --git a/src/wizard/pages/nopairing.cpp b/src/wizard/pages/nopairing.cpp
index c0410e1..522cae9 100644
--- a/src/wizard/pages/nopairing.cpp
+++ b/src/wizard/pages/nopairing.cpp
@@ -35,9 +35,10 @@
using namespace BlueDevil;
-NoPairingPage::NoPairingPage(BlueWizard* parent) : QWizardPage(parent)
-, m_validPage(false)
-, m_wizard(parent)
+NoPairingPage::NoPairingPage(BlueWizard *parent)
+ : QWizardPage(parent)
+ , m_success(false)
+ , m_wizard(parent)
{
setupUi(this);
m_working = new KPixmapSequenceOverlayPainter(this);
@@ -46,6 +47,14 @@ NoPairingPage::NoPairingPage(BlueWizard* parent) : QWizardPage(parent)
m_working->start();
}
+int NoPairingPage::nextId() const
+{
+ if (m_success) {
+ return BlueWizard::Success;
+ }
+ return BlueWizard::Fail;
+}
+
void NoPairingPage::initializePage()
{
qCDebug(WIZARD);
@@ -53,10 +62,6 @@ void NoPairingPage::initializePage()
connecting->setText(connecting->text().append(m_wizard->device()->name()));
- //It can happen that the device is technically connected and trusted but we are not connected
- //to the profile. We have no way to know if the profile was activated or not so we have to relay
- //on a timeout (10s)
- QTimer::singleShot(10000, this, SLOT(timeout()));
connect(m_wizard->device(), SIGNAL(connectedChanged(bool)), SLOT(connectedChanged(bool)));
connect(m_wizard->device(), SIGNAL(trustedChanged(bool)), SLOT(connectedChanged(bool)));
@@ -64,30 +69,14 @@ void NoPairingPage::initializePage()
m_wizard->device()->setTrusted(true);
}
-void NoPairingPage::timeout()
-{
- connectedChanged(true);
-}
-
void NoPairingPage::connectedChanged(bool connected)
{
- qCDebug(WIZARD);
-
- m_validPage = connected;
- if (m_validPage) {
- qCDebug(WIZARD) << "Done";
- m_wizard->done(0);
- }
-}
-
-bool NoPairingPage::validatePage()
-{
- return m_validPage;
-}
+ qCDebug(WIZARD) << "Connect finished" << connected;
-int NoPairingPage::nextId() const
-{
- return -1;
+ // Connect may fail but that doesn't really mean the device was setup incorrectly
+ // Device::connectDevice will fail eg. when A2DP profile could not be connected due to missing pulseaudio plugin
+ m_success = true;
+ QTimer::singleShot(500, m_wizard, SLOT(next()));
}
QList<QWizard::WizardButton> NoPairingPage::wizardButtonsLayout() const
@@ -95,6 +84,5 @@ QList<QWizard::WizardButton> NoPairingPage::wizardButtonsLayout() const
QList <QWizard::WizardButton> list;
list << QWizard::Stretch;
list << QWizard::CancelButton;
-
return list;
}
diff --git a/src/wizard/pages/nopairing.h b/src/wizard/pages/nopairing.h
index 26f1441..9fd167d 100644
--- a/src/wizard/pages/nopairing.h
+++ b/src/wizard/pages/nopairing.h
@@ -44,20 +44,18 @@ Q_OBJECT
public:
NoPairingPage(BlueWizard* parent = 0);
- virtual void initializePage();
- virtual bool validatePage();
virtual int nextId() const;
+ virtual void initializePage();
protected:
QList <QWizard::WizardButton> wizardButtonsLayout() const;
private Q_SLOTS:
- void timeout();
void connectedChanged(bool connected);
private:
- bool m_validPage;
- BlueWizard *m_wizard;
+ bool m_success;
+ BlueWizard *m_wizard;
KPixmapSequenceOverlayPainter *m_working;
};
diff --git a/src/wizard/pages/ssppairing.cpp b/src/wizard/pages/ssppairing.cpp
index 963bdaa..14f5e09 100644
--- a/src/wizard/pages/ssppairing.cpp
+++ b/src/wizard/pages/ssppairing.cpp
@@ -77,6 +77,7 @@ void SSPPairingPage::initializePage()
void SSPPairingPage::confirmationRequested(quint32 passkey, const QDBusMessage& msg)
{
m_msg = msg;
+ m_msg.setDelayedReply(true);
QPushButton *matches = new QPushButton(this);
KGuiItem::assign(matches, KStandardGuiItem::apply());
@@ -129,6 +130,7 @@ void SSPPairingPage::matchesClicked()
void SSPPairingPage::notMatchClicked()
{
m_buttonClicked = QWizard::CustomButton2;
+ QDBusConnection::systemBus().send(m_msg.createErrorReply("org.bluez.Rejected", "Rejected"));
wizard()->next();
}
diff --git a/src/wizard/pages/success.cpp b/src/wizard/pages/success.cpp
new file mode 100644
index 0000000..f49bb7f
--- /dev/null
+++ b/src/wizard/pages/success.cpp
@@ -0,0 +1,66 @@
+/*****************************************************************************
+ * This file is part of the KDE project *
+ * *
+ * Copyright (C) 2010 Alejandro Fiestas Olivares <afiestas@kde.org> *
+ * Copyright (C) 2010-2011 UFO Coders <info@ufocoders.com> *
+ * Copyright (C) 2014 David Rosca <nowrep@gmail.com> *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2 of the License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Library General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Library General Public License *
+ * along with this library; see the file COPYING.LIB. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ *****************************************************************************/
+
+#include "success.h"
+#include "bluewizard.h"
+#include "debug_p.h"
+
+#include <QIcon>
+
+#include <KLocalizedString>
+
+#include <bluedevil/bluedevildevice.h>
+
+SuccessPage::SuccessPage(BlueWizard *parent)
+ : QWizardPage(parent)
+ , m_wizard(parent)
+{
+ setupUi(this);
+
+ successIcon->setPixmap(QIcon::fromTheme(QStringLiteral("task-complete")).pixmap(48));
+}
+
+void SuccessPage::initializePage()
+{
+ qCDebug(WIZARD) << "Initialize Success Page";
+
+ QList<QWizard::WizardButton> list;
+ list << QWizard::Stretch;
+ list << QWizard::FinishButton;
+
+ m_wizard->setButtonLayout(list);
+
+ setFinalPage(true);
+
+ QString deviceName = m_wizard->device()->name();
+ if (deviceName.isEmpty()) {
+ successLbl->setText(i18nc("This string is shown when the wizard succeeds", "The setup of the device has succeeded"));
+ } else {
+ successLbl->setText(i18n("The setup of %1 has succeeded", deviceName));
+ }
+}
+
+int SuccessPage::nextId() const
+{
+ return -1;
+}
diff --git a/src/wizard/pages/success.h b/src/wizard/pages/success.h
new file mode 100644
index 0000000..a41f73e
--- /dev/null
+++ b/src/wizard/pages/success.h
@@ -0,0 +1,46 @@
+/*****************************************************************************
+ * This file is part of the KDE project *
+ * *
+ * Copyright (C) 2010 Alejandro Fiestas Olivares <afiestas@kde.org> *
+ * Copyright (C) 2010-2011 UFO Coders <info@ufocoders.com> *
+ * Copyright (C) 2014 David Rosca <nowrep@gmail.com> *
+ * *
+ * This library is free software; you can redistribute it and/or *
+ * modify it under the terms of the GNU Library General Public *
+ * License as published by the Free Software Foundation; either *
+ * version 2 of the License, or (at your option) any later version. *
+ * *
+ * This library is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Library General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Library General Public License *
+ * along with this library; see the file COPYING.LIB. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ *****************************************************************************/
+
+#ifndef SUCCESS_H
+#define SUCCESS_H
+
+#include "ui_success.h"
+#include <QWizardPage>
+
+class BlueWizard;
+
+class SuccessPage : public QWizardPage, Ui::Success
+{
+ Q_OBJECT
+
+public:
+ SuccessPage(BlueWizard *parent = 0);
+
+ virtual void initializePage();
+ virtual int nextId() const;
+
+private:
+ BlueWizard *m_wizard;
+};
+
+#endif // SUCCESS_H
diff --git a/src/wizard/pages/success.ui b/src/wizard/pages/success.ui
new file mode 100644
index 0000000..3630db3
--- /dev/null
+++ b/src/wizard/pages/success.ui
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Success</class>
+ <widget class="QWidget" name="Success">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="successIcon">
+ <property name="maximumSize">
+ <size>
+ <width>48</width>
+ <height>48</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="successLbl">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/wizard/pin-code-database.xml b/src/wizard/pin-code-database.xml
index 8239aa9..5e99392 100644
--- a/src/wizard/pin-code-database.xml
+++ b/src/wizard/pin-code-database.xml
@@ -52,9 +52,9 @@
<device type="keyboard" oui="00:13:6C:" name="TomTom Remote" pin="0000"/>
<!-- Sony PlayStation 3 Remote Control -->
- <device oui="00:19:C1:" name="BD Remote Control" pin="NULL"/>
- <device oui="00:1E:3D:" name="BD Remote Control" pin="NULL"/>
- <device oui="00:06:F5:" name="BD Remote Control" pin="NULL"/>
+ <device oui="00:19:C1:" name="PLAYSTATION(R)3 Controller" pin="NULL"/>
+ <device oui="00:1E:3D:" name="PLAYSTATION(R)3 Controller" pin="NULL"/>
+ <device oui="00:06:F5:" name="PLAYSTATION(R)3 Controller" pin="NULL"/>
<!-- Apple Wireless and Mighty Mouse
Note: Apple doesn't follow the specs, and requires their mice