標準では 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 <[email protected]> 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 <[email protected]> #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