blob: 38fe28447c43aab2bd5f91b58738d46a7f4b4352 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
---
title: Using LDAP XPCOM with XULRunner
slug: Archive/Mozilla/XULRunner/LDAP_XPCOM
tags:
- XUL
- XULRunner
translation_of: Archive/Mozilla/XULRunner/LDAP_XPCOM
---
<p> </p><p>標準では XULRunner は LDAP XPCOM サポート無しでビルドされています。もし XUL アプリケーションで LDAP コンポーネントを使いたいのであれば、二つのオプションがあります: XULRunner を LDAP サポートを有効にしてビルドする事、もう一つは LDAP XPCOM を XUL アプリ(のコンポーネントディレクトリ)に直接追加する事です。
</p><p>いずれのケースでも、 <tt>--enable-ldap</tt> ビルドオプションを追加して、 LDAP XPCOM をビルドする必要があるでしょう。 XULRunner のビルドの仕方について詳細な情報
は <a href="ja/Build_Documentation">Build_Documentation</a> をごらんになってください。<a href="ja/Configuring_Build_Options">Configuring Build Options</a> では、以下を .mozconfig ファイルに追加します:
</p>
<pre class="eval">ac_add_options --enable-ldap
</pre>
<p>これでビルドパッケージのコンポーネントディレクトリに以下の二つのファイルが作成されます:
</p>
<ul><li> <tt>mozldap.dll</tt> (もしくは libmozldap.so かなにか...)
</li><li> <tt>mozldap.xpt</tt>
</li></ul>
<p>そしてビルドパッケージのルートディレクトリに以下の二つのファイルが作成されます:
windows上では:
</p>
<ul><li> <tt>nsldap32v50.dll</tt>
</li><li> <tt>nsldappr32v50.dll</tt>
</li></ul>
<p>linux上では:
</p>
<ul><li> <tt>libldap50.so</tt>
</li><li> <tt>libprldap50.so</tt>
</li></ul>
<p>これらはネイティブの LDAP ライブラリです。
</p><p>もし通常通りにこれらのファイルを XUL アプリの <tt>components</tt> に追加したとしても、これは動作しません。実際のところ、 LDAP インターフェイスは利用できます(例えば <tt>Components.interfaces.nsILDAPConnection</tt> は null ではありません)が、コンポーネントはロードできません(例えば、 <tt>Components.classes["@mozilla.org/network/ldap-connection;1"]</tt> は null になります)。これは実際にはネイティブの LDAP ライブラリファイルが XULRunner のプロセスが見つけられない事が原因となります。
</p><p>解決方法としては bsmedberg の手法を使う事で、これは <a href="ja/Using_Dependent_Libraries_In_Extension_Components">Using Dependent Libraries In Extension Components</a> に述べられています: コンポーネントライブラリはリアルライブラリと全ての依存関係の loader となり、これは全ての必要なライブラリがロードされるという事です。
</p><p>mozilla のソースコードディレクトリに <tt>extensions/ldapstub</tt> というサブディレクトリを作成し、二つのファイル、<tt>Makefile.in</tt> と <tt>LDAPStubLoader.cpp</tt> を入れます:
</p><p>Makefile.in:
</p>
<pre># 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)\"
</pre>
<p>LDAPStubLoader.cpp:
</p>
<pre>// 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);
}
</pre>
<p>そして <tt>.mozconfig</tt> を変更して次の行を追加します:
</p>
<pre class="eval">ac_add_options --enable-extensions=ldapstub
</pre>
<p>XULRunnnerを再ビルドします。これでビルドパッケージの <tt>components</tt> サブディレクトリに新しいファイル、 <tt>mozldap_stub.dll</tt> (Windows上) もしくは <tt>libmozldap_stub.so</tt> (Linux上) が作られるでしょう。 </p><p><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 バイナリをそこに入れます。
</p><p>プロファイルを削除しておく事を忘れないでください。
</p><p>これで LDAP コンポーネントが使えるようになります。
</p><p><span class="comment">Interwiki Language Links</span>
</p>
|