XULRunner:LDAP XPCOM
出典: MDC
標準では XULRunner は LDAP XPCOM サポート無しでビルドされています。もし XUL アプリケーションで LDAP コンポーネントを使いたいのであれば、二つのオプションがあります: XULRunner を LDAP サポートを有効にしてビルドする事、もう一つは LDAP XPCOM を XUL アプリ(のコンポーネントディレクトリ)に直接追加する事です。
いずれのケースでも、 --enable-ldap ビルドオプションを追加して、 LDAP XPCOM をビルドする必要があるでしょう。 XULRunner のビルドの仕方について詳細な情報 は Build_Documentation をごらんになってください。Configuring Build Options では、以下を .mozconfig ファイルに追加します:
ac_add_options --enable-ldap
これでビルドパッケージのコンポーネントディレクトリに以下の二つのファイルが作成されます:
- mozldap.dll (もしくは libmozldap.so かなにか...)
- mozldap.xpt
そしてビルドパッケージのルートディレクトリに以下の二つのファイルが作成されます: windows上では:
- nsldap32v50.dll
- nsldappr32v50.dll
linux上では:
- libldap50.so
- libprldap50.so
これらはネイティブの LDAP ライブラリです。
もし通常通りにこれらのファイルを XUL アプリの components に追加したとしても、これは動作しません。実際のところ、 LDAP インターフェイスは利用できます(例えば Components.interfaces.nsILDAPConnection は null ではありません)が、コンポーネントはロードできません(例えば、 Components.classes["@mozilla.org/network/ldap-connection;1"] は null になります)。これは実際にはネイティブの LDAP ライブラリファイルが XULRunner のプロセスが見つけられない事が原因となります。
解決方法としては bsmedberg の手法を使う事で、これは Using Dependent Libraries In Extension Components に述べられています: コンポーネントライブラリはリアルライブラリと全ての依存関係の loader となり、これは全ての必要なライブラリがロードされるという事です。
mozilla のソースコードディレクトリに extensions/ldapstub というサブディレクトリを作成し、二つのファイル、Makefile.in と LDAPStubLoader.cpp を入れます:
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);
}
そして .mozconfig を変更して次の行を追加します:
ac_add_options --enable-extensions=ldapstub
XULRunnnerを再ビルドします。これでビルドパッケージの components サブディレクトリに新しいファイル、 mozldap_stub.dll (Windows上) もしくは libmozldap_stub.so (Linux上) が作られるでしょう。
mozldap.xpt と mozldap_stub.dll を XUL アプリの components サブディレクトリにコピーします。 XULアプリのディレクトリに libraries サブディレクトリを作成し、mozldap.dll (もしくは libmozldap.so) をコピーして、そしてネイティブ LDAP バイナリをそこに入れます。
プロファイルを削除しておく事を忘れないでください。
これで LDAP コンポーネントが使えるようになります。