LibreOffice5(152)プロトコルハンドラとジョブ

2018-04-29

旧ブログ

t f B! P L
プロトコルハンドラとジョブの関係がいまいちわからなかったのですがようやく理解できました。プロトコルハンドラはプロトコルをハンドル(handle)するもので、ジョブはプロトコルの一つであるvnd.sun.star.job:プロトコルで始まるコマンドURLで呼び出せるコマンドを定義しているものでした。

前の関連記事:LibreOffice5(151)UnicodeのVariation Selector で「辻」のしんにょうの点の個数を変える


xcdファイルで定義されているプロトコルハンドラ


LibreOffice5.4のmain.xcdのProtocolHandlerのコンポーネントスキーマノードには8つのプロトコルが定義されています。
<oor:component-data oor:name="ProtocolHandler" oor:package="org.openoffice.Office">
 <node oor:name="HandlerSet">
  <node  oor:name="com.sun.star.comp.sfx2.SfxMacroLoader" oor:op="replace">
   <prop oor:name="Protocols">
    <value>macro:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.framework.MailToDispatcher" oor:op="replace">
   <prop oor:name="Protocols">
    <value>mailto:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.sfx2.AppDispatchProvider" oor:op="replace">
   <prop oor:name="Protocols">
    <value>.uno* slot:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.framework.ServiceHandler" oor:op="replace">
   <prop oor:name="Protocols">
    <value>service:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.framework.jobs.JobDispatch" oor:op="replace">
   <prop oor:name="Protocols">
    <value>vnd.sun.star.job:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.ScriptProtocolHandler" oor:op="replace">
   <prop oor:name="Protocols">
    <value>vnd.sun.star.script:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.framework.PopupMenuControllerDispatcher" oor:op="replace">
   <prop oor:name="Protocols">
    <value>vnd.sun.star.popup:*</value>
   </prop>
  </node>
  <node oor:name="com.sun.star.comp.svx.FindbarDispatcher" oor:op="replace">
   <prop oor:name="Protocols">
    <value>vnd.sun.star.findbar:*</value>
   </prop>
  </node>
 </node>
</oor:component-data>
ハイライトしている行に8つのプロトコルがでてきます。

アスタリスクの部分にコマンドURLのパスが入ります。

各プロトコルのプロトコルハンドラのサービス名がその親ノード名で定義されています。

これらサービス名にはcompが含まれており、APIリファレンスに載っていない実装サービス名です。

mailto:*:
vnd.sun.star.popup:*
vnd.sun.star.findbar:*

この3つのプロトコルについては解説をみつけられなかったので使い方はわかりません。

このほかimpress.xcdには次の二つのプロトコルが定義されています。

vnd.org.libreoffice.presenterscreen:*
vnd.com.sun.star.comp.PresentationMinimizer:*

これらも使い方はわかりませんでした。

マクロを呼び出すプロトコル


macro:*
vnd.sun.star.script:*

これらはマクロを呼び出すプロトコルです(OOoBasic/Generic/ScriptingURL - ...?)。

macro:*はBasicマクロしかない時代の古いもので現在はvnd.sun.star.script:*を使います。

vnd.sun.star.script:マクロファイルのパス$関数?language=Python&location=user

マイマクロフォルダにあるPythonマクロのURL(ScriptingURL)はこのようになります。

マイマクロファイルのパスはマイマクロフォルダからの相対パスにして、また、パス区切りに"|"を使います(実装例: LibreOffice5(90)ScriptingURLの動的取得)。

ジョブを呼び出すプロトコル


vnd.sun.star.job:*

ジョブを呼び出すプロトコルです(LibreOffice5(19)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その3)。

vnd.sun.star.job:alias=エイリアス名
vnd.sun.star.job:event=イベント名
vnd.sun.star.job:service=サービス名

ジョブを呼び出すコマンドURLはこの3つのパターンがあります。

エイリアス名とはつまりジョブ名なので、通常はエイリアス名のコマンドURLで呼び出すことになると思います。

エイリアス名(ジョブ名)とはJobs.xcuファイルで定義したコンポーネントデータノードのoor:name="Jobs"ノードのサブノードの属性oor:nameの値になります(LibreOffice5(17)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その2)。

イベント名はJobs.xcuのoor:name="Events"のサブノード属性oor:nameの値で定義され、そのサブノードでエイリアス名でジョブと関連付けています。

List of Supported Events - Apache OpenOffice Wikiにあるイベント名に関連付けたジョブはそのイベント名に関連付けられたイベントが発生すると呼び出されます。

サービス名はJobs.xcuファイルでジョブと関連付けたサービス名になります。

ジョブに引数を渡すことはできるのですが、渡せる引数はJobs.xcuのoor:name="Arguments"のノードで予め定義したものだけです。

ディスパッチコマンドを呼び出すプロトコル


.uno* slot:*

ディスパッチコマンドを呼び出すプロトコルです(OOoBasic/Generic/dispatch - ...?)。

ディスパッチコマンドはメニューやボタンなどビルトインのコマンドを呼び出すものです。

slot:は以前のバージョンのものでスロットID(番号)で呼び出すものです。

ディスパッチコマンド名一覧はCalc(38)ディスパッチコマンドのラベル一覧の取得で作成しました(GenericCommandsStartModuleCommandsCalcCommands)。

.uno:コマンド名?引数

コマンドURLはこのようになります。

.uno:Open?URL:string=file:///C:/post.odt&FrameName:string=_default

OOoBasic/Generic/LoadAndStore - ...?に引数を渡すこのような例が載っていますが、解説は他に見つけられませんでした。

XJobExecutorインターフェイスのtrigger()メソッドを呼び出すプロトコル


service:*

サービス名を呼び出すプロトコルです。

servicehandler.cxx [libreoffice/framework/source/dispatch/servicehandler.cxx] - Woboq Code Browser

プロトコルハンドラのサービスcom.sun.star.comp.framework.ServiceHandlerのソースを読んでみると、呼び出すサービスはXJobExecutorインターフェイスを実装したものを想定しているようです。

service:サービス名?引数

このコマンドURLで引数を渡してサービスを呼び出します。

するとそのサービス名でインスタンス化されて、そのサービスが実装しているXJobExecutorインターフェイスのtrigger()メソッドに引数を渡して実行します(OOoPython/UNOComponent - ...?)。

なので、サービス名、にはXJobExecutorインターフェイスを実装したサービス名を入れることになります。

引数によって場合分けできるので、メニュー項目から起動するコマンドURLに使えて、プロトコルハンドルを自作するよりも楽に実装できます。

service:com.sun.star.task.theJobExecutor?イベント名

とするとイベント名に関連付けられたジョブが実行されます。

参考にしたサイト


OOoBasic/Generic/ScriptingURL - ...?
macro:*とvnd.sun.star.script:*プロトコルの使い方の例。

List of Supported Events - Apache OpenOffice Wiki
組み込みイベント名の一覧。

OOoBasic/Generic/dispatch - ...?
.uno* slot:*プロトコルの使い方の例。

servicehandler.cxx [libreoffice/framework/source/dispatch/servicehandler.cxx] - Woboq Code Browser
service:*プロトコルのプロトコルハンドラのcom.sun.star.comp.framework.ServiceHandlerのソース。

OOoPython/UNOComponent - ...?
XJobExecutorインターフェイスの解説。

次の関連記事:LibreOffice5(153)プロトコルを使う状況を考える

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ