前の関連記事: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> 定義内容 #endifidlファイルの#で始まる行はコメントではなくC++(Cでも)のマクロと同じ働きをしています。
LibreOfficeの例をみると#ifndefと#defineの引数の名前が今回のようにINCLUDEDで始まって大文字のものと、アンダーバーで始まる小文字のものがあります。
#ifndef _org_openoffice_test_ImageShrink_idl_ #define _org_openoffice_test_ImageShrink_idl_ #include <org/openoffice/test/XImageShrinkFilter.idl> 定義内容 #endifLibreOffice(65)Writing UNO componentsのThumbs Exampleその1の例のidlファイルでは小文字バージョンです。
OpenOfficeのデベロッパーガイドではすべて小文字バージョンしかでてきません。
どう違うのか調べてみましたが、これは固有名詞なのでどっちでもよいようです。
このidlファイルで定義されているUNOIDLを二重に定義しないようにしているだけですので、他のファイルで使われることもないわけです。
OpenOfficeのデベロッパーガイドと揃えて小文字バージョンを使おうと思います。
#includeの引数のidlファイルは""ではなく<>で囲まれているので、Cのマクロとすると標準関数のヘッダファイルとしてインクルードされています。
0 件のコメント:
コメントを投稿