2017年6月10日土曜日

17: サンプルUNO拡張機能(LibreOffice拡張機能またはApache OpenOffice拡張機能)を理解する、パート4

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

Main body START

UNO拡張機能ファイルのマニフェストファイルを作る

-Hypothesizer

それでは、UNO拡張機能ファイルのマニフェストファイルを作ろう。UNO拡張機能ファイルとは、UNO拡張機能の全体を格納するzipファイルのことだ。このマニフェストファイルは、UNO拡張機能にどのUNOデータタイプレジストリファイルが含まれているかを指定し、また、UNOコンポーネント設定ファイル(前記事で作った)の名前を指定する。

-Rebutter

ははあ。

-Hypothesizer

ファイルは、'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>
-Rebutter

ふむ?ふむ。いいだろう。

登録するグローバルUNOサービスの'グローバルUNOサービス'インスタンスファクトリを作る

-Hypothesizer

実のところ、これは必須ではないのだが、我々は、LibreOfficeに登録するグローバルUNOサービスの'グローバルUNOサービス'インスタンスファクトリを作る。

-Rebutter

「LibreOfficeに登録するグローバルUNOサービス」というのは、'thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions'のことだな?

-Hypothesizer

そう。グローバルUNOサービスはグローバルUNOサービスマネージャーを使ってインスタンス化することができ、もしそうするのであれば、この'グローバルUNOサービス'インスタンスファクトリは必要ない。'グローバルUNOサービス'インスタンスファクトリは、特定1つのグローバルUNOサービスのインスタンスのファクトリであり、Javaのスタティックメソッドクラスにマッピングされる。そうしたスタティックメソッドの1つを呼ぶだけで、グローバルUNOサービスのインスタンスを特定のUNOインターフェースのUNOプロキシとして得ることができるので、グローバルUNOサービスのインスタンスを得るのに、グローバルUNOサービスマネージャーを通してグローバルUNOサービスのインスタンスを得て、その後に特定のUNOインターフェースのUNOプロキシを得るよりも面倒が少ない。

-Rebutter

ははあ。

-Hypothesizer

'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
-Rebutter

ふーむ、このファクトリの名前を'thebiasplanet.uno.hiunoextensionsunoextension.HiUnoExtensions'としたのは必須なのか?

-Hypothesizer

そうだ。この名前は、グローバルUNOサービス名の名前と同じでなければならない。この2つの名前が同じであることでのみ、このファクトリはグローバルUNOサービスに結び付けられる。

-Rebutter

分かった。

-Hypothesizer

'#ifndef' ~ '#endif'のブロックは、その中のコードが複数回実行されないようにするためのものだ。この定義名は他の定義名と違っていれば何でもかまわない。

'#include'命令で、<>は、インクルードされるファイルがシステムインクルードディレクトリ配下の場合に使い、""は、インクルードされるファイルがユーザー独自のディレクトリ配下の場合に使う。

'XHiUnoExtensions'(フルネームでは'thebiasplanet::uno::hiunoextensionsunoextension::XHiUnoExtensions')は、このグローバルUNOサービスのファクトリメソッド群の戻りタイプだ。

-Rebutter

すると、このグローバルUNOサービスのインスタンスをこのUNOインターフェースタイプのUNOプロキシとして得るわけか?

-Hypothesizer

ブリッジを通してインスタンスを得る場合はそうだ。そうでない場合は、インスタンスは、UNOプロキシではなく、UNOコンポーネントインスタンスのオリジナルそのものになる。

UNOコンポーネントが複数のUNOインターフェースを実装している場合は、そうしたUNOインターフェースの1つを戻りデータタイプに指定することで、指定したデータタイプでインスタンスが得られる。UNO新スタイルサービスに対してだけファクトリが作れるというのは正しくないことに注意しよう。

-Rebutter

なるほど。

-Hypothesizer

'create1'は、ファクトリメソッドであり、Javaではスタティックメソッドにマッピングされる。引数と'raises'句についての説明は、UNOインターフェースに対して行なった説明と同じだ。ただし、ファクトリメソッドに'[out]'や'[inout]'は指定できないことには注意しよう。

他にもファクトリメソッドが欲しければ、最初のファクトリメソッドの後ろに追加すればよい。

-Rebutter

分かった。

-Hypothesizer

これで、手作業で作る構造物はすべて作った。

Main body END

References

  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>