WSResolveLinkService (C 関数)

int WSResolveLinkService(WSENV e, WSResolveCallbackFunction f, const char *p, const char *n, void *c, WSServiceRef *r)

リンクサービス n の接続詳細を変換するネットワークについてのクエリを開始し,非同期的にコールバック関数 f を通じて接続詳細の適用を通知し,f にコンテキストオブジェクト c と変換操作参照 r を渡す.

詳細

  • アプリケーションがWSTPリンクサービスを利用するためには,アプリケーションは2つのことを行う必要がある.まず,アプリケーションは使用できるサービスをブラウズしなければならない.次に,アプリケーションは,ブラウズ操作の際に見付けたサービス名を変換して,リンクサービスに接続するためのリンク接続の詳細を得なければならない.
  • WSTPライブラリは,サービス n へのリンクを作成するWSOpen関数の1つを呼び出すのに必要な,コールバック関数 f,サービス名 n,リンクの名前,リンクプロトコル,リンクオプションを送信する.
  • サービス名をその接続詳細に転換することは,基本的に非同期の操作である.WSResolveLinkService()は,変換操作を開始し,すぐに返す.WSTPライブラリは,接続詳細が使用できるようになると,接続詳細とともにアプリケーションに対してコールバックを行う.
  • WSTPライブラリは接続詳細を非同期に提供するので,コールバック関数 f は,別のスレッドから同時にアクセスされる可能性があるデータ構造等の共有リソースへのアクセスを保護しなければならない.
  • コンテキストオブジェクト c は,アプリケーションがリンクサービスの変換に成功するために必要な任意オブジェクトへのポインタである.
  • WSStopResolvingLinkService()を使って変換操作を停止する.
  • WSResolveLinkService()は,関数が成功した場合には0を,関数が失敗した場合には非零の値を返す.
  • エラーの結果としてWSResolveLinkService()から返された非零の値は,wstp.hでのWSEエラーコードとWSError()によって返されるものに対応する.

例題

  (1)

#include <string.h> /* for memset, memcpy, etc... */
#include <stdio.h> /* for snprintf */
#include "wstp.h"

void ResolveCallbackFunction(WSENV e, WSServiceRef r, const char *serviceName, const char *linkName, const char *protocol, int options, void *context);

WSServiceRef startResolvingServiceWithNameAndProtocol(WSENV e,
    const char *name, const char *protocol)
{
    WSServiceRef theRef;
    int apiResult = 0;

    apiResult = WSResolveLinkService(e, ResolveCallbackFunction,
        protocol, name, NULL /* No context object for this example */,
        &theRef);
    if(apiResult != 0)
    { /* Handle the error */ }

    return theRef;
}


void ResolveCallbackFunction(WSENV e, WSServiceRef r, const char *serviceName, const char *linkName, const char *protocol, int options, void *context)
{
    WSLINK newLink = (WSLINK)0;
    int error = 0;
    int argc = 0;
    const char *argv[] = {
        "Dummy value representing program name",
        "-linkname",
        (const char *)0,
        "-linkprotocol",
        (const char *)0,
        "-linkconnect",
        "-linkoptions",
        (const char *)0,
        /* The following NULL pointer terminates the argv array */
        (const char *)0
    };

    char optionsBuffer[50];

    memset((void *)optionsBuffer, 0, sizeof(char) * 50));

    snprintf(optionsBuffer, 50, "%d", options);

    argv[2] = linkName;
    argv[4] = protocol;
    argv[7] = (const char *)optionsBuffer;

    argc = 8;

    newLink = WSOpenArgcArgv(e, argc, argv, &error);
    if(newLink == (WSLINK)0 || error != WSEOK)
    { /* Handle the error */ }

    /* ... */

    return;
}