前の関連記事:LibreOffice(47)オブジェクトからメソッド名一覧を得る
TypeDescriptionManagerシングルトンgetByHierarchicalName()メソッドの戻り値は何?
LibreOffice SDK API ReferenceのgetByHierarchicalName()メソッドの項目には、戻り値の型は「any」になっていて、解説のところには、引数の名前で特定されたオブジェクトが返ってくる、と書いてあります。
getByHierarchicalName()メソッドがあるXHierarchicalNameAccessインターフェイスのDetailed DescriptionをみてもgetByHierarchicalName()メソッドから返ってくるオブジェクトがどういうものかはわかりません。
TypeDescriptionManagerサービスのExported Interfacesの項目のXHierarchicalNameAccessのほうに詳しい説明がありますが、よくわからずそこからTypeDescriptionProviderサービスに飛んでそこのXHierarchicalNameAccessのところでようやく戻り値のタイプがXTypeDescriptionインターフェイスであることがわかります。
getByHierarchicalName()メソッドの引数にいれた名前に対応してXTypeDescriptionインターフェイスを継承したこの継承図にあるいずれかのインターフェイスをもったオブジェクトが返ってくるようです。
さらに継承図をたどるとさらなるメソッドを含んだインターフェイスの型のオブジェクトであることがわかります。
LibreOffice(44)UNOオブジェクトの属性3:Writerドキュメントに出力のobj_atr()で、TypeDescriptionManagerシングルトンgetByHierarchicalName()メソッドの引数に対応して返ってくるオブジェクトの型を確認してみました。
def libreoffice48():
name = "com.sun.star.frame.XController" # getByHierarchicalName()メソッドの引数をここにいれる。
td = XSCRIPTCONTEXT.getComponentContext().getByName('/singletons/com.sun.star.reflection.theTypeDescriptionManager').getByHierarchicalName(name)
obj_atr(td)
def obj_atr(obj):
import re
match = re.findall(r"\((.+?)\)|(\w+?)=({)?([^}]+?)(?(3)}|,)", str(obj))
output = list()
dic = dict(implementationName="実装名(implementationName)",
supportedServices="使えるサービス(supportedServices)",
supportedInterfaces="使えるインターフェイス(supportedInterfaces)")
for i in match:
if i[0]:
list1 = ["継承している型", "\t"+i[0]]
else:
if "," in i[3]:
list0 = list(set(i[3].split(",")))
list0.sort()
list1 = [dic[i[1]]]
list1.extend(["".join(["\t", j]) for j in list0])
else:
list1 = [dic[i[1]], "\t"+i[3]]
list1.append("")
output.extend(list1)
txt = "\n".join(output)
desktop = XSCRIPTCONTEXT.getDesktop()
doc1 = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
doc1.getText().setString(txt)
doc1.getCurrentController().getViewCursor().jumpToFirstPage()
if __name__ == "__main__":
import unopy
XSCRIPTCONTEXT = unopy.connect()
if not XSCRIPTCONTEXT:
print("Failed to connect.")
import sys
sys.exit(0)
libreoffice48()
やってみると継承している型は全部com.sun.star.reflection.XTypeDescriptionになっているので、それに含まれるインターフェイスをみます。
インターフェイス名を渡したときcom.sun.star.reflection.XInterfaceTypeDescription2インターフェイスが返ってきます。
これはcom.sun.star.reflection.XInterfaceTypeDescriptionインターフェイスを継承したもので、それにgetBaseTypes()メソッドとgetOptionalBaseTypes()メソッドが追加されています。
サービス名を渡したときcom.sun.star.reflection.XServiceTypeDescription2が返ってきます。
メソッドは"com.sun.star.frame.XController::attachFrame"というようにインターフェイス名とダブルコロンでつなぐことで引数にできました。
このメソッドに対してはcom.sun.star.reflection.XInterfaceMemberTypeDescriptionインターフェイスが返ってきました。
インターフェイスを複数もつサービス(old-style)はXServiceTypeDescriptionインターフェイス、インターフェイスを1つしかもたないサービス(new-style)はXServiceTypeDescription2インターフェイスが返ってくるのかと思ったのですが、いずれもXServiceTypeDescription2インターフェイスが返ってきました。
インターフェイスもLibreOffice(13)デベロッパーガイド1 ほとんどの例はJavaでみたようなOpenOffice.org 2.0より前の多重継承ができない時代のインターフェイスではXInterfaceTypeDescriptionインターフェイス、その後の多重継承ができるインターフェイスはXServiceTypeDescription2インターフェイスが返る、という予測も、どれが古いインターフェイスなのかわからないので確認していませんが、サービスと同様にいずれにしてもXServiceTypeDescription2インターフェイスが返ってきそうですね。
参考にしたサイト
LibreOffice: com::sun::star Module Reference
LibreOffice 4.2 SDK API Reference


0 件のコメント:
コメントを投稿