<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>
それでは、UNO拡張機能ファイルのマニフェストファイルを作ろう。UNO拡張機能ファイルとは、UNO拡張機能の全体を格納するzipファイルのことだ。このマニフェストファイルは、UNO拡張機能にどのUNOデータタイプレジストリファイルが含まれているかを指定し、また、UNOコンポーネント設定ファイル(前記事で作った)の名前を指定する。
ははあ。
ファイルは、'source'ディレクトリ配下の'resource/'manifest.xml'で、このファイルに以下を書く。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
<!-- # Change the registry file path -->
<manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-typelibrary;type=RDB" manifest:full-path="thebiasplanet.hiunoextensionsunoextension.uno.rdb"/>
<!-- # Change the components file path -->
<manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-components" manifest:full-path="thebiasplanet.hiunoextensionsunoextension.uno.components"/>
</manifest:manifest>
ふむ?ふむ。いいだろう。
実のところ、これは必須ではないのだが、我々は、LibreOfficeに登録するグローバルUNOサービスの'グローバルUNOサービス'インスタンスファクトリを作る。
「LibreOfficeに登録するグローバルUNOサービス」というのは、'thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions'のことだな?
そう。グローバルUNOサービスはグローバルUNOサービスマネージャーを使ってインスタンス化することができ、もしそうするのであれば、この'グローバルUNOサービス'インスタンスファクトリは必要ない。'グローバルUNOサービス'インスタンスファクトリは、特定1つのグローバルUNOサービスのインスタンスのファクトリであり、Javaのスタティックメソッドクラスにマッピングされる。そうしたスタティックメソッドの1つを呼ぶだけで、グローバルUNOサービスのインスタンスを特定のUNOインターフェースのUNOプロキシとして得ることができるので、グローバルUNOサービスのインスタンスを得るのに、グローバルUNOサービスマネージャーを通してグローバルUNOサービスのインスタンスを得て、その後に特定のUNOインターフェースのUNOプロキシを得るよりも面倒が少ない。
ははあ。
'source'ディレクトリ配下にUNOIDLファイル、'unoIdl/thebiasplanet/uno/hiunoextensionsunoextension/HiUnoExtensions.idl'を作り、このファイルに以下を書く。
// # Change the defined variable name START
#ifndef __thebiasplanet_uno_hiunoextensionsunoextension_HiUnoExtensions_idl__
#define __thebiasplanet_uno_hiunoextensionsunoextension_HiUnoExtensions_idl__
// # Change the defined variable name END
// # Change the interface idl
#include "thebiasplanet/uno/hiunoextensionsunoextension/XHiUnoExtensions.idl"
// # Change the module name
module thebiasplanet { module uno { module hiunoextensionsunoextension {
// # Change the service name and the interface name
service HiUnoExtensions: XHiUnoExtensions {
// # Add constructors START
create1 ( [in] string p_message)
raises (com::sun::star::lang::IllegalArgumentException);
// # Add constructors END
};
}; }; };
#endif
ふーむ、このファクトリの名前を'thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions'としたのは必須なのか?
そうだ。この名前は、グローバルUNOサービス名の名前と同じでなければならない。この2つの名前が同じであることでのみ、このファクトリはグローバルUNOサービスに結び付けられる。
分かった。
'#ifndef' ~ '#endif'のブロックは、その中のコードが複数回実行されないようにするためのものだ。この定義名は他の定義名と違っていれば何でもかまわない。
'#include'命令で、<>は、インクルードされるファイルがシステムインクルードディレクトリ配下の場合に使い、""は、インクルードされるファイルがユーザー独自のディレクトリ配下の場合に使う。
'XHiUnoExtensions'(フルネームでは'thebiasplanet::uno::hiunoextensionsunoextension::XHiUnoExtensions')は、このグローバルUNOサービスのファクトリメソッド群の戻りタイプだ。
すると、このグローバルUNOサービスのインスタンスをこのUNOインターフェースタイプのUNOプロキシとして得るわけか?
ブリッジを通してインスタンスを得る場合はそうだ。そうでない場合は、インスタンスは、UNOプロキシではなく、UNOコンポーネントインスタンスのオリジナルそのものになる。
UNOコンポーネントが複数のUNOインターフェースを実装している場合は、そうしたUNOインターフェースの1つを戻りデータタイプに指定することで、指定したデータタイプでインスタンスが得られる。UNO新スタイルサービスに対してだけファクトリが作れるというのは正しくないことに注意しよう。
なるほど。
'create1'は、ファクトリメソッドであり、Javaではスタティックメソッドにマッピングされる。引数と'raises'句についての説明は、UNOインターフェースに対して行なった説明と同じだ。ただし、ファクトリメソッドに'[out]'や'[inout]'は指定できないことには注意しよう。
他にもファクトリメソッドが欲しければ、最初のファクトリメソッドの後ろに追加すればよい。
分かった。
これで、手作業で作る構造物はすべて作った。
- Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide