はじめに
この記事は、Sailfish OSでのシステムAPIの使用に関する資料の続きであり、このオペレーティングシステムのD-Busの機能に専念しています。 標準カレンダーおよびフラッシュとの相互作用が詳細に分析されます。 D-Busシステムの他の基本機能のリストは、記事の最後に記載されています。
上記の資料を理解するには、Sailfish OSの開発の基本と、オペレーティングシステム内のD-Busとの相互作用の原則を知る必要があります。 適切な出発点は、FRUCTの関連記事です。
[1] Sailfish OSの開発の開始 。
[2] Sailfish OS向けの開発:D-Busとの連携 。
理論
利用可能なインターフェイスとD-Bus機能に関する情報を取得するには、2つの方法があります。 最初のアプローチは、特別なユーティリティ(
Visual D-Bus
や
D-Bus Inspector
)またはコマンドライン(図1)を使用して、システムに登録されているインターフェイスを調べることです。 2番目のアプローチでは、前の記事で説明したソースコードの調査方法を使用します。
[図1-D-Busインターフェースのリストを取得する例。]
最初のアプローチの大きな利点は、バイナリファイルに「配線」されており、テキスト形式では利用できないインターフェイスに関する情報を取得できることですが、この方法では現在アクティブなインターフェイスのみを分析できます。 この記事で使用する2番目のアプローチは、最初のアプローチの説明したプラスとマイナスを逆にします。
テクニック
D-Bus関数は、C ++コード(システムでは利用できない)、QMLコード、およびアプリケーションデスクトップファイルから呼び出す(または定義する)ことができます。 したがって、インターフェースに関する情報を検索する場合、まず
org.nemomobile.dbus
モジュールについてのアイデアが必要です。 第二に、デスクトップファイルからD-Busにアクセスする方法について。
org.nemomobile.dbus
QMLモジュールは、D-Busを操作するための2つの主要コンポーネント、
DBusAdaptor
と
DBusInterface
ます。 1つ目は独自のアプリケーションインターフェイスを作成することを可能にし、2つ目は既存のものを使用します。 情報の一般的な検索では、外部からアプリケーションとやり取りする方法と、アプリケーションがサードパーティのインターフェイスを使用する方法をそれぞれ確認できるため、両方のコンポーネントが重要です。
たとえば、D-Busが設定アプリケーションを使用するインターフェイスを見つけるには、
/usr/share/jolla-settings
に移動して、D-Busの使用を確認する必要があります。
grep -i -H 'dbus' * && grep -A 5 'DBusAdaptor' ./settings.qml
$ cd /usr/share/jolla-settings/ $ grep -i -H 'dbus' * settings.qml:import org.nemomobile.dbus 2.0 settings.qml: DBusAdaptor { $ grep -A 5 'DBusAdaptor' ./settings.qml DBusAdaptor { service: "com.jolla.settings" path: "/com/jolla/settings/ui" iface: "com.jolla.settings.ui" function showSettings() {
同時に、デスクトップファイルを分析するときは、まずデスクトップファイルが
/usr/share/applications
ディレクトリに保存されることを覚えておく必要があります。 次に、説明されている関数を使用すると、アプリケーションインスタンスが起動します。 3番目に、D-Busとの相互作用を説明するときに、
X-Maemo
プレフィックスを持つフィールドが使用されます。
-
X-Maemo-Service
ユーザーまたはシステムバス上のサービス、またはアプリケーションの場所。 -
X-Maemo-Object-Path
または名前。 -
X-Maemo-Method
呼び出されたメソッドの名前。
知って面白い
プレフィックスは、以前にNokiaが開発したMaemoオペレーティングシステムのレガシーとしてSailfish OSに登場しました(図2)。 これらを使用すると、プログラムを最初に起動しなくてもアクセスできるように、D-Bus関数を宣言できます。 これらの関数を使用すると、いくつかの予備作業を開く前に、実装を使用してプログラムを起動できます。
[図2-他のオペレーティングシステムへのSailfish OSの依存性( ウィキペディア )。]
デスクトップファイルでは、
フィールドを使用して、プログラムが処理できるファイルの種類を示すことができることに注意してください。 実装例はGitHubで入手できます 。
X-Maemo
プレフィックスは、以前にNokiaが開発したMaemoオペレーティングシステムのレガシーとしてSailfish OSに登場しました(図2)。 これらを使用すると、プログラムを最初に起動しなくてもアクセスできるように、D-Bus関数を宣言できます。 これらの関数を使用すると、いくつかの予備作業を開く前に、実装を使用してプログラムを起動できます。
[図2-他のオペレーティングシステムへのSailfish OSの依存性( ウィキペディア )。]
デスクトップファイルでは、
MimeType
フィールドを使用して、プログラムが処理できるファイルの種類を示すことができることに注意してください。 実装例はGitHubで入手できます 。
したがって、D-Busの使用をサポートするすべてのアプリケーションのリストを取得するには、
/usr/share/applications
ディレクトリに移動して、キーワードの1つを検索する必要があります。
grep -H 'X-Maemo-Service' *
$ cd /usr/share/applications/ $ grep -H 'X-Maemo-Service' * jolla-calendar-import.desktop:X-Maemo-Service=com.jolla.calendar.ui jolla-calendar.desktop:X-Maemo-Service=com.jolla.calendar.ui jolla-camera-viewfinder.desktop:X-Maemo-Service=com.jolla.camera jolla-clock.desktop:X-Maemo-Service=com.jolla.clock jolla-contacts-import.desktop:X-Maemo-Service=com.jolla.contacts.ui jolla-email.desktop:X-Maemo-Service=com.jolla.email.ui jolla-gallery-openfile.desktop:X-Maemo-Service=com.jolla.gallery jolla-gallery-playvideostream.desktop:X-Maemo-Service=com.jolla.gallery jolla-mediaplayer-openfile.desktop:X-Maemo-Service=com.jolla.mediaplayer jolla-mediaplayer.desktop:X-Maemo-Service=com.jolla.mediaplayer jolla-messages-openurl.desktop:X-Maemo-Service=org.nemomobile.qmlmessages jolla-messages.desktop:X-Maemo-Service=org.nemomobile.qmlmessages jolla-notes-import.desktop:X-Maemo-Service=com.jolla.notes jolla-notes.desktop:X-Maemo-Service=com.jolla.notes jolla-settings.desktop:X-Maemo-Service=com.jolla.settings new-mail.desktop:X-Maemo-Service=com.jolla.email.ui open-url.desktop:X-Maemo-Service=org.sailfishos.browser.ui ovpn-import.desktop:X-Maemo-Service=com.jolla.settings sailfish-office-openfile.desktop:X-Maemo-Service=org.sailfish.office sailfish-office.desktop:X-Maemo-Service=org.sailfish.office simkit.desktop:X-Maemo-Service=org.sailfish.simkit voicecall-ui-openurl.desktop:X-Maemo-Service=com.jolla.voicecall.ui voicecall-ui.desktop:X-Maemo-Service=com.jolla.voicecall.ui
APIとD-Busの基本的なシステム機能の概要表は、記事の最後に記載されています。
練習する
現在および以前の記事で提示された理論的な資料を使用すると、D-Busのシステム機能で動作するコンポーネントを実装できます。
当日のスケジュールを開くことができるコンポーネントを作成します。 これを行うには、
/usr/share/jolla-calendar
ディレクトリに移動し(ディレクトリの命名の原則は前の記事で説明しました)、D-Busの呼び出しがあるファイルを見つけます。
grep -r -i -H 'dbus' *
$ cd /usr/share/jolla-calendar/ $ grep -r -i -H 'dbus' * DbusInvoker.qml:import org.nemomobile.dbus 2.0 DbusInvoker.qml:DBusAdaptor { calendar.qml:import org.nemomobile.dbus 2.0 calendar.qml: DbusInvoker {}
コマンドの結果は、インターフェースの定義が
DbusInvoker.qml
ファイルで行われていることを
DbusInvoker.qml
ます。このファイルには、インターフェースとD-Bus関数の定義のみが含まれています。
cat ./DbusInvoker.qml -n
$ cat ./DbusInvoker.qml -n 1 import QtQuick 2.0 2 import Sailfish.Silica 1.0 3 import org.nemomobile.dbus 2.0 4 import Calendar.dateParser 1.0 5 6 DBusAdaptor { 7 service: "com.jolla.calendar.ui" 8 path: "/com/jolla/calendar/ui" 9 iface: "com.jolla.calendar.ui" 10 11 function viewEvent(id, recurrenceId, startDate) { 12 var occurrence = DateParser.parseTime(startDate) 13 if (isNaN(occurrence.getTime())) { 14 console.warn("Invalid event start date, unable to show event") 15 return 16 } 17 18 if (pageStack.currentPage.objectName === "EventViewPage") { 19 pageStack.currentPage.uniqueId = id 20 pageStack.currentPage.recurrenceId = recurrenceId 21 pageStack.currentPage.startTime = occurrence 22 } else { 23 pageStack.push("pages/EventViewPage.qml", 24 { uniqueId: id, recurrenceId: recurrenceId, startTime: occurrence }, 25 PageStackAction.Immediate) 26 } 27 requestActive.start() 28 } 29 30 function viewDate(dateTime) { 31 var parsedDate = new Date(dateTime) 32 if (isNaN(parsedDate.getTime())) { 33 console.warn("Invalid date, unable to show events for date") 34 return 35 } 36 37 if (pageStack.currentPage.objectName === "DayPage") { 38 pageStack.currentPage.date = parsedDate 39 } else { 40 pageStack.push("pages/DayPage.qml", { date: parsedDate }, PageStackAction.Immediate) 41 } 42 requestActive.start() 43 } 44 45 function importFile(fileName) { 46 if (pageStack.currentPage.objectName === "ImportPage") { 47 pageStack.currentPage.fileName = fileName 48 } else { 49 pageStack.push("pages/ImportPage.qml", { "fileName": fileName }, PageStackAction.Immediate) 50 } 51 requestActive.start() 52 } 53 54 function activateWindow(arg) { 55 app.activate() 56 } 57 }
アダプターコードから、作成されたコンポーネントで
com.jolla.calendar.ui
サービスに接続し、パス
/com/jolla/calendar/ui
および
com.jolla.calendar.ui
インターフェースを使用する必要があることが
com.jolla.calendar.ui
ます(行7-9)。 その後、宣言された関数が使用可能になります。タスクのフレームワーク内で関心があるのは
viewDate
(
viewDate
行目)だけで、
Date
オブジェクトによって認識される日付表現の1つを引数として取ります。 得られた結果により、カレンダーを操作するためのコンポーネントを実装できます。
CalendarController.qml
import QtQuick 2.0 import Sailfish.Silica 1.0 import org.nemomobile.dbus 2.0 Item { id: calendarControl /* . */ function showAgenda() { calendar.call('viewDate', Date.now()) } DBusInterface { id: calendar service: 'com.jolla.calendar.ui' path: '/com/jolla/calendar/ui' iface: 'com.jolla.calendar.ui' } }
同じ原理により、D-Busシステムの機能と相互作用する他のコンポーネントが形成されます。
フラッシュ制御プロセスを検討してください。 これを行うには、
/usr/share/jolla-settings/pages/flashlight
ディレクトリの分析に従って、
com.jolla.settings.system.flashlight
サービスに接続し、パス
/com/jolla/settings/system/flashlight
および
com.jolla.settings.system.flashlight
インターフェイスを使用する
com.jolla.settings.system.flashlight
ます。
com.jolla.settings.system.flashlight
。 その後、パラメータなしでtoggleFlashlight関数を呼び出すことで、フラッシュのオンとオフを切り替えることが可能になります。
ただし、一部のタスクでは、フラッシュのオン/オフに関わらず、フラッシュの現在の状態に関する情報を取得する必要がある場合があります。 これを行うには、
"flashlightOn"
パラメーターを渡して
getProperty
関数を使用します。 この場合、ブール値が返されます。
grep -i -H 'dbus' ./pages/flashlight/* && grep -A 5 -i -H 'DBusInterface' ./pages/flashlight/Flashlight.qml
$ cd /usr/share/jolla-settings $ grep -i -H "dbus" ./pages/flashlight/* ./pages/flashlight/Flashlight.qml:import org.nemomobile.dbus 2.0 ./pages/flashlight/Flashlight.qml: flashlightDbus.call("toggleFlashlight", undefined, handleToggle, handleError) ./pages/flashlight/Flashlight.qml: property QtObject flashlightDbus: DBusInterface { ./pages/flashlight/Flashlight.qml: flashlight.flashlightOn = flashlightDbus.getProperty("flashlightOn") $ grep -A 5 -i -H "DBusInterface" ./pages/flashlight/Flashlight.qml ./pages/flashlight/Flashlight.qml: property QtObject flashlightDbus: DBusInterface { ./pages/flashlight/Flashlight.qml- signalsEnabled: true ./pages/flashlight/Flashlight.qml- service: "com.jolla.settings.system.flashlight" ./pages/flashlight/Flashlight.qml- path: "/com/jolla/settings/system/flashlight" ./pages/flashlight/Flashlight.qml- iface: "com.jolla.settings.system.flashlight" ./pages/flashlight/Flashlight.qml- function flashlightOnChanged(newOn) {
上記を考慮すると、フラッシュと対話するためのコンポーネントが実装されます。
FlashlightController.qml
import QtQuick 2.0 import Sailfish.Silica 1.0 import org.nemomobile.dbus 2.0 Item { id: flashlightControl // . property bool flashlightOn // . function toggleFlashlight() { flashlightOn = !flashlightOn; flashlight.call("toggleFlashlight", undefined); } DBusInterface { id: flashlight service: "com.jolla.settings.system.flashlight" path: "/com/jolla/settings/system/flashlight" iface: "com.jolla.settings.system.flashlight" signalsEnabled: true function flashlightOnChanged(newOn) { flashlightControl.flashlightOn = newOn } } Component.onCompleted: { flashlightControl.flashlightOn = flashlight.getProperty("flashlightOn") } }
おわりに
この記事では、Sailfish OSのD-Bus関数に関する情報を見つける2つの方法について説明し、そのうちの1つを詳細に分析します(ソースコードでの検索)。 これを使用して、フラッシュおよび標準カレンダーと対話するためのコンポーネントの例が開発され、コメントが付けられます。 これらおよび他のモジュールのコードはGitHubで入手できます 。
ただし、目的のプログラムを必要な引数で実行するだけでいくつかのタスクを解決できることを忘れないでください。 たとえば、サイトを開いて標準ブラウザを起動するには、
sailfish-browser https://google.com/
コマンド
sailfish-browser https://google.com/
を使用し
sailfish-browser https://google.com/
。 しかし、これは記事で説明されている資料の範囲を超えています。
sailfish-browser https://google.com/
$ sailfish-browser https://google.com/ [D] unknown:0 - Using Wayland-EGL greHome from GRE_HOME:/usr/bin libxul.so is not found, in /usr/bin/libxul.so Created LOG for EmbedLite [D] onCompleted:103 - ViewPlaceholder requires a SilicaFlickable parent Loaded xulDir:/usr/lib/xulrunner-qt5-38.8.0/libxul.so, appDir:/usr/bin EmbedLiteExt virtual nsresult EmbedChromeManager::Observe(nsISupports*, const char*, const char16_t*):82: obj:(nil), top:app-startup EmbedLiteExt virtual nsresult EmbedTouchManager::Observe(nsISupports*, const char*, const char16_t*):86: obj:(nil), top:app-startup EmbedLiteGlobalHelper app-startup EmbedLiteSyncService app-startup PREFS SERVICE INITAILIZED EmbedPrefService app-startup EmbedliteDownloadManager initialized UserAgentOverrideHelper app-startup 1505073762747 addons.manager DEBUG Application has been upgraded 1505073762892 addons.manager DEBUG Loaded provider scope for resource://gre/modules/addons/XPIProvider.jsm: ["XPIProvider"] 1505073762912 addons.manager DEBUG Loaded provider scope for resource://gre/modules/LightweightThemeManager.jsm: ["LightweightThemeManager"] 1505073762942 addons.manager DEBUG Loaded provider scope for resource://gre/modules/addons/GMPProvider.jsm 1505073762961 addons.manager DEBUG Loaded provider scope for resource://gre/modules/addons/PluginProvider.jsm 1505073762968 addons.manager DEBUG Starting provider: XPIProvider 1505073762973 addons.xpi DEBUG startup 1505073762982 addons.xpi DEBUG checkForChanges 1505073762993 addons.xpi DEBUG Loaded add-on state from prefs: {} 1505073763000 addons.xpi DEBUG getInstallState changed: false, state: {} 1505073763009 addons.xpi DEBUG Empty XPI database, setting schema version preference to 16 1505073763012 addons.xpi DEBUG No changes found 1505073763015 addons.manager DEBUG Registering shutdown blocker for XPIProvider 1505073763021 addons.manager DEBUG Provider finished startup: XPIProvider 1505073763022 addons.manager DEBUG Starting provider: LightweightThemeManager 1505073763024 addons.manager DEBUG Registering shutdown blocker for LightweightThemeManager 1505073763029 addons.manager DEBUG Provider finished startup: LightweightThemeManager 1505073763032 addons.manager DEBUG Starting provider: GMPProvider 1505073763046 addons.manager DEBUG Registering shutdown blocker for GMPProvider 1505073763050 addons.manager DEBUG Provider finished startup: GMPProvider 1505073763052 addons.manager DEBUG Starting provider: PluginProvider 1505073763055 addons.manager DEBUG Registering shutdown blocker for PluginProvider 1505073763059 addons.manager DEBUG Provider finished startup: PluginProvider 1505073763060 addons.manager DEBUG Completed startup sequence Created LOG for EmbedPrefs [D] QMozWindowPrivate::setSize:71 - Trying to set empty size: QSize(-1, -1) Attempting load of libEGL.so EmbedLiteExt virtual nsresult EmbedTouchManager::Observe(nsISupports*, const char*, const char16_t*):86: obj:0xb225a130, top:domwindowopened EmbedLiteExt void EmbedChromeManager::WindowCreated(nsIDOMWindow*):91: WindowOpened: 0xb225a140 EmbedLiteExt void EmbedTouchManager::WindowCreated(nsIDOMWindow*):95: WindowOpened: 0xb225a140 EmbedLiteExt void EmbedTouchManager::WindowCreated(nsIDOMWindow*):108: id for window: 1 ###################################### SelectAsyncHelper.js loaded ###################################### embedhelper.js loaded ### ContextMenuHandler.js loaded ### SelectionPrototype.js loaded ### SelectionHandler.js loaded Init Called:[object Object] JavaScript warning: https://www.google.ru/xjs/_/js/k=xjs.mhp.en_US.2vKAz7DqmvI.O/m=sb_mobh,hjsa,d,csi/am=AAAD/rt=j/d=1/t=zcms/rs=ACT90oFx8AHVqc9lMfPQBwURKXyQ4qaFiA, line 7: mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create
メインシステムAPI関数:
説明 | 必要なデータ |
---|---|
雰囲気を作る | |
画面の明るさを調整する | |
画面の向きの調整 | |
画面の明るさを自動的に調整する | |
スリープ時間を設定する | |
充電中の表示状態の設定 | |
システムフォントサイズの設定 | |
システム音量調整 | |
振動設定 | |
システムイベントのサウンドをオン/オフにする | |
WLANの有効化/無効化 | |
インターネット共有を有効/無効にする | |
飛行モードのオン/オフ | |
Bluetoothのオン/オフを切り替えます | |
メインシステムのD-Bus機能:
説明 | 必要なデータ |
---|---|
カレンダーイベントを表示する | サービス:
com.jolla.calendar.ui
パス: /com/jolla/calendar/ui
インターフェース: com.jolla.calendar.ui
機能: viewEvent(id, recurrenceId, startDate)
|
カレンダーで日を表示する | サービス:
com.jolla.calendar.ui
パス: /com/jolla/calendar/ui
インターフェース: com.jolla.calendar.ui
機能: viewDate(dateTime)
|
最後の状態でカメラを開く | サービス:
com.jolla.camera
パス: /
インターフェース: com.jolla.camera.ui
機能: showViewfinder()
|
フロントカメラを開く | サービス:
com.jolla.camera
パス: /
インターフェース: com.jolla.camera.ui
機能: showFrontViewfinder()
|
アラームを作成する | サービス:
com.jolla.clock
パス: /
インターフェース: com.jolla.clock
機能: newAlarm()
|
連絡先を表示 | サービス:
com.jolla.contacts.ui
パス: /com/jolla/contacts/ui
インターフェース: com.jolla.contacts.ui
機能: showContact(int contactId)
|
連絡先の編集 | サービス:
com.jolla.contacts.ui
パス: /com/jolla/contacts/ui
インターフェース: com.jolla.contacts.ui
機能: editContact(int contactId)
|
連絡先をインポートする | サービス:
com.jolla.contacts.ui
パス: /com/jolla/contacts/ui
インターフェース: com.jolla.contacts.ui
機能: importWizard()
|
URLでオーディオファイルを再生する | サービス:
com.jolla.mediaplayer
パス: /com/jolla/mediaplayer/ui
インターフェース: com.jolla.mediaplayer.ui
機能: openUrl(url)
|
新しいメモを作成する | サービス:
com.jolla.notes
パス: /
インターフェース: com.jolla.notes
機能: newNote()
|
設定を表示 | サービス:
com.jolla.settings
パス: /com/jolla/settings/ui
インターフェース: com.jolla.settings.ui
機能: showSettings()
|
ダウンロードリストを見る | サービス:
com.jolla.settings
パス: /com/jolla/settings/ui
インターフェース: com.jolla.settings.ui
機能: showTransfers()
|
アカウントリストを表示 | サービス:
com.jolla.settings
パス: /com/jolla/settings/ui
インターフェース: com.jolla.settings.ui
機能: showAccounts()
|
通話録音設定を表示する | サービス:
com.jolla.settings
パス: /com/jolla/settings/ui
インターフェース: com.jolla.settings.ui
機能: showCallRecordings()
|
Androidサポートの有効化/無効化 | サービス:
com.jolla.apkd
パス: /com/jolla/apkd
インターフェース: com.jolla.apkd
機能: controlService(true/false)
|
フラッシュをオン/オフにする | サービス:
com.jolla.settings.system.flashlight
パス: /com/jolla/settings/system/flashlight
インターフェース: com.jolla.settings.system.flashlight
機能: toggleFlashlight()
|
デバイスを再起動します | サービス:
com.nokia.dsme
パス: /com/nokia/dsme/request
インターフェース: com.nokia.dsme.request
機能: req_reboot()
|
デバイスの電源を切ります | サービス:
com.nokia.dsme
パス: /com/nokia/dsme/request
インターフェース: com.nokia.dsme.request
機能: req_shutdown
|
電話する | サービス:
com.jolla.voicecall.ui
パス: /
インターフェース: com.jolla.voicecall.ui
機能: dial(number)
|
ギャラリーで画像を開く | サービス:
com.jolla.gallery
パス: /com/jolla/gallery/ui
インターフェース: com.jolla.gallery.ui
機能: showImages(array_of_urls)
|
ギャラリーでビデオを開く | サービス:
com.jolla.gallery
パス: /com/jolla/gallery/ui
インターフェース: com.jolla.gallery.ui
機能: playVideoStream(url)
|
新しい手紙を作成する | サービス:
com.jolla.email.ui
パス: /com/jolla/email/ui
インターフェース: com.jolla.email.ui
機能: mailto()
|
WLAN検索 | サービス:
com.jolla.lipstick.ConnectionSelector
パス: /
インターフェース: com.jolla.lipstick.ConnectionSelectorIf
機能: openConnectionNow('wifi')
|
開発中に生じる質問やアイデアは、 TelegramチャットとVKontakteグループでいつでも議論できます。