LibreOffice5(42)UNOIDLの引数の型の例:文字列を渡す

UNOIDLの引数の型についての例を作ります。まず文字列を渡します。

前の関連記事:LibreOffice5(41)ツールバーのプロパティを設定するxcuファイル


UNOIDLtypeプロジェクトの作成



Git(27)EclipseでローカルリポジトリをGitHubのリモートリポジトリにするまでの方法でGitHubにリモートリポジトリを作成しました。

さらにリポジトリをGit Flowにして、Featureブランチを作成してそこで開発していきます。

string型を渡すUNOIDLの例:TestPythonComponentから抽出


string型を渡すUNOIDLの例はLibreOffice5(38)Java Component ExampleをPythonに翻訳するでやったTestPythonComponentです。

これから必要な部分のみ抽出します。

UNOIDLtypeプロジェクトのsrcフォルダ内にcomponent.pyファイルを作成して、p--q/TestPythonComponentのTestComponentB.pyの中身をコピーしました。

またsrcフォルダ内にidlフォルダを作成してそこにSomethingB.idlとXSomethingB.idlをコピーしました。

作成したコンポーネントの実行のためのTestPythonComponent.pyもUNOIDLtypeプロジェクト直下にコピーしました。

idlファイルをコンパイルするツールとしてLibreOffice5(41)ツールバーのプロパティを設定するxcuファイルで作成した、toolsフォルダをUNOIDLtypeプロジェクト直下にコピーしました。

toolsフォルダ内のスクリプトをカスタマイズします。

step1settings.pyを変更します。

BASE_NAME = "PythonComponent"  # これがrdbファイル名、.componentsファイル名、oxtファイル名になる。
BASE_NAMEをPythonComponentに変更しました。
# a list of a dict of Python UNO Component Files: (file name,service implementation name, service name,handled protocol)
LST = [
    {"PYTHON_UNO_Component":"component.py","IMPLE_NAME":'TestComponentB',"SERVICE_NAME":'com.sun.star.test.SomethingB',"HANDLED_PROTOCOL":"" }
       ]  # (Python UNO Componentファイル名、実装サービス名、サービス名,プロトコール名)の辞書のリスト。
Python UNO Componentファイル名: component.py、実装サービス名: TestComponentB、サービス名: com.sun.star.test.SomethingB、プロトコール名: ""の辞書を設定しました。

これでstep2createRDB.pyを実行すると、srcフォルダにPythonComponent.uno.rdbが出力されました。

step4createManifest.pyを実行するとMETA-INF/manifest.cmlとPythonComponent.componentが出力されました。

見やすいようにLibreOffice5(39)ProtocolHandler Addon Javaのxcuファイルを出力するPythonスクリプトの方法でSource→Formatでフォーマットしておきました。

step5createOXT.pyを実行するとoxtファイルがoxtフォルダに出力され、step6depoyOXT.pyを実行すると拡張機能マネージャーが表示されてLibreOfficeにデプロイされるはず、、、

ERROR: missing whitespace before attribute in file:///home/pq/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu6049xzz7qa.tmp_/PythonComponent.oxt/PythonComponent.uno.rdb

unopkg failed.

うーん、なぜか失敗しますね。

rdbファイルはバイナリなので空白とか関係ないはずなのですけど。

原因がわかりました。

step4createManifest.pyでrdbファイルのmedia-typeがapplication/vnd.sun.star.configuration-dataになっていました。

これをapplication/vnd.sun.star.uno-typelibrary;type=RDBにしないといけません。

step4createManifest.pyを修正してデプロイできるようになりました。
Connected to a running office ...
Using remote servicemanager
Hello World! by Python UNO Component
The Office has been terminated.
TestPythonComponent.pyを実行してこのように出力されれば成功です。

Hello World!がTestPythonComponent.pyの21行目でUNOIDLの引数として渡された文字列です。

日本語も渡せました。

UNOIDLtype/UNOIDLtype at d48e3c1fad9358165b52fcacb8867e9f97d37865 · p--q/UNOIDLtype

TestPythonComponent.pyの20行目でUNOIDLで作成したTestComponentB(これは実装名、またはサービス名のcom.sun.star.test.SomethingB)でインスタンス化して次の行21目でTestComponentBのメソッドmethodTwo()の引数に文字列を渡しています。

idlファイルの定義名

#ifndef INCLUDED_COM_SUN_STAR_TEST_SOMETHINGB_IDL
#define INCLUDED_COM_SUN_STAR_TEST_SOMETHINGB_IDL

#include <XSomethingB.idl>

定義内容

#endif
idlファイルの#で始まる行はコメントではなくC++(Cでも)のマクロと同じ働きをしています。

LibreOfficeの例をみると#ifndefと#defineの引数の名前が今回のようにINCLUDEDで始まって大文字のものと、アンダーバーで始まる小文字のものがあります。
#ifndef _org_openoffice_test_ImageShrink_idl_
#define _org_openoffice_test_ImageShrink_idl_

#include <org/openoffice/test/XImageShrinkFilter.idl>

定義内容

#endif
LibreOffice(65)Writing UNO componentsのThumbs Exampleその1の例のidlファイルでは小文字バージョンです。

OpenOfficeのデベロッパーガイドではすべて小文字バージョンしかでてきません。

どう違うのか調べてみましたが、これは固有名詞なのでどっちでもよいようです。

このidlファイルで定義されているUNOIDLを二重に定義しないようにしているだけですので、他のファイルで使われることもないわけです。

OpenOfficeのデベロッパーガイドと揃えて小文字バージョンを使おうと思います。

#includeの引数のidlファイルは""ではなく<>で囲まれているので、Cのマクロとすると標準関数のヘッダファイルとしてインクルードされています。

次の関連記事:LibreOffice5(43)UNOIDLの引数の型の例を増やす

PR

0 件のコメント:

コメントを投稿