Using LDAP XPCOM with XULRunner

標準では XULRunner は LDAP XPCOM サポート無しでビルドされています。もし XUL アプリケーションで LDAP コンポーネントを使いたいのであれば、二つのオプションがあります: XULRunner を LDAP サポートを有効にしてビルドする事、もう一つは LDAP XPCOM を XUL アプリ(のコンポーネントディレクトリ)に直接追加する事です。

いずれのケースでも、 <tt>--enable-ldap</tt> ビルドオプションを追加して、 LDAP XPCOM をビルドする必要があるでしょう。 XULRunner のビルドの仕方について詳細な情報 は Build_Documentation をごらんになってください。Configuring Build Options では、以下を .mozconfig ファイルに追加します:

ac_add_options --enable-ldap

これでビルドパッケージのコンポーネントディレクトリに以下の二つのファイルが作成されます:

  • <tt>mozldap.dll</tt> (もしくは libmozldap.so かなにか...)
  • <tt>mozldap.xpt</tt>

そしてビルドパッケージのルートディレクトリに以下の二つのファイルが作成されます: windows上では:

  • <tt>nsldap32v50.dll</tt>
  • <tt>nsldappr32v50.dll</tt>

linux上では:

  • <tt>libldap50.so</tt>
  • <tt>libprldap50.so</tt>

これらはネイティブの LDAP ライブラリです。

もし通常通りにこれらのファイルを XUL アプリの <tt>components</tt> に追加したとしても、これは動作しません。実際のところ、 LDAP インターフェイスは利用できます(例えば <tt>Components.interfaces.nsILDAPConnection</tt> は null ではありません)が、コンポーネントはロードできません(例えば、 <tt>Components.classes["@mozilla.org/network/ldap-connection;1"]</tt> は null になります)。これは実際にはネイティブの LDAP ライブラリファイルが XULRunner のプロセスが見つけられない事が原因となります。

解決方法としては bsmedberg の手法を使う事で、これは Using Dependent Libraries In Extension Components に述べられています: コンポーネントライブラリはリアルライブラリと全ての依存関係の loader となり、これは全ての必要なライブラリがロードされるという事です。

mozilla のソースコードディレクトリに <tt>extensions/ldapstub</tt> というサブディレクトリを作成し、二つのファイル、<tt>Makefile.in</tt> と <tt>LDAPStubLoader.cpp</tt> を入れます:

Makefile.in:

# Copyright (c) 2005 Benjamin Smedberg <benjamin@smedbergs.us>

DEPTH = ../..
srcdir = @srcdir@
topsrcdir = @top_srcdir@
VPATH = @srcdir@

include $(DEPTH)/config/autoconf.mk

MODULE = mozldapstub
LIBRARY_NAME = mozldap_stub
IS_COMPONENT = 1
FORCE_SHARED_LIB = 1

REQUIRES = \
	xpcom \
	string \
	$(NULL)

CPPSRCS = LDAPStubLoader.cpp

EXTRA_DSO_LDOPTS += \
	$(DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
	$(XPCOM_FROZEN_LDOPTS) \
        $(NSPR_LIBS) \
	$(NULL)

include $(topsrcdir)/config/rules.mk

DEFINES += -DMOZ_DLL_PREFIX=\"$(DLL_PREFIX)\"

LDAPStubLoader.cpp:

// Copyright (c) 2005 Benjamin Smedberg <benjamin@smedbergs.us>

#include "nscore.h"
#include "nsModule.h"
#include "prlink.h"
#include "nsILocalFile.h"
#include "nsStringAPI.h"
#include "nsCOMPtr.h"

static char const *const kDependentLibraries[] =
{
#ifdef NS_WIN32
  MOZ_DLL_PREFIX "nsldap32v50" MOZ_DLL_SUFFIX,
  MOZ_DLL_PREFIX "nsldappr32v50" MOZ_DLL_SUFFIX,
#endif //NS_WIN32
#ifdef NS_UNIX
  MOZ_DLL_PREFIX "ldap50" MOZ_DLL_SUFFIX,
  MOZ_DLL_PREFIX "prldap50" MOZ_DLL_SUFFIX,
#endif //NS_UNIX
  nsnull
};

// component.dll on windows, libcomponent.dll on linux
static char kRealComponent[] = MOZ_DLL_PREFIX "mozldap" MOZ_DLL_SUFFIX;

nsresult
NSGetModule(nsIComponentManager* aCompMgr,
            nsIFile* aLocation,
            nsIModule* *aResult)
{
  nsresult rv;

  nsCOMPtr<nsIFile> libraries;
  rv = aLocation->GetParent(getter_AddRefs(libraries));
  if (NS_FAILED(rv))
    return rv;

  nsCOMPtr<nsILocalFile> library(do_QueryInterface(libraries));
  if (!library)
    return NS_ERROR_UNEXPECTED;

  library->SetNativeLeafName(NS_LITERAL_CSTRING("libraries"));
  library->AppendNative(NS_LITERAL_CSTRING("dummy"));

  // loop through and load dependent libraries
  for (char const *const *dependent = kDependentLibraries;
       *dependent;
       ++dependent) {
    library->SetNativeLeafName(nsDependentCString(*dependent));
    PRLibrary *lib;
    library->Load(&lib);
    // 1) We don't care if this failed!
    // 2) We are going to leak this library. We don't care about that either.
  }

  library->SetNativeLeafName(NS_LITERAL_CSTRING(kRealComponent));

  PRLibrary *lib;
  rv = library->Load(&lib);
  if (NS_FAILED(rv))
    return rv;

  nsGetModuleProc getmoduleproc = (nsGetModuleProc)
    PR_FindFunctionSymbol(lib, NS_GET_MODULE_SYMBOL);

  if (!getmoduleproc)
    return NS_ERROR_FAILURE;

  return getmoduleproc(aCompMgr, aLocation, aResult);
}

そして <tt>.mozconfig</tt> を変更して次の行を追加します:

ac_add_options --enable-extensions=ldapstub

XULRunnnerを再ビルドします。これでビルドパッケージの <tt>components</tt> サブディレクトリに新しいファイル、 <tt>mozldap_stub.dll</tt> (Windows上) もしくは <tt>libmozldap_stub.so</tt> (Linux上) が作られるでしょう。

<tt>mozldap.xpt</tt> と <tt>mozldap_stub.dll</tt> を XUL アプリの <tt>components</tt> サブディレクトリにコピーします。 XULアプリのディレクトリに <tt>libraries</tt> サブディレクトリを作成し、<tt>mozldap.dll</tt> (もしくは <tt>libmozldap.so</tt>) をコピーして、そしてネイティブ LDAP バイナリをそこに入れます。

プロファイルを削除しておく事を忘れないでください。

これで LDAP コンポーネントが使えるようになります。

Interwiki Language Links

Document Tags and Contributors

タグ:
Contributors to this page: Btm
最終更新者: Btm,