LibreOffice(48)TypeDescriptionManagerシングルトンgetByHierarchicalName()メソッドの戻り値

ラベル: ,

前の関連記事:LibreOffice(47)オブジェクトからメソッド名一覧を得る


XTypeDescription型のオブジェクトが返ってくるのですがgetByHierarchicalName()の引数にするものによって使えるインターフェイスが異なります。デベロッパーズガイド(CoreReflection サービス XTypeDescription)を読んでもよくわからなかったので自分で調べてみました。

TypeDescriptionManagerシングルトンgetByHierarchicalName()メソッドの戻り値は何?


LibreOffice SDK API ReferencegetByHierarchicalName()メソッドの項目には、戻り値の型は「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.reflection.XServiceTypeDescriptionインターフェイスを継承し、それにisSingleInterfaceBased()メソッド、getInterface()メソッド、getConstructors()メソッドが加わっています。

メソッドは"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

次の関連記事:LibreOffice(49)オブジェクトからサービスとインターフェイスの継承関係辞書を生成

PR

0 件のコメント:

コメントを投稿