あなたのプログラムをLibreOffice/OpenOfficeインスタンス(または任意のUNOサーバー)に接続する、オフィスドキュメントを読み書きしたりインスタンスを操作したりするために。
話題
About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: C++
この記事の目次
- 開始コンテキスト
- ターゲットコンテキスト
- オリエンテーション
- 本体
- 1: コンソールC++ UNOクライアントサンプルを取得してビルドする
- 2: サンプルプログラムを実行する
- 3: サンプルプログラムを理解する
- 3-1: プロジェクト群構造を理解する
- 3-2: 当ユーティリティプロジェクト群を使用してUNOサーバーに接続した後にしなければならないこと
- 3-3: UNOオブジェクト群コンテキストのラッパー
- 3-4: ローカルUNOオブジェクト群コンテキストを生成する(ブートストラッピング)
- 3-5: UNOサーバーに接続する
- 3-6: コネクションを切断する
- 4: オフィスインスタンスに接続する、より単純な方法があるが...
- 5: 結びとその先
開始コンテキスト
- 読者は、C++プログラミングの基本的知識を持っている。
- 読者は、UNOとは何かの知識(過去の記事の内容に同等の知識)を持っている。
- 読者は、UNOの基本的構成要素とそれらにこのシリーズで使われる用語体系の知識を持っている。
- 読者は、UNOプログラムをLinuxまたはWindowsで開発する環境を過去の記事(Linux用はこちらで Windows用はこちら)にしたがって構築した。
- 読者は、このシリーズに挙げられているサンプルプロジェクトをビルドする方法の知識を持っている。
- 読者は、LibreOfficeまたはApache OpenOfficeのインスタンスをUNOサーバーにする方法の知識を持っている。
ターゲットコンテキスト
- 読者は、外部コンソールC++プログラムをLibreOfficeまたはApache OpenOfficeのインスタンスに接続する方法を知る。
Hypothesizer 7、Objector 11A、Objector 11Bがコンピューターの前にいる。
オリエンテーション
Hypothesizer 7
この記事では、コンソールC++ UNOクライアントサンプルを取得、ビルド、実行、理解します。
実は、コンソールJava UNOクライアントサンプルについての過去の記事があり、コンセプト上は、コンソールC++ UNOクライアントサンプルは、そのコンソールJava UNOクライアントサンプルと何も違わず、その過去記事の記述のほとんどは、一部の、プログラミング言語固有の記法を除いて、このコンソールC++ UNOクライアントサンプルに当てはまります。
Objector 11A
だから何だ?Javaについてのお前のいまいましい過去記事を読めと俺に言っているのか、俺はJavaプログラマーでもないし、そうなるつもりもないというのに?
Hypothesizer 7
サー、私は、あなたに何かをやれとは全く言っておらず、その過去記事内の一部の記述とほとんど同じ記述をここで行なうことなく、私のいまいましい過去記事の一部のサブセクションを引用して、それらの中の一部の記法をC++用にどう置換すべきかを示しますとお知らせしているのです。
Objector 11A
「お知らせしている」?独断で決めたことをただ知らせるのか、お前は?
Hypothesizer 7
サー、私がそう決めたのは、その過去記事のそうしたサブセクションは、ほとんどどんなC++プログラマーにもとても十分に思われるからです。記法の違いさえも、特に示す必要があるようには思われません、それらは明白ですから、正確な記述を行なうという方針に基づいてここで説明はしますが。
Objector 11A
...「記法」とは何のことだ?
Hypothesizer 7
それは、'本体'が説明することですが、例えば、C++におけるクラスのフルネームの記法はJavaのそれとは違います。
Objector 11A
ふーむ...
Objector 11B
あなたには悪いけど、その'開始コンテキスト'に挙げられてるあなたの記事を読むつもりは私には全くありません、私は、サンプルプログラムが必要なだけですから。
Hypothesizer 7
それは私に悪くは全くありません。私はただ、説明を行なう時はいつでもその前提知識を明確にすべきであるという自らの原則に従っているだけです。
本体
1: コンソールC++ UNOクライアントサンプルを取得してビルドする
Hypothesizer 7
ここに、コンソールC++ UNOクライアントサンプルがあります。このシリーズに挙げられている任意のサンプルプロジェクトをビルドする方法は過去の記事に記載されています。
そのZIPファイルを展開した後、'hiConsoleCplusplusUnoClients'が、サンプルプログラムのプロジェクトディレクトリです。他2つのディレクトリは様々なプロジェクトから共通に使われるプロジェクトのものです。
開発環境を構築する方法は、過去の記事(Linux用はこちらで Windows用はこちら)で説明されています。
ト書き
Hypothesizer 7はターミナルを開いてサンプルプロジェクトをビルドする。
2: サンプルプログラムを実行する
Hypothesizer 7
サンプルプログラムを実行する前に、LibreOfficeまたはApache OpenOfficeのインスタンスを、クライアントからのコネクションを受け付ける状態で開始しておかなければなりません(その方法は、過去の記事で知ることができます)。
ト書き
Hypothesizer 7は、LibreOfficeのインスタンスをポート番号'2002'で開始する。
Hypothesizer 7
サンプルプログラムは、カレントディレクトリをサンプルプロジェクトディレクトリに位置させ、ファイルURLを環境に合わせて、以下のようにして実行できます。
@bash or cmd ソースコード
gradle i_executeCplusplusExecutableFileTask -Pc_commandLineArguments="socket,host=localhost,port=2002,tcpNoDelay=1;urp;StarOffice.ComponentContext file://${HOME}/myData/development/hiConsoleCplusplusUnoClients/execution/HiConsoleCplusplusUnoClientsTests.odt"
ト書き
Hypothesizer 7は、カレントディレクトリをサンプルプロジェクトディレクトリに位置させて、上記コマンドをターミナルで実行する。Writer文書がオープンし、その後、すぐにクローズする。
Objector 11A
ふーむ...
Hypothesizer 7
LibreOfficeまたはApache OpenOfficeのインスタンスがリモートホストにいる場合は、ホスト名を'localhost'から変更すればよいです、勿論、ファイアウォールが通信をブロックしなければですが。
3: サンプルプログラムを理解する
Hypothesizer 7
'オリエンテーション'で言及したとおり、コンソールC++UNOクライアントサンプルの説明は、コンソールJavaUNOクライアントサンプルのそれとほとんど同じであって、その過去記事内の一部の記述とほとんど同じ記述をここで行なうことなく、その過去記事の一部のサブセクションを引用して、それらの中の一部の記法をC++用にどう置換すべきかを示します。
3-1: プロジェクト群構造を理解する
Hypothesizer 7
3つのプロジェクト、'coreUtilitiesToBeDisclosed'、'unoUtilitiesToBeDisclosed'、'hiConsoleCplusplusUnoClients'があります。'coreUtilitiesToBeDisclosed'には、あらゆる種類のプロジェクトで共用されるように想定されているユーティリティコードが含まれています。'unoUtilitiesToBeDisclosed'には、UNOプログラムのプロジェクト群で共用されるように想定されているユーティリティコードが含まれています。'hiConsoleCplusplusUnoClientsは、サンプルプロジェクトです。
サンプルプログラムは、'unoUtilitiesToBeDisclosed'をただ使う以外のことはあまり行なわないので、私たちの外部コンソールC++プログラムをUNOサーバーにコネクトさせる方法を学ぶには、'unoUtilitiesToBeDisclosed'プロジェクトの中身を見る必要があります。
Objector 11A
...このユーティリティプロジェクトはJavaコードも含んでいるのか?
Hypothesizer 7
実はそうです、'coreUtilitiesToBeDisclosed'もそうですが。
Objector 11A
...そんなJavaコード、俺に必要なのか?
Hypothesizer 7
このコンソールC++ UNOクライアントサンプルには(将来の全ての(たぶん)C++サンプルにも)、いいえ、必要ありません。ユーティリティコードをプログラミング言語ベースのプロジェクト群に私がただ分割しなかっただけです。...Javaコードが全然必要なければ、'source/java'ディレクトリを削除してかまいません。
3-2: 当ユーティリティプロジェクト群を使用してUNOサーバーに接続した後にしなければならないこと
Hypothesizer 7
当ユーティリティプロジェクト群を万が一そのままご使用になるという場合のために、当ユーティリティプロジェクト群を使用してUNOサーバーにコネクトした後にしなければならないことを見ておきましょう。
実際には、C++ユーティリティクラス群の構造はJavaユーティリティクラス群のそれに準拠しているため、前記事のこのサブセクションの記述が、一部のプログラミング言語固有の記法を除いて当てはまります。
具体的には、"theBiasPlanet.unoUtilities.connectionsHandling.UnoConnection"といったJavaフルクラス名はどれも、'::theBiasPlanet::unoUtilities::connectionsHandling::UnoConnection'といった対応するC++フルクラス名で置き換える必要があります。
3-3: UNOオブジェクト群コンテキストのラッパー
Hypothesizer 7
'unoUtilitiesToBeDisclosed'プロジェクトの'::theBiasPlanet::unoUtilities::connectionsHandling::UnoObjectsContext'クラスは、UNOオブジェクト群コンテキストのラッパーです。
このラッパーについての前記事のこのサブセクションの記述が、一部のプログラミング言語固有の記法を除いて、ここに当てはまります。
具体的には、"theBiasPlanet.unoUtilities.connectionsHandling.UnoObjectsContext"といったJavaのフルクラス名やフルインターフェース名はどれも、'::theBiasPlanet::unoUtilities::connectionsHandling::UnoObjectsContext'といった対応するC++フルクラス名で置き換える必要があります。
3-4: ローカルUNOオブジェクト群コンテキストを生成する(ブートストラッピング)
Hypothesizer 7
'ブートストラッピング'のコンセプトについての前記事のこのサブセクションの記述は、ここに当てはまりますが、ローカルUNOオブジェクト群コンテキストを生成する方法は、C++では異なります。
以下が、ローカルUNOオブジェクト群コンテキストを生成する方法です、'::theBiasPlanet::unoUtilities::programsHandling::UnoProcessEnvironment'のコンストラクターに見られるとおり。
@C++ ソースコード
#include <com/sun/star/uno/Reference.hxx>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <cppuhelper/bootstrap.hxx>
Reference <XComponentContext> l_originalLocalObjectsContext = defaultBootstrap_InitialComponentContext ();
3-5: UNOサーバーに接続する
Hypothesizer 7
UNOサーバーに接続することについての前記事のこのサブセクションの記述が、一部のプログラミング言語固有の記法を除いて、ここに当てはまります。
具体的には、"com.sun.star.connection.XConnector"といったJavaのフルクラス名やフルインターフェース名や、クラスやインターフェースのスタティックメンバー名はどれも、'::com::sun::star::connection::XConnector'といった対応するC++のフルクラス名やスタティックメンバー名で置き換える必要があります。
Objector 11A
...UNOサービス名やイニシャルUNOオブジェクト名はどうなんだ?
Hypothesizer 7
それらは、プログラミング言語に依存しません。
3-6: コネクションを切断する
Hypothesizer 7
コネクションを切断することについての前記事のこのサブセクションの記述が、一部のプログラミング言語固有の記法を除いて、ここに当てはまります。
具体的には、"theBiasPlanet.unoUtilities.connectionsHandling.UnoConnection"といったJavaのフルクラス名やフルインターフェース名はどれも、'::theBiasPlanet::unoUtilities::connectionsHandling::UnoConnection'といった対応するC++フルクラス名で置き換える必要があります。
4: オフィスインスタンスに接続する、より単純な方法があるが...
Hypothesizer 7
実は、オフィスインスタンスに接続する、より単純な方法があります、しかし、その方法にはいくつか制限があり、それらは、ある種のケースにおいて致命的です。
以前の記事のこのセクションの議論が、ここに、そのまま、当てはまります。
5: 結びとその先
Hypothesizer 7
これで、コンソールC++ UNOクライアントから、任意のUNOサーバーにコネクトすることができます。
当サンプルを'コンソール'クライアントと特に断わったのは、GUI C++ UNOクライアントサンプルを将来の記事で紹介するからです。
GUI C++ UNOクライアントは、UNO上、コンソールC++ UNOクライアントと違う必要がないように思われるかもしれませんが、1つ違いがあります。UNOクライアントが長い間動作し続けると想定されるため、UNOサーバーまたはネットワークによって引き起こされるコネクション切断を検知することがより適切となります。
また、他のプログラミング言語(C#)によるUNOクライアントも見ていきます、将来の記事にて。