伝説のツール「NotesPeek」をQtでリメイクする(その12・サーバリストの取得)

今回のNSFinderでは、NotesPeekと同様に、ツリービューのルートに「Local」「Servers」という2つのアイテムを配置して、LocalにはNotesクライアントのデータディレクトリを、Serversには利用可能なDominoサーバのリストを取得してアイテム化します。

f:id:takahide-kondoh:20170617221810p:plain

サーバリストとは、NotesクライアントおよびAPIから見て、現在利用可能なDominoサーバのことで、サーバリストを取得するには、NSGetServerList関数を使用します。

// #include <ns.h>

STATUS LNPUBLIC NSGetServerList (char far *pPortName, DHANDLE far *retServerTextList);

pPortNameは、ポート名をLMBCS形式で指定します。デフォルトでよければ0を渡します。retServerTextListは、サーバ名のテキストリストに対応したハンドルを取得するためのポインタになります。

返ってくるハンドルをロックすると、次の順番で格納されたメモリブロックを取得できます。

  • サーバの数count(サイズ:WORD)

  • サーバ名の長さ×サーバ数(サイズ:WORD×count)

  • サーバ名×サーバ数

これと似た構造に、「その11」で説明したテキストリストがあります。

f:id:takahide-kondoh:20170613065006p:plain

伝説のツール「NotesPeek」をQtでリメイクする(その10・リスト型/範囲型) - Chiburu Systemsのブログ

先頭のWORD型がLIST構造体である以外は同じ構造です。また、LIST構造体はUSHORT型メンバーを1つしか持っておらず、そのUSHORT型は、32bitアプリではWORD型と同じなので、バイト数的にも同じになります。

それでは、私がこの関数を使って、NTLXライブラリにインプリメントした例をご紹介しておきます。まずはヘッダ部です。

// ntlx/status.h

/**
 * @brief サーバリストを取得する
 * @param list 格納先となるQStringのリストオブジェクトへの参照
 * @param port 検索するポート名
 * @return 処理ステータス
 */
NTLXSHARED_EXPORT Status getServers(
    QList<QString>& list
    , const QString& port = ""
    );

ポート名はQString型、受け取るサーバリストはQListで取得するようにします。

// status.cpp

Status getServers(QList<QString>& list, const QString& port)
{
  HANDLE handle = NULLHANDLE;
  Status result = NSGetServerList(
        port.isEmpty() ? 0 : Lmbcs::fromQString(port).data()
        , &handle
        );
  if (result.failure())
    return result;
  Q_ASSERT(handle);

  WORD* pLen = (WORD*)OSLockObject(handle);
  WORD count = *pLen++;
  char* pValue = (char*)(pLen + count);
  for (WORD i = 0; i < count; ++i)
  {
    Lmbcs value(pValue, *pLen);
    list.append(value.toQString());
    pValue += *pLen++;
  }

  OSUnlockObject(handle);
  OSMemFree(handle);
  return result;
}

構造自体はテキストリストの時と大差はありません。ポイントは、受け取ったテキストリストのハンドルは、受け取った側の責任で解放する必要がありますので、OSMemFreeを使います。

サーバリストは、あくまで現在利用可能なものなので、この関数で取得できたDominoサーバしかないというわけではありません。実際にはドミノディレクトリなどの登録情報を正として、この関数は補助や疎通用として利用する方がよいでしょう。詳しい疎通情報には、NSPingServerという関数を使うことができます。この関数では通りやすさはを0〜100で返してきます。100がさくさく通っており、0が通らない状態です。

次回はライブラリ側の最後のトピックとして、「名前(DomainName)」を説明したいと思います。