Fixes various sr= issues turned up in preparation for turning on LDAP in the default builds (bug 70658). Removes obsolete and private interface methods; fixes spacing, and lots of misc cleanups. moa=me, sr=shaver@mozilla.org

git-svn-id: svn://10.0.0.236/trunk@89068 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dmose%netscape.com
2001-03-09 03:25:47 +00:00
parent 80fcf7044d
commit af8a05701f
35 changed files with 1026 additions and 736 deletions

View File

@@ -9,7 +9,7 @@
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the mozilla.org LDAP XPCOM component.
# The Original Code is the mozilla.org LDAP XPCOM SDK.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are

View File

@@ -39,6 +39,8 @@ items blocked waiting for other work
GetStatus to return OK, and asserts when it doesn't. (blocked waiting
on insight from Warren about nsSocketTransport's use of mCancelStatus).
* ensure that multiple calls to Cancel don't do the wrong thing
* move the ldap_unbind() call out of the nsLDAPConnection destructor,
since nsLDAPConnection will soon go back to being callable from the
UI thread, and ldap_unbind() is actually synchronous. additionally,
@@ -66,6 +68,9 @@ misc
nsLDAPMessage::Init(), this is probably no longer an issue there at
least. Need to confirm.
* replace instances of (obsolete) |static NS_DEFINE_IID| variables
with direct calls to NS_GET_IID in the code.
* investigate use of DNS in LDAP sdk. I think sync functions used in the
wrong places (eg they end up getting called from Mozilla on the UI thread)?

View File

@@ -9,7 +9,7 @@
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the mozilla.org LDAP XPCOM component.
# The Original Code is the mozilla.org LDAP XPCOM SDK.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are

View File

@@ -3,3 +3,4 @@ nsILDAPOperation.idl
nsILDAPMessage.idl
nsILDAPURL.idl
nsILDAPMessageListener.idl
nsILDAPErrors.idl

View File

@@ -9,7 +9,7 @@
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the mozilla.org LDAP XPCOM component.
# The Original Code is the mozilla.org LDAP XPCOM SDK.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
@@ -46,6 +46,7 @@ XPIDLSRCS = nsILDAPConnection.idl \
nsILDAPMessage.idl \
nsILDAPMessageListener.idl \
nsILDAPURL.idl \
nsILDAPErrors.idl \
$(NULL)
EXPORTS = \

View File

@@ -30,6 +30,7 @@ XPIDLSRCS= .\nsILDAPConnection.idl \
.\nsILDAPMessage.idl \
.\nsILDAPURL.idl \
.\nsILDAPMessageListener.idl \
.\nsILDAPErrors.idl \
$(NULL)
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,11 +10,11 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is part of the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Copyright (C) 2000, 2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@mozilla.org>
@@ -33,14 +34,6 @@
#include "nsISupports.idl"
// for the ldapPtr typedef
//
%{C++
#include "ldap.h"
%}
[ptr] native ldapConnectionHandle(LDAP);
interface nsILDAPOperation;
[scriptable, uuid(337ad2fe-1dd2-11b2-89f8-aae1221ec86c)]
@@ -61,52 +54,33 @@ interface nsILDAPConnection : nsISupports
/**
* set up the connection.
*
* @param aHost server name for ldap_init()
* @param aPort server port number for ldap_init()
* @param aHost server name for ldap_init()
* @param aPort server port number for ldap_init()
* 0 == default port (389)
* @param aBindName DN to bind as
* @param aBindName DN to bind as
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_NOT_AVAILABLE Couldn't create thread.
* @exception NS_ERROR_FAILURE
* @exception NS_ERROR_UNEXPECTED internal error
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_NOT_AVAILABLE Couldn't create thread.
* @exception NS_ERROR_FAILURE
* @exception NS_ERROR_UNEXPECTED internal error
*/
void init(in string aHost, in short aPort, in string aBindName);
// wrapper for ldap_get_lderrno()
/**
* Get information about the last error that occured on this connection.
*
* @param matched if the server is returning LDAP_NO_SUCH_OBJECT,
* LDAP_ALIAS_PROBLEM, LDAP_INVALID_DN_SYNTAX,
* or LDAP_ALIAS_DEREF_PROBLEM, this will contain
* the portion of DN that matches the entry that is
* closest to the requested entry
*
* @param s additional error information from the server
*
* @return the error code, as defined in nsILDAPErrors.idl
*/
long getLdErrno(out string matched, out string s);
/**
* really only for the internal use of nsLDAPOperation and friends
*
* @exception NS_ERROR_ILLEGAL_VALUE pointer passed in was NULL
*/
[noscript] readonly attribute ldapConnectionHandle connectionHandle;
/**
* Add an nsILDAPOperation to the list of operations pending on
* this connection. This is also mainly intended for use by the
* nsLDAPOperation code. Used so that the thread waiting on messages
* for this connection has an operation to callback to.
*
* @param aOperation operation to add
* @exception NS_ERROR_ILLEGAL_VALUE aOperation was NULL
* @exception NS_ERROR_UNEXPECTED this operation's msgId was not
* unique to this connection
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
*/
void addPendingOperation(in nsILDAPOperation aOperation);
/**
* Remove an nsILDAPOperation from the list of operations pending on this
* connection. Mainly intended for use by the nsLDAPOperation code.
*
* @param aOperation operation to add
* @exception NS_ERROR_INVALID_POINTER aOperation was NULL
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
* @exception NS_ERROR_FAILURE could not delete the operation
*/
void removePendingOperation(in nsILDAPOperation aOperation);
};

View File

@@ -0,0 +1,229 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is part of the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2001 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@netscape.com> (Original Author)
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
#include "nsISupports.idl"
/**
* Error codes used in the LDAP XPCOM SDK.
*
* Taken from the Mozilla C SDK's ldap.h include file, these should be
* the same as those specified in the draft-ietf-ldapext-ldap-c-api-04.txt
* Internet Draft.
*
* The only good documentation I'm aware of for these error codes is
* at <http://docs.iplanet.com/docs/manuals/directory.html#SDKC>.
* Unfortunately, this does not currently seem to be available under any
* open source license, so I can't include that documentation here as
* doxygen comments.
*
*/
[scriptable, uuid(f9ac10fa-1dd1-11b2-9798-8d5cbda95d74)]
interface nsILDAPErrors : nsISupports
{
const long SUCCESS = 0x00;
const long OPERATIONS_ERROR = 0x01;
const long PROTOCOL_ERROR = 0x02;
const long TIMELIMIT_EXCEEDED = 0x03;
const long SIZELIMIT_EXCEEDED = 0x04;
const long COMPARE_FALSE = 0x05;
const long COMPARE_TRUE = 0x06;
const long STRONG_AUTH_NOT_SUPPORTED = 0x07;
const long STRONG_AUTH_REQUIRED = 0x08;
/**
* UMich LDAPv2 extension
*/
const long PARTIAL_RESULTS = 0x09;
/**
* new in LDAPv3
*/
const long REFERRAL = 0x0a;
/**
* new in LDAPv3
*/
const long ADMINLIMIT_EXCEEDED = 0x0b;
/**
* new in LDAPv3
*/
const long UNAVAILABLE_CRITICAL_EXTENSION = 0x0c;
/**
* new in LDAPv3
*/
const long CONFIDENTIALITY_REQUIRED = 0x0d;
/**
* new in LDAPv3
*/
const long SASL_BIND_IN_PROGRESS = 0x0e;
const long NO_SUCH_ATTRIBUTE = 0x10;
const long UNDEFINED_TYPE = 0x11;
const long INAPPROPRIATE_MATCHING = 0x12;
const long CONSTRAINT_VIOLATION = 0x13;
const long TYPE_OR_VALUE_EXISTS = 0x14;
const long INVALID_SYNTAX = 0x15;
const long NO_SUCH_OBJECT = 0x20;
const long ALIAS_PROBLEM = 0x21;
const long INVALID_DN_SYNTAX = 0x22;
/**
* not used in LDAPv3
*/
const long IS_LEAF = 0x23;
const long ALIAS_DEREF_PROBLEM = 0x24;
const long INAPPROPRIATE_AUTH = 0x30;
const long INVALID_CREDENTIALS = 0x31;
const long INSUFFICIENT_ACCESS = 0x32;
const long BUSY = 0x33;
const long UNAVAILABLE = 0x34;
const long UNWILLING_TO_PERFORM = 0x35;
const long LOOP_DETECT = 0x36;
/**
* server side sort extension
*/
const long SORT_CONTROL_MISSING = 0x3C;
/**
* VLV extension
*/
const long INDEX_RANGE_ERROR = 0x3D;
const long NAMING_VIOLATION = 0x40;
const long OBJECT_CLASS_VIOLATION = 0x41;
const long NOT_ALLOWED_ON_NONLEAF = 0x42;
const long NOT_ALLOWED_ON_RDN = 0x43;
const long ALREADY_EXISTS = 0x44;
const long NO_OBJECT_CLASS_MODS = 0x45;
/**
* reserved CLDAP
*/
const long RESULTS_TOO_LARGE = 0x46;
/**
* new in LDAPv3
*/
const long AFFECTS_MULTIPLE_DSAS = 0x47;
const long OTHER = 0x50;
const long SERVER_DOWN = 0x51;
const long LOCAL_ERROR = 0x52;
const long ENCODING_ERROR = 0x53;
const long DECODING_ERROR = 0x54;
const long TIMEOUT = 0x55;
const long AUTH_UNKNOWN = 0x56;
const long FILTER_ERROR = 0x57;
const long USER_CANCELLED = 0x58;
const long PARAM_ERROR = 0x59;
const long NO_MEMORY = 0x5a;
const long CONNECT_ERROR = 0x5b;
/**
* new in LDAPv3
*/
const long NOT_SUPPORTED = 0x5c;
/**
* new in LDAPv3
*/
const long CONTROL_NOT_FOUND = 0x5d;
/**
* new in LDAPv3
*/
const long NO_RESULTS_RETURNED = 0x5e;
/**
* new in LDAPv3
*/
const long MORE_RESULTS_TO_RETURN = 0x5f;
/**
* new in LDAPv3
*/
const long CLIENT_LOOP = 0x60;
/**
* new in LDAPv3
*/
const long REFERRAL_LIMIT_EXCEEDED = 0x61;
};

View File

@@ -10,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -35,34 +35,11 @@
#include "nsISupports.idl"
#include "nsILDAPOperation.idl"
// for the ldapMsgHandle typedef
//
%{C++
#include "ldap.h"
%}
[ptr] native ldapMsgHandle(LDAPMessage);
[scriptable, uuid(973ff50f-2002-4f0c-b57d-2242156139a2)]
interface nsILDAPMessage : nsISupports
{
/**
* Initializes a message.
*
* @param aConnection The connection this message lives on.
* @param aMsgHandle The native LDAPMessage to be wrapped.
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_UNEXPECTED internal err; shouldn't happen
* @exception NS_ERROR_LDAP_DECODING_ERROR problem during BER decoding
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
*/
[noscript] void init(in nsILDAPConnection aConnection,
in ldapMsgHandle aMsgHandle);
/**
* The Distinguished Name of the entry associated with this message.
* Wrapper for ldap_get_dn().
*
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
@@ -72,7 +49,7 @@ interface nsILDAPMessage : nsISupports
readonly attribute string dn;
/**
* wrapper for ldap_{first,next}_attribute()
* Get all the attributes in this message.
*
* @exception NS_ERROR_OUT_OF_MEMORY
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
@@ -85,7 +62,7 @@ interface nsILDAPMessage : nsISupports
[retval, array, size_is(count)] out string aAttributes);
/**
* wrapper for ldap_get_values()
* Get an array of all the attribute values in this message.
*
* @param attr The attribute whose values are to be returned
* @param count Number of values in the outbound array.
@@ -100,30 +77,81 @@ interface nsILDAPMessage : nsISupports
[retval, array, size_is(count)] out string values);
/**
* The result code (ie lderrno) for this message.
* The result code (aka lderrno) for this message.
*
* XXXdmose these codes are defined in ldap.h; presumably need to reexport
* these as IDL constants (or somehow map to nsresults?)
* IDL definitions for these constants live in nsILDAPErrors.idl.
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
*/
readonly attribute long errorCode;
/**
* Wrapper for ldap_msgtype()
*
* XXXdmose the message types are defined in ldap.h; presumably need
* to reexport these as IDL constants
* The result type of this message. Possible types listed below, the
* values chosen are taken from the draft-ietf-ldapext-ldap-c-api-04.txt
* and are the same ones used in the ldap.h include file from the Mozilla
* LDAP C SDK.
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_UNEXPECTED internal error (possible memory
* corruption)
*
*/
readonly attribute long type;
// returns an LDIF-like string representation of this message
// XXXdmose - should use wstring here
//
string toString();
/**
* Result of a bind operation
*/
const long RES_BIND = 0x61;
/**
* An entry found in an search operation.
*/
const long RES_SEARCH_ENTRY = 0x64;
/**
* An LDAPv3 search reference (a referral to another server)
*/
const long RES_SEARCH_REFERENCE = 0x73;
/**
* The result of a search operation (i.e. the search is done; no more
* entries to follow).
*/
const long RES_SEARCH_RESULT = 0x65;
/**
* The result of a modify operation.
*/
const long RES_MODIFY = 0x67;
/**
* The result of an add operation
*/
const long RES_ADD = 0x69;
/**
* The result of a delete operation
*/
const long RES_DELETE = 0x6B;
/**
* The result of an modify DN operation
*/
const long RES_MODDN = 0x6D;
/**
* The result of a compare operation
*/
const long RES_COMPARE = 0x6F;
/**
* The result of an LDAPv3 extended operation
*/
const long RES_EXTENDED = 0x78;
/**
* get an LDIF-like string representation of this message
*
* @return unicode encoded string representation.
*/
wstring toUnicode();
};

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -34,10 +35,11 @@
#include "nsISupports.idl"
#include "nsILDAPMessage.idl"
// a callback interface to be implemented by any objects that want to
// receive results from an nsILDAPOperation (ie nsILDAPMessages) as they
// come in.
//
/**
* A callback interface to be implemented by any objects that want to
* receive results from an nsILDAPOperation (ie nsILDAPMessages) as they
* come in.
*/
[scriptable, uuid(dc721d4b-3ff2-4387-a80c-5e29545f774a)]
interface nsILDAPMessageListener : nsISupports
{

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -45,7 +46,7 @@ interface nsILDAPOperation : nsISupports
/**
* The connection this operation is on.
*
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
*/
readonly attribute nsILDAPConnection connection;
@@ -54,16 +55,16 @@ interface nsILDAPOperation : nsISupports
* by the init() method). This is actually an nsISupports proxy object,
* as the callback will happen from another thread.
*
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
*/
readonly attribute nsILDAPMessageListener messageListener;
/**
* The message-id associated with this operation.
*
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
*/
readonly attribute long messageId;
readonly attribute long messageID;
/**
* Initializes this operation. Must be called prior to initiating
@@ -75,40 +76,33 @@ interface nsILDAPOperation : nsISupports
* @param aConnection connection this operation should use
* @param aMessageListener interface used to call back the results.
*
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
* @exception NS_ERROR_UNEXPECTED failed to get connection handle
* @exception NS_ERROR_ILLEGAL_VALUE a NULL pointer was passed in
* @exception NS_ERROR_UNEXPECTED failed to get connection handle
*/
void init(in nsILDAPConnection aConnection,
in nsILDAPMessageListener aMessageListener);
/**
* wrapper for ldap_simple_bind()
* Asynchronously authenticate to the LDAP server.
*
* @param passwd the password used for binding; NULL for anon-binds
*
* @exception NS_ERROR_LDAP_ENCODING_ERROR problem encoding bind request
* @exception NS_ERROR_FAILURE server down (XXX rebinds?)
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_UNEXPECTED internal error
* @exception NS_ERROR_LDAP_ENCODING_ERROR problem encoding bind request
* @exception NS_ERROR_FAILURE server down (XXX rebinds?)
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_UNEXPECTED internal error
*
*/
void simpleBind(in string passwd);
// wrapper for ldap_search_url()
// XXX this doesn't currently work right, because the connection has
// doesn't know what result came for whom. also, the it calls
// a synchronous bind function under the hood
//
// XXXdmose should probably get rid of this method, due to it's
// synchronity, and since we have other classes to
//
void urlSearch(in string url, in boolean attrsonly);
/**
* wrapper for ldap_search_ext(): kicks off an async search request.
* Kicks off an asynchronous search request. The "ext" stands for
* "extensions", and is intended to convey that this method will
* eventually support the extensions described in the
* draft-ietf-ldapext-ldap-c-api-04.txt Internet Draft.
*
* @param aBaseDn Base DN to search
* @param aScope One of LDAP_SCOPE_{BASE,ONELEVEL,SUBTREE}
* @param aScope One of SCOPE_{BASE,ONELEVEL,SUBTREE}
* @param aFilter Search filter
* @param aTimeOut How long to wait
* @param aSizeLimit Maximum number of entries to return.
@@ -117,6 +111,7 @@ interface nsILDAPOperation : nsISupports
* @exception NS_ERROR_LDAP_ENCODING_ERROR
* @exception NS_ERROR_LDAP_SERVER_DOWN
* @exception NS_ERROR_OUT_OF_MEMORY
* @exception NS_ERROR_INVALID_ARG
* @exception NS_ERROR_LDAP_NOT_SUPPORTED
*
* XXX doesn't currently handle LDAPControl params
@@ -126,16 +121,16 @@ interface nsILDAPOperation : nsISupports
in PRInt32 aSizeLimit);
/**
* wrapper for ldap_abandon_ext() with NULL LDAPControl
* parameters, equivalent to old-style ldap_abandon(), thus the name.
* Cancels an async operation that is in progress.
*
* @exception NS_ERROR_NOT_INITIALIZED operation not initialized
* @exception NS_ERROR_NOT_INITIALIZED operation not initialized
* @exception NS_ERROR_LDAP_ENCODING_ERROR error during BER-encoding
* @exception NS_ERROR_LDAP_SERVER_DOWN the LDAP server did not
* receive the request or the
* connection was lost
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
* @exception NS_ERROR_UNEXPECTED internal error
* @exception NS_ERROR_LDAP_SERVER_DOWN the LDAP server did not
* receive the request or the
* connection was lost
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
* @exception NS_ERROR_INVALID_ARG invalid argument
* @exception NS_ERROR_UNEXPECTED internal error
*/
void abandon();
};

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -45,9 +46,9 @@ interface nsILDAPURL : nsIURI {
*
* for the getter:
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_NOT_INITIALIZED URL spec not set
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_NOT_INITIALIZED URL spec not set
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
*/
attribute string dn;
@@ -57,7 +58,7 @@ interface nsILDAPURL : nsIURI {
* XXXdmose - there should be a setter for this too
*/
void getAttributes(out unsigned long count,
[retval, array, size_is(count)] out string values);
[retval, array, size_is(count)] out string values);
/**
* the scope of the search. defaults to NS_LDAP_SCOPE_BASE.
@@ -67,17 +68,17 @@ interface nsILDAPURL : nsIURI {
/**
* search just the base object
*/
const long NS_LDAP_SCOPE_BASE = 0;
const long SCOPE_BASE = 0;
/**
* search only the children of the base object
*/
const long NS_LDAP_SCOPE_ONELEVEL = 1;
const long SCOPE_ONELEVEL = 1;
/**
* search the entire subtree under and including the base object
*/
const long NS_LDAP_SCOPE_SUBTREE = 2;
const long SCOPE_SUBTREE = 2;
/**
* the search filter. "(objectClass=*)" is the default.

View File

@@ -1,22 +1,55 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@mozilla.org>
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
#include "nsError.h"
#include "nspr.h"
#define NS_ERROR_LDAP_OPERATIONS_ERROR \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_OPERATIONS_ERROR)
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_OPERATIONS_ERROR)
#define NS_ERROR_LDAP_ENCODING_ERROR \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_ENCODING_ERROR)
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_ENCODING_ERROR)
#define NS_ERROR_LDAP_SERVER_DOWN \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_SERVER_DOWN)
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_SERVER_DOWN)
#define NS_ERROR_LDAP_NOT_SUPPORTED \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_NOT_SUPPORTED)
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_NOT_SUPPORTED)
#define NS_ERROR_LDAP_DECODING_ERROR \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_DECODING_ERROR)
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_LDAP, LDAP_DECODING_ERROR)
#ifdef DEBUG
#ifdef PR_LOGGING
extern PRLogModuleInfo *gLDAPLogModule; // defn in nsLDAPProtocolModule.cpp
#endif

View File

@@ -9,7 +9,7 @@
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the mozilla.org LDAP XPCOM component.
# The Original Code is the mozilla.org LDAP XPCOM SDK.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are

View File

@@ -10,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -18,7 +18,7 @@
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@mozilla.org>
* Warren Harris <warren@netscape.com>
* Warren Harris <warren@netscape.com>
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
@@ -56,7 +56,7 @@ static NS_DEFINE_IID(kIProgressEventSink, NS_IPROGRESSEVENTSINK_IID);
NS_IMPL_THREADSAFE_ISUPPORTS3(nsLDAPChannel,
nsIChannel,
nsIRequest,
nsIRequest,
nsILDAPMessageListener);
nsLDAPChannel::nsLDAPChannel()
@@ -123,7 +123,7 @@ nsLDAPChannel::Init(nsIURI *uri)
return NS_ERROR_FAILURE;
}
#else
#else
mCallback = this;
#endif
@@ -141,7 +141,7 @@ nsLDAPChannel::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
return NS_ERROR_NO_AGGREGATION;
nsLDAPChannel* ldapChannel = new nsLDAPChannel();
if (ldapChannel == nsnull)
if (!ldapChannel)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ldapChannel);
@@ -215,7 +215,7 @@ nsLDAPChannel::Cancel(nsresult aStatus)
//
if (mLoadGroup) {
rv = mLoadGroup->RemoveRequest(this, mResponseContext, aStatus,
nsnull);
0);
if (NS_FAILED(rv))
return rv;
}
@@ -223,7 +223,7 @@ nsLDAPChannel::Cancel(nsresult aStatus)
// call listener's onstoprequest
//
if (mUnproxiedListener) {
rv = mListener->OnStopRequest(this, mResponseContext, aStatus, nsnull);
rv = mListener->OnStopRequest(this, mResponseContext, aStatus, 0);
if (NS_FAILED(rv))
return rv;
}
@@ -585,7 +585,7 @@ nsLDAPChannel::AsyncOpen(nsIStreamListener* aListener,
getter_AddRefs(mReadPipeOut),
NS_PIPE_DEFAULT_SEGMENT_SIZE,
NS_PIPE_DEFAULT_BUFFER_SIZE,
PR_TRUE, PR_FALSE, nsnull);
PR_TRUE, PR_FALSE, 0);
if (NS_FAILED(rv)) {
NS_ERROR("nsLDAPChannel::AsyncRead(): unable to create new pipe");
return NS_ERROR_FAILURE;
@@ -620,7 +620,7 @@ nsLDAPChannel::AsyncOpen(nsIStreamListener* aListener,
// initialize it with the defaults
// XXXdmose - need to deal with bind name
//
rv = mConnection->Init(host, port, NULL);
rv = mConnection->Init(host, port, 0);
switch (rv) {
case NS_OK:
break;
@@ -636,7 +636,7 @@ nsLDAPChannel::AsyncOpen(nsIStreamListener* aListener,
}
// create and initialize an LDAP operation (to be used for the bind)
//
//
mCurrentOperation = do_CreateInstance(
"@mozilla.org/network/ldap-operation;1", &rv);
if (NS_FAILED(rv)) {
@@ -652,7 +652,7 @@ nsLDAPChannel::AsyncOpen(nsIStreamListener* aListener,
// kick off a bind operation
//
PR_LOG(gLDAPLogModule, PR_LOG_DEBUG, ("initiating SimpleBind\n"));
rv = mCurrentOperation->SimpleBind(NULL);
rv = mCurrentOperation->SimpleBind(0);
if (NS_FAILED(rv)) {
// XXXdmose better error handling / passthrough; deal with password
@@ -667,7 +667,7 @@ nsLDAPChannel::AsyncOpen(nsIStreamListener* aListener,
/**
* Messages received are passed back via this function.
*
* @arg aMessage The message that was returned, NULL if none was.
* @arg aMessage The message that was returned, 0 if none was.
*
* void OnLDAPMessage (in nsILDAPMessage aMessage)
*/
@@ -704,7 +704,7 @@ nsLDAPChannel::OnLDAPMessage(nsILDAPMessage *aMessage)
case LDAP_RES_SEARCH_RESULT:
// the search is finished; we're all done
//
//
return OnLDAPSearchResult(aMessage);
break;
@@ -745,10 +745,10 @@ nsLDAPChannel::OnLDAPBind(nsILDAPMessage *aMessage)
// XXX should call ldap_parse_result() here
mCurrentOperation = 0; // done with bind op; make nsCOMPtr release it
mCurrentOperation = 0; // done with bind op; make nsCOMPtr release it
// create and initialize an LDAP operation (to be used for the search
//
//
mCurrentOperation = do_CreateInstance(
"@mozilla.org/network/ldap-operation;1", &rv);
if (NS_FAILED(rv)) {
@@ -803,7 +803,7 @@ nsLDAPChannel::OnLDAPBind(nsILDAPMessage *aMessage)
nsresult
nsLDAPChannel::OnLDAPSearchResult(nsILDAPMessage *aMessage)
{
PRInt32 errorCode; // the LDAP error code
PRInt32 errorCode; // the LDAP error code
nsresult rv;
PR_LOG(gLDAPLogModule, PR_LOG_DEBUG, ("result returned\n"));
@@ -812,9 +812,7 @@ nsLDAPChannel::OnLDAPSearchResult(nsILDAPMessage *aMessage)
//
rv = aMessage->GetErrorCode(&errorCode);
if ( NS_FAILED(rv) ) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, " %s\n", ldap_err2string(errorCode));
#endif
NS_ERROR(ldap_err2string(errorCode));
return NS_ERROR_FAILURE;
}
@@ -838,7 +836,7 @@ nsLDAPChannel::OnLDAPSearchResult(nsILDAPMessage *aMessage)
// remove self from loadgroup to stop the throbber
//
if (mLoadGroup) {
rv = mLoadGroup->RemoveRequest(this, mResponseContext, NS_OK, nsnull);
rv = mLoadGroup->RemoveRequest(this, mResponseContext, NS_OK, 0);
if (NS_FAILED(rv)) {
NS_WARNING("nsLDAPChannel::OnSearchResult(): "
"mLoadGroup->RemoveChannel() failed");
@@ -849,7 +847,7 @@ nsLDAPChannel::OnLDAPSearchResult(nsILDAPMessage *aMessage)
// call listener's onstoprequest
//
if (mListener) {
rv = mListener->OnStopRequest(this, mResponseContext, NS_OK, nsnull);
rv = mListener->OnStopRequest(this, mResponseContext, NS_OK, 0);
if (NS_FAILED(rv)) {
NS_WARNING("nsLDAPChannel::OnSearchResult(): "
"mListener->OnStopRequest failed\n");
@@ -912,7 +910,7 @@ nsLDAPChannel::OnLDAPSearchEntry(nsILDAPMessage *aMessage)
if (NS_FAILED(rv)) {
NS_WARNING("nsLDAPChannel:OnLDAPSearchEntry(): "
"aMessage->GetValues() failed\n");
NSLDAP_FREE_XPIDL_ARRAY(attrCount, attrs, nsMemory::Free);
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(attrCount, attrs);
return rv;;
}
@@ -924,17 +922,16 @@ nsLDAPChannel::OnLDAPSearchEntry(nsILDAPMessage *aMessage)
entry.Append(vals[j]);
entry.Append("\n");
}
NSLDAP_FREE_XPIDL_ARRAY(valueCount, vals, nsMemory::Free);
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(valueCount, vals);
}
NSLDAP_FREE_XPIDL_ARRAY(attrCount, attrs, nsMemory::Free);
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(attrCount, attrs);
// XXXdmose better error handling
//
if (NS_FAILED(rv)) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "aMessage: error getting attribute\n");
#endif
PR_LOG(gLDAPLogModule, PR_LOG_ERROR,
("aMessage: error getting attribute\n"));
return rv;
}

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -53,59 +54,58 @@
//
#define INVOKE_LDAP_CALLBACKS_ON_MAIN_THREAD 0
/* Header file */
class nsLDAPChannel : public nsIChannel, public nsILDAPMessageListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSILDAPMESSAGELISTENER
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSILDAPMESSAGELISTENER
nsLDAPChannel();
virtual ~nsLDAPChannel();
nsLDAPChannel();
virtual ~nsLDAPChannel();
nsresult Init(nsIURI *uri);
nsresult Init(nsIURI *uri);
// this actually only gets called by nsLDAPHandler::NewChannel()
//
static NS_METHOD
Create(nsISupports* aOuter, REFNSIID aIID, void **aResult);
// this actually only gets called by nsLDAPHandler::NewChannel()
//
static NS_METHOD
Create(nsISupports* aOuter, REFNSIID aIID, void **aResult);
protected:
protected:
// these are internal functions, called by the dispatcher function
// OnLDAPMessage()
//
nsresult OnLDAPSearchResult(nsILDAPMessage *aMessage);
nsresult OnLDAPSearchEntry(nsILDAPMessage *aMessage);
nsresult OnLDAPBind(nsILDAPMessage *aMessage);
// these are internal functions, called by the dispatcher function
// OnLDAPMessage()
//
nsresult OnLDAPSearchResult(nsILDAPMessage *aMessage);
nsresult OnLDAPSearchEntry(nsILDAPMessage *aMessage);
nsresult OnLDAPBind(nsILDAPMessage *aMessage);
// instance vars for read/write nsIChannel attributes
//
nsresult mStatus;
nsCOMPtr<nsIURI> mURI; // the URI we're processing
nsCOMPtr<nsILoadGroup> mUnproxiedLoadGroup; // the load group we belong to
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI; // the URI we started prcessing
nsLoadFlags mLoadAttributes; // load attributes for this channel
nsCOMPtr<nsISupports> mOwner; // entity responsible for this channel
// instance vars for read/write nsIChannel attributes
//
nsresult mStatus;
nsCOMPtr<nsIURI> mURI; // the URI we're processing
nsCOMPtr<nsILoadGroup> mUnproxiedLoadGroup; // the load group we belong to
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI; // the URI we started prcessing
nsLoadFlags mLoadAttributes; // load attributes for this channel
nsCOMPtr<nsISupports> mOwner; // entity responsible for this channel
// various other instance vars
//
nsCOMPtr<nsIStreamListener> mUnproxiedListener; // for calls on main thread
nsCOMPtr<nsILoadGroup> mLoadGroup; // possibly an nsISupports proxy
nsCOMPtr<nsILDAPConnection> mConnection; // LDAP connection for this channel
nsCOMPtr<nsIStreamListener> mListener; // for calls on LDAP callback thread
// which _might_ be the main thread
nsCOMPtr<nsISupports> mResponseContext;
nsCOMPtr<nsIInputStream> mReadPipeIn; // this end given to the listener
nsCOMPtr<nsIOutputStream> mReadPipeOut; // for writes from the channel
nsCOMPtr<nsILDAPOperation> mCurrentOperation; // current ldap operation
PRUint32 mReadPipeOffset; // how many bytes written so far?
PRBool mReadPipeClosed; // has the pipe already been closed?
nsCOMPtr<nsILDAPMessageListener> mCallback; // callback
nsCOMPtr<nsIProgressEventSink> mEventSink; // fire status against this
// various other instance vars
//
nsCOMPtr<nsIStreamListener> mUnproxiedListener; // for calls on main thread
nsCOMPtr<nsILoadGroup> mLoadGroup; // possibly an nsISupports proxy
nsCOMPtr<nsILDAPConnection> mConnection; // LDAP connection
nsCOMPtr<nsIStreamListener> mListener; // for calls on LDAP callback thread
// which _might_ be the main thread
nsCOMPtr<nsISupports> mResponseContext;
nsCOMPtr<nsIInputStream> mReadPipeIn; // this end given to the listener
nsCOMPtr<nsIOutputStream> mReadPipeOut; // for writes from the channel
nsCOMPtr<nsILDAPOperation> mCurrentOperation; // current ldap operation
PRUint32 mReadPipeOffset; // how many bytes written so far?
PRBool mReadPipeClosed; // has the pipe already been closed?
nsCOMPtr<nsILDAPMessageListener> mCallback; // callback
nsCOMPtr<nsIProgressEventSink> mEventSink; // fire status against this
};

View File

@@ -10,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -61,7 +61,7 @@ nsLDAPConnection::~nsLDAPConnection()
PR_LOG(gLDAPLogModule, PR_LOG_DEBUG, ("unbinding\n"));
rc = ldap_unbind_s(this->mConnectionHandle);
rc = ldap_unbind_s(mConnectionHandle);
if (rc != LDAP_SUCCESS) {
PR_LOG(gLDAPLogModule, PR_LOG_WARNING,
("nsLDAPConnection::~nsLDAPConnection: %s\n",
@@ -92,7 +92,7 @@ nsLDAPConnection::Init(const char *aHost, PRInt16 aPort, const char *aBindName)
return NS_ERROR_ILLEGAL_VALUE;
}
#ifdef DEBUG
#ifdef PR_LOGGING
// initialize logging, if it hasn't been already
//
if (!gLDAPLogModule) {
@@ -113,17 +113,21 @@ nsLDAPConnection::Init(const char *aHost, PRInt16 aPort, const char *aBindName)
return NS_ERROR_OUT_OF_MEMORY;
}
} else {
mBindName = NULL;
mBindName = 0;
}
this->mConnectionHandle = ldap_init(aHost, aPort ? aPort : LDAP_PORT);
if ( this->mConnectionHandle == NULL ) {
// initialize the connection
//
// XXX buglet: port = -1 fails
//
mConnectionHandle = ldap_init(aHost, aPort ? aPort : LDAP_PORT);
if ( !mConnectionHandle ) {
return NS_ERROR_FAILURE; // the LDAP C SDK API gives no useful error
}
// initialize the threading functions for this connection
//
if (!nsLDAPThreadFuncsInit(this->mConnectionHandle)) {
if (!nsLDAPThreadFuncsInit(mConnectionHandle)) {
return NS_ERROR_UNEXPECTED;
}
@@ -145,8 +149,8 @@ nsLDAPConnection::Init(const char *aHost, PRInt16 aPort, const char *aBindName)
#ifdef DEBUG_dmose
const int lDebug = 0;
ldap_set_option(this->mConnectionHandle, LDAP_OPT_DEBUG_LEVEL, &lDebug);
ldap_set_option(this->mConnectionHandle, LDAP_OPT_ASYNC_CONNECT,
ldap_set_option(mConnectionHandle, LDAP_OPT_DEBUG_LEVEL, &lDebug);
ldap_set_option(mConnectionHandle, LDAP_OPT_ASYNC_CONNECT,
NS_REINTERPRET_CAST(void *, 0));
#endif
@@ -172,7 +176,7 @@ nsLDAPConnection::GetBindName(char **_retval)
// check for NULL (meaning bind anonymously)
//
if (!mBindName) {
*_retval = nsnull;
*_retval = 0;
} else {
// otherwise, hand out a copy of the bind name
@@ -195,7 +199,7 @@ nsLDAPConnection::GetLdErrno(char **matched, char **errString,
{
NS_ENSURE_ARG_POINTER(_retval);
*_retval = ldap_get_lderrno(this->mConnectionHandle, matched, errString);
*_retval = ldap_get_lderrno(mConnectionHandle, matched, errString);
return NS_OK;
}
@@ -204,32 +208,26 @@ nsLDAPConnection::GetLdErrno(char **matched, char **errString,
//
// XXX - deal with optional params
// XXX - how does ldap_perror know to look at the global errno?
// XXX - should copy before returning
//
NS_IMETHODIMP
nsLDAPConnection::GetErrorString(char **_retval)
{
NS_ENSURE_ARG_POINTER(_retval);
*_retval = ldap_err2string(ldap_get_lderrno(this->mConnectionHandle,
NULL, NULL));
return NS_OK;
}
// really only for the internal use of nsLDAPOperation and friends
//
// [ptr] native ldapPtr(LDAP);
// [noscript] readonly attribute ldapPtr connection;
//
NS_IMETHODIMP
nsLDAPConnection::GetConnectionHandle(LDAP* *aConnectionHandle)
{
if (!aConnectionHandle) {
NS_ERROR("nsLDAPConnection::GetConnectionHandle(): null pointer "
"passed in");
// get the error string
//
char *rv = ldap_err2string(ldap_get_lderrno(mConnectionHandle, 0, 0));
if (!rv) {
return NS_ERROR_OUT_OF_MEMORY;
}
// make a copy using the XPCOM shared allocator
//
*_retval = nsCRT::strdup(rv);
if (!*_retval) {
return NS_ERROR_OUT_OF_MEMORY;
}
*aConnectionHandle = mConnectionHandle;
return NS_OK;
}
@@ -238,10 +236,10 @@ nsLDAPConnection::GetConnectionHandle(LDAP* *aConnectionHandle)
* this connection. This is also mainly intended for use by the
* nsLDAPOperation code.
*/
NS_IMETHODIMP
nsresult
nsLDAPConnection::AddPendingOperation(nsILDAPOperation *aOperation)
{
PRInt32 msgId;
PRInt32 msgID;
if (!aOperation) {
return NS_ERROR_ILLEGAL_VALUE;
@@ -249,14 +247,14 @@ nsLDAPConnection::AddPendingOperation(nsILDAPOperation *aOperation)
// find the message id
//
aOperation->GetMessageId(&msgId);
aOperation->GetMessageID(&msgID);
// turn it into an nsVoidKey. note that this is another spot that
// assumes that sizeof(void*) >= sizeof(PRInt32).
//
// XXXdmose should really create an nsPRInt32Key.
//
nsVoidKey *key = new nsVoidKey(NS_REINTERPRET_CAST(void *, msgId));
nsVoidKey *key = new nsVoidKey(NS_REINTERPRET_CAST(void *, msgID));
if (!key) {
return NS_ERROR_OUT_OF_MEMORY;
}
@@ -291,17 +289,17 @@ nsLDAPConnection::AddPendingOperation(nsILDAPOperation *aOperation)
*
* void removePendingOperation(in nsILDAPOperation aOperation);
*/
NS_IMETHODIMP
nsresult
nsLDAPConnection::RemovePendingOperation(nsILDAPOperation *aOperation)
{
nsresult rv;
PRInt32 msgId;
PRInt32 msgID;
NS_ENSURE_ARG_POINTER(aOperation);
// find the message id
//
rv = aOperation->GetMessageId(&msgId);
rv = aOperation->GetMessageID(&msgID);
NS_ENSURE_SUCCESS(rv, rv);
// turn it into an nsVoidKey. note that this is another spot that
@@ -309,20 +307,19 @@ nsLDAPConnection::RemovePendingOperation(nsILDAPOperation *aOperation)
//
// XXXdmose should really create an nsPRInt32Key.
//
nsVoidKey *key = new nsVoidKey(NS_REINTERPRET_CAST(void *, msgId));
nsVoidKey *key = new nsVoidKey(NS_REINTERPRET_CAST(void *, msgID));
if (!key) {
return NS_ERROR_OUT_OF_MEMORY;
}
if (!mPendingOperations->Remove(key)) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPConnection::RemovePendingOperation was\n"
" unable to remove the requested item from the pending\n"
" operations queue. This probably means that the item\n"
" in question didn't exist in the queue, which in turn\n"
" probably means that you have found a bug in the code\n"
" that calls this function.\n");
#endif
NS_ERROR("nsLDAPConnection::RemovePendingOperation was\n"
" unable to remove the requested item from the pending\n"
" operations queue. This probably means that the item\n"
" in question didn't exist in the queue, which in turn\n"
" probably means that you have found a bug in the code\n"
" that calls this function.\n");
delete key;
return NS_ERROR_FAILURE;
@@ -402,8 +399,6 @@ nsLDAPConnection::Run(void)
PR_Sleep(2000); // XXXdmose - reasonable timeslice?
continue;
break;
case -1: // something went wrong
lderrno = ldap_get_lderrno(mConnectionHandle, 0, 0);
@@ -454,15 +449,19 @@ nsLDAPConnection::Run(void)
// we want nsLDAPMessage specifically, not a compatible, since
// we're sharing native objects used by the LDAP C SDK
//
msg = new nsLDAPMessage();
if (!msg) {
nsLDAPMessage *rawMsg = new nsLDAPMessage();
if (!rawMsg) {
consoleSvc->LogStringMessage(
NS_LITERAL_STRING("LDAP: ERROR: couldn't allocate memory for new LDAP message; search entry dropped").get());
// punt and hope things work out better next time around
break;
}
rv = msg->Init(this, msgHandle);
// initialize the message, using a protected method not available
// through nsILDAPMessage (which is why we need the raw pointer)
//
rv = rawMsg->Init(this, msgHandle);
switch (rv) {
case NS_OK:
@@ -474,14 +473,12 @@ nsLDAPConnection::Run(void)
NS_WARNING("nsLDAPConnection::Run(): ldaperrno = "
"LDAP_DECODING_ERROR after ldap_result()");
continue;
break;
case NS_ERROR_OUT_OF_MEMORY:
consoleSvc->LogStringMessage(
NS_LITERAL_STRING("LDAP: ERROR: couldn't allocate memory for new LDAP message; search entry dropped").get());
// punt and hope things work out better next time around
continue;
break;
case NS_ERROR_ILLEGAL_VALUE:
case NS_ERROR_UNEXPECTED:
@@ -495,9 +492,13 @@ nsLDAPConnection::Run(void)
// punt and hope things work out better next time around
continue;
break;
}
// now let the scoping mechanisms provided by nsCOMPtr manage
// the reference for us.
//
msg = rawMsg;
// invoke the callback on the nsILDAPOperation corresponding to
// this message
//
@@ -508,7 +509,6 @@ nsLDAPConnection::Run(void)
NS_ERROR("LDAP: ERROR: problem invoking message callback");
// punt and hope things work out better next time around
continue;
break;
}
#if 0
@@ -562,7 +562,7 @@ nsLDAPConnection::InvokeMessageCallback(LDAPMessage *aMsgHandle,
// find the operation in question
//
nsISupports *data = mPendingOperations->Get(key);
if (data == nsnull) {
if (!data) {
PR_LOG(gLDAPLogModule, PR_LOG_WARNING,
("Warning: InvokeMessageCallback(): couldn't find "

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -71,14 +72,39 @@ class nsLDAPConnection : public nsILDAPConnection, nsIRunnable
// delete it from the connection queue
//
nsresult InvokeMessageCallback(LDAPMessage *aMsgHandle,
nsILDAPMessage *aMsg,
PRBool aRemoveOpFromConnQ);
nsILDAPMessage *aMsg,
PRBool aRemoveOpFromConnQ);
/**
* Add an nsILDAPOperation to the list of operations pending on
* this connection. This is mainly intended for use by the
* nsLDAPOperation code. Used so that the thread waiting on messages
* for this connection has an operation to callback to.
*
* @param aOperation operation to add
* @exception NS_ERROR_ILLEGAL_VALUE aOperation was NULL
* @exception NS_ERROR_UNEXPECTED this operation's msgId was not
* unique to this connection
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
*/
nsresult AddPendingOperation(nsILDAPOperation *aOperation);
LDAP *mConnectionHandle; // the LDAP C SDK's connection object
nsCString *mBindName; // who to bind as
nsCOMPtr<nsIThread> mThread; // thread which marshals results
/**
* Remove an nsILDAPOperation from the list of operations pending on this
* connection. Mainly intended for use by the nsLDAPOperation code.
*
* @param aOperation operation to add
* @exception NS_ERROR_INVALID_POINTER aOperation was NULL
* @exception NS_ERROR_OUT_OF_MEMORY out of memory
* @exception NS_ERROR_FAILURE could not delete the operation
*/
nsresult RemovePendingOperation(nsILDAPOperation *aOperation);
LDAP *mConnectionHandle; // the LDAP C SDK's connection object
nsCString *mBindName; // who to bind as
nsCOMPtr<nsIThread> mThread; // thread which marshals results
nsSupportsHashtable *mPendingOperations; // keep these around for callbacks
};
#endif /* _nsLDAPConnection_h_ */
#endif // _nsLDAPConnection_h_

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -33,7 +34,7 @@
#include "nspr.h"
#include "ldap.h"
// XXXdmose errno.h should go away, probably after ldap C SDK 4.1 lands
/* XXXdmose errno.h should go away, probably after ldap C SDK 4.1 lands */
#include "errno.h"
/* one of these exists per thread */
@@ -62,12 +63,12 @@ nsLDAPThreadDataInit(void)
if (kLDAPErrnoData == 0) {
if (PR_NewThreadPrivateIndex(&kLDAPErrnoData, &PR_Free)
!= PR_SUCCESS) {
!= PR_SUCCESS) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPThreadDataInit(): error "
"allocating kLDAPErrorData thread-private index.\n");
PR_fprintf(PR_STDERR, "nsLDAPThreadDataInit(): error "
"allocating kLDAPErrorData thread-private index.\n");
#endif
return 0;
return 0;
}
}
@@ -91,7 +92,7 @@ nsLDAPThreadDataInit(void)
if ( PR_SetThreadPrivate(kLDAPErrnoData, errnoData) != PR_SUCCESS ) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPThreadDataInit(): PR_SetThreadPrivate "
"failed\n");
"failed\n");
#endif
return 0;
}
@@ -110,18 +111,18 @@ nsLDAPSetLderrno(int aErrno, char *aMatched, char *aErrMsg, void *aDummy)
nle = PR_GetThreadPrivate(kLDAPErrnoData);
if (!nle) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPSetLDAPErrno(): PR_GetThreadPrivate "
"failed\n");
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPSetLDAPErrno(): PR_GetThreadPrivate "
"failed\n");
#endif
return;
return;
}
nle->mErrno = aErrno;
/* free any previous setting and replace it with the new one */
if ( nle->mMatched != NULL ) {
ldap_memfree( nle->mMatched );
ldap_memfree( nle->mMatched );
}
nle->mMatched = aMatched;
@@ -144,7 +145,7 @@ nsLDAPGetLderrno( char **aMatched, char **aErrMsg, void *aDummy )
if (!nle) {
#ifdef DEBUG
PR_fprintf(PR_STDERR, "nsLDAPSetLDAPErrno(): PR_GetThreadPrivate "
"failed\n");
"failed\n");
#endif
return LDAP_OTHER;
}
@@ -196,11 +197,9 @@ nsLDAPThreadFuncsInit(LDAP *aLDAP)
kLDAPThreadFuncs.ltf_lderrno_arg = NULL;
if (ldap_set_option(aLDAP, LDAP_OPT_THREAD_FN_PTRS,
(void *)&kLDAPThreadFuncs) != 0) {
return 0;
(void *)&kLDAPThreadFuncs) != 0) {
return 0;
}
return 1;
}

View File

@@ -1,21 +1,39 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@mozilla.org>
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
* "GPL"), in which case the provisions of the GPL are applicable
* instead of those above. If you wish to allow use of your
* version of this file only under the terms of the GPL and not to
* allow others to use your version of this file under the MPL,
* indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by
* the GPL. If you do not delete the provisions above, a recipient
* may use your version of this file under either the MPL or the
* GPL.
*/
#include "nsLDAP.h"
#include "nspr.h"
// frees all elements of an XPIDL out array of a given size using
// freeFunc(), then frees the array itself using nsMemory::Free().
// Thanks to <alecf@netscape.com> for suggesting this form, which can be
// used to NS_RELEASE entire arrays before freeing as well.
//
#define NSLDAP_FREE_XPIDL_ARRAY(size, array, freeFunc) \
for ( PRUint32 __iter__ = (size) ; __iter__ > 0 ; ) \
freeFunc((array)[--__iter__]); \
nsMemory::Free(array);
// XXXdmose should this really be DEBUG-only?
//
#ifdef DEBUG
extern PRLogModuleInfo *gLDAPLogModule; // defn in nsLDAPProtocolModule.cpp
#ifdef PR_LOGGING
extern PRLogModuleInfo *gLDAPLogModule; // defn in nsLDAPProtocolModule.cpp
#endif

View File

@@ -10,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -37,34 +37,30 @@
#include "nspr.h"
#include "nsDebug.h"
#include "nsCRT.h"
#include "nsLDAPConnection.h"
NS_IMPL_THREADSAFE_ISUPPORTS1(nsLDAPMessage, nsILDAPMessage);
// constructor
//
nsLDAPMessage::nsLDAPMessage()
nsLDAPMessage::nsLDAPMessage()
: mMsgHandle(0),
mMatchedDn(0),
mErrorMessage(0),
mReferrals(0),
mServerControls(0)
{
NS_INIT_ISUPPORTS();
mMsgHandle = 0;
mConnectionHandle = 0;
// stuff returned by ldap_parse_result
//
mMatchedDn = 0;
mErrorMessage = 0;
mReferrals = 0;
mServerControls = 0;
}
// destructor
//
nsLDAPMessage::~nsLDAPMessage(void)
{
int rc;
if (mMsgHandle) {
rc = ldap_msgfree(mMsgHandle);
int rc = ldap_msgfree(mMsgHandle);
switch(rc) {
case LDAP_RES_BIND:
@@ -115,9 +111,18 @@ nsLDAPMessage::~nsLDAPMessage(void)
}
// associate this message with an existing operation
//
NS_IMETHODIMP
/**
* Initializes a message.
*
* @param aConnection The nsLDAPConnection this message is on
* @param aMsgHandle The native LDAPMessage to be wrapped.
*
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_UNEXPECTED internal err; shouldn't happen
* @exception NS_ERROR_LDAP_DECODING_ERROR problem during BER decoding
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
*/
nsresult
nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
{
int parseResult;
@@ -132,14 +137,12 @@ nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
mConnection = aConnection;
mMsgHandle = aMsgHandle;
// cache the connection handle associated with this operation
// cache the connection handle. we're violating the XPCOM type-system
// here since we're a friend of the connection class and in the
// same module.
//
nsresult rv = mConnection->GetConnectionHandle(&mConnectionHandle);
if (NS_FAILED(rv)) {
NS_WARNING("nsLDAPMessage::Init(): mConnection->GetConnectionHandle() "
"failed");
return NS_ERROR_UNEXPECTED;
}
mConnectionHandle = NS_STATIC_CAST(nsLDAPConnection *,
aConnection)->mConnectionHandle;
// do any useful message parsing
//
@@ -170,8 +173,8 @@ nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
case LDAP_RES_DELETE:
case LDAP_RES_MODRDN:
case LDAP_RES_COMPARE:
parseResult = ldap_parse_result(mConnectionHandle, mMsgHandle,
&mErrorCode, &mMatchedDn,
parseResult = ldap_parse_result(mConnectionHandle,
mMsgHandle, &mErrorCode, &mMatchedDn,
&mErrorMessage,&mReferrals,
&mServerControls, 0);
switch (parseResult) {
@@ -183,13 +186,11 @@ nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
NS_WARNING("nsLDAPMessage::Init(): ldap_parse_result() hit a "
"decoding error");
return NS_ERROR_LDAP_DECODING_ERROR;
break;
case LDAP_NO_MEMORY:
NS_WARNING("nsLDAPMessage::Init(): ldap_parse_result() ran out "
"of memory");
return NS_ERROR_OUT_OF_MEMORY;
break;
case LDAP_PARAM_ERROR:
case LDAP_MORE_RESULTS_TO_RETURN:
@@ -198,7 +199,6 @@ nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
NS_ERROR("nsLDAPMessage::Init(): ldap_parse_result returned "
"unexpected return code");
return NS_ERROR_UNEXPECTED;
break;
}
break;
@@ -206,7 +206,6 @@ nsLDAPMessage::Init(nsILDAPConnection *aConnection, LDAPMessage *aMsgHandle)
default:
NS_ERROR("nsLDAPMessage::Init(): unexpected message type");
return NS_ERROR_UNEXPECTED;
break;
}
return NS_OK;
@@ -256,7 +255,7 @@ nsLDAPMessage::IterateAttrErrHandler(PRInt32 aLderrno, PRUint32 *aAttrCount,
// if necessary, free the position holder used by
// ldap_{first,next}_attribute()
//
if (position != nsnull) {
if (position) {
ldap_ber_free(position, 0);
}
@@ -264,7 +263,7 @@ nsLDAPMessage::IterateAttrErrHandler(PRInt32 aLderrno, PRUint32 *aAttrCount,
// the array itself
//
if (*aAttributes) {
NSLDAP_FREE_XPIDL_ARRAY(*aAttrCount, *aAttributes, nsMemory::Free);
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(*aAttrCount, *aAttributes);
}
// possibly spit out a debugging message, then return an appropriate
@@ -279,7 +278,7 @@ nsLDAPMessage::IterateAttrErrHandler(PRInt32 aLderrno, PRUint32 *aAttrCount,
break;
case LDAP_DECODING_ERROR:
NS_WARNING("nsLDAPMessage::IterateAttributes(): decoding error");
NS_WARNING("nsLDAPMessage::IterateAttributes(): decoding error");
return NS_ERROR_LDAP_DECODING_ERROR;
break;
@@ -311,12 +310,12 @@ nsLDAPMessage::GetAttributes(PRUint32 *aAttrCount, char** *aAttributes)
//
nsresult
nsLDAPMessage::IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
PRBool getP)
PRBool getP)
{
BerElement *position;
nsresult rv;
if (aAttrCount == nsnull || aAttributes == nsnull ) {
if (!aAttrCount || !aAttributes ) {
return NS_ERROR_INVALID_POINTER;
}
@@ -324,7 +323,7 @@ nsLDAPMessage::IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
// count the elements in this message.
//
if (getP) {
*aAttributes = nsnull;
*aAttributes = 0;
*aAttrCount = 0;
rv = IterateAttributes(aAttrCount, aAttributes, PR_FALSE);
@@ -343,11 +342,11 @@ nsLDAPMessage::IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
// get the first attribute
//
char *attr = ldap_first_attribute(mConnectionHandle, mMsgHandle,
char *attr = ldap_first_attribute(mConnectionHandle,
mMsgHandle,
&position);
if (attr == nsnull) {
return IterateAttrErrHandler(ldap_get_lderrno(mConnectionHandle,
NULL, NULL),
if (!attr) {
return IterateAttrErrHandler(ldap_get_lderrno(mConnectionHandle, 0, 0),
aAttrCount, aAttributes, position);
}
@@ -375,18 +374,18 @@ nsLDAPMessage::IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
ldap_memfree(attr);
while (1) {
// get the next attribute
//
attr = ldap_next_attribute(mConnectionHandle, mMsgHandle, position);
// check to see if there is an error, or if we're just done iterating
//
if (attr == nsnull) {
if (!attr) {
// bail out if there's an error
//
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, NULL, NULL);
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, 0, 0);
if (lderrno != LDAP_SUCCESS) {
return IterateAttrErrHandler(lderrno, aAttrCount, aAttributes,
position);
@@ -420,49 +419,36 @@ nsLDAPMessage::IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
// free the position pointer, if necessary
//
if (position != nsnull) {
if (!position) {
ldap_ber_free(position, 0);
}
return NS_OK;
}
/*
* Wrapper for ldap_get_dn(). Returns the Distinguished Name of the
* entry associated with this message.
*
* @exception NS_ERROR_OUT_OF_MEMORY ran out of memory
* @exception NS_ERROR_ILLEGAL_VALUE null pointer passed in
* @exception NS_ERROR_LDAP_DECODING_ERROR problem during BER-decoding
* @exception NS_ERROR_UNEXPECTED bug or memory corruption hit
*
* readonly attribute string dn;
*/
NS_IMETHODIMP
nsLDAPMessage::GetDn(char* *aDN)
{
if (aDN == nsnull) {
if (!aDN) {
return NS_ERROR_ILLEGAL_VALUE;
}
char *dn = ldap_get_dn(mConnectionHandle, mMsgHandle);
if (!dn) {
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, NULL, NULL);
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, 0, 0);
switch (lderrno) {
switch (lderrno) {
case LDAP_DECODING_ERROR:
NS_WARNING("nsLDAPMessage::GetDn(): ldap decoding error");
return NS_ERROR_LDAP_DECODING_ERROR;
break;
case LDAP_DECODING_ERROR:
NS_WARNING("nsLDAPMessage::GetDn(): ldap decoding error");
return NS_ERROR_LDAP_DECODING_ERROR;
case LDAP_PARAM_ERROR:
default:
NS_ERROR("nsLDAPMessage::GetDn(): internal error");
return NS_ERROR_UNEXPECTED;
break;
}
case LDAP_PARAM_ERROR:
default:
NS_ERROR("nsLDAPMessage::GetDn(): internal error");
return NS_ERROR_UNEXPECTED;
}
}
// get a copy made with the shared allocator, and dispose of the original
@@ -490,7 +476,7 @@ nsLDAPMessage::GetValues(const char *aAttr, PRUint32 *aCount,
// bail out if there was a problem
//
if (!values) {
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, NULL, NULL);
PRInt32 lderrno = ldap_get_lderrno(mConnectionHandle, 0, 0);
if ( lderrno == LDAP_DECODING_ERROR ) {
NS_WARNING("nsLDAPMessage::GetValues(): Error decoding values");
@@ -524,8 +510,8 @@ nsLDAPMessage::GetValues(const char *aAttr, PRUint32 *aCount,
PRUint32 i;
for ( i = 0 ; i < numVals ; i++ ) {
(*aValues)[i] = nsCRT::strdup(values[i]);
if ((*aValues)[i] == nsnull ) {
NSLDAP_FREE_XPIDL_ARRAY(i, aValues, nsMemory::Free);
if ( ! (*aValues)[i] ) {
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(i, aValues);
return NS_ERROR_OUT_OF_MEMORY;
}
}
@@ -534,12 +520,8 @@ nsLDAPMessage::GetValues(const char *aAttr, PRUint32 *aCount,
return NS_OK;
}
// returns an LDIF-like string representation of this message
//
// string toString();
//
NS_IMETHODIMP
nsLDAPMessage::ToString(char* *aString)
nsLDAPMessage::ToUnicode(PRUnichar* *aString)
{
return NS_ERROR_NOT_IMPLEMENTED;
}

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -37,7 +38,6 @@
#include "ldap.h"
#include "nsILDAPMessage.h"
#include "nsILDAPOperation.h"
#include "nsILDAPConnection.h"
#include "nsCOMPtr.h"
// 76e061ad-a59f-43b6-b812-ee6e8e69423f
@@ -49,8 +49,9 @@
class nsLDAPMessage : public nsILDAPMessage
{
friend class nsLDAPOperation;
friend class nsLDAPConnection;
public:
public:
NS_DECL_ISUPPORTS
NS_DECL_NSILDAPMESSAGE
@@ -62,13 +63,21 @@ class nsLDAPMessage : public nsILDAPMessage
protected:
nsresult IterateAttrErrHandler(PRInt32 aLderrno, PRUint32 *aAttrCount,
char** *aAttributes, BerElement *position);
char** *aAttributes, BerElement *position);
nsresult IterateAttributes(PRUint32 *aAttrCount, char** *aAttributes,
PRBool getP);
PRBool getP);
nsresult Init(nsILDAPConnection *aConnection,
LDAPMessage *aMsgHandle);
LDAPMessage *mMsgHandle; // the message we're wrapping
nsCOMPtr<nsILDAPOperation> mOperation; // operation this msg relates to
nsCOMPtr<nsILDAPConnection> mConnection; // cached connection this op is on
LDAP *mConnectionHandle; // cached connection handle
LDAP *mConnectionHandle; // cached connection this op is on
// since we're caching the connection handle (above), we need to
// hold an owning ref to the relevant nsLDAPConnection object as long
// as we're around
//
nsCOMPtr<nsILDAPConnection> mConnection;
// the next five member vars are returned by ldap_parse_result()
//
@@ -79,4 +88,4 @@ class nsLDAPMessage : public nsILDAPMessage
LDAPControl **mServerControls;
};
#endif /* _nsLDAPMessage_h */
#endif // _nsLDAPMessage_h

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -33,6 +34,7 @@
#include "nsLDAP.h"
#include "nsLDAPOperation.h"
#include "nsLDAPConnection.h"
#include "nsILDAPMessage.h"
#include "nsIComponentManager.h"
#include "nsXPIDLString.h"
@@ -59,27 +61,26 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsLDAPOperation, nsILDAPOperation);
*/
NS_IMETHODIMP
nsLDAPOperation::Init(nsILDAPConnection *aConnection,
nsILDAPMessageListener *aMessageListener)
nsILDAPMessageListener *aMessageListener)
{
if (!aConnection) {
return NS_ERROR_ILLEGAL_VALUE;
return NS_ERROR_ILLEGAL_VALUE;
}
// so we know that the operation is not yet running (and therefore don't
// try and call ldap_abandon_ext() on it) or remove it from the queue.
//
mMsgId = 0;
mMsgID = 0;
// set the member vars
//
mConnection = aConnection;
mMessageListener = aMessageListener;
// get and cache the connection handle
//
nsresult rv = mConnection->GetConnectionHandle(&mConnectionHandle);
if (NS_FAILED(rv))
return NS_ERROR_UNEXPECTED;
// cache the connection handle
//
mConnectionHandle =
NS_STATIC_CAST(nsLDAPConnection *, aConnection)->mConnectionHandle;
return NS_OK;
}
@@ -88,7 +89,7 @@ NS_IMETHODIMP
nsLDAPOperation::GetConnection(nsILDAPConnection* *aConnection)
{
if (!aConnection) {
return NS_ERROR_ILLEGAL_VALUE;
return NS_ERROR_ILLEGAL_VALUE;
}
*aConnection = mConnection;
@@ -101,7 +102,7 @@ NS_IMETHODIMP
nsLDAPOperation::GetMessageListener(nsILDAPMessageListener **aMessageListener)
{
if (!aMessageListener) {
return NS_ERROR_ILLEGAL_VALUE;
return NS_ERROR_ILLEGAL_VALUE;
}
*aMessageListener = mMessageListener;
@@ -120,54 +121,56 @@ nsLDAPOperation::SimpleBind(const char *passwd)
NS_PRECONDITION(mMessageListener != 0, "MessageListener not set");
rv = this->mConnection->GetBindName(getter_Copies(bindName));
rv = mConnection->GetBindName(getter_Copies(bindName));
if (NS_FAILED(rv))
return rv;
return rv;
this->mMsgId = ldap_simple_bind(this->mConnectionHandle, bindName, passwd);
mMsgID = ldap_simple_bind(mConnectionHandle, bindName, passwd);
if (this->mMsgId == -1) {
const int lderrno = ldap_get_lderrno(this->mConnectionHandle, 0, 0);
switch (lderrno) {
if (mMsgID == -1) {
const int lderrno = ldap_get_lderrno(mConnectionHandle, 0, 0);
switch (lderrno) {
case LDAP_ENCODING_ERROR:
return NS_ERROR_LDAP_ENCODING_ERROR;
case LDAP_ENCODING_ERROR:
return NS_ERROR_LDAP_ENCODING_ERROR;
case LDAP_SERVER_DOWN:
// XXXdmose rebind here?
return NS_ERROR_FAILURE;
case LDAP_SERVER_DOWN:
// XXXdmose rebind here?
return NS_ERROR_FAILURE;
case LDAP_NO_MEMORY:
return NS_ERROR_OUT_OF_MEMORY;
case LDAP_NO_MEMORY:
return NS_ERROR_OUT_OF_MEMORY;
default:
return NS_ERROR_UNEXPECTED;
}
default:
return NS_ERROR_UNEXPECTED;
}
}
// make sure the connection knows where to call back once the messages
// for this operation start coming in
//
rv = mConnection->AddPendingOperation(this);
rv = NS_STATIC_CAST(nsLDAPConnection *,
NS_STATIC_CAST(nsILDAPConnection *,
mConnection.get()))->AddPendingOperation(this);
switch (rv) {
case NS_OK:
break;
break;
// note that the return value of ldap_abandon_ext() is ignored, as
// there's nothing useful to do with it
// note that the return value of ldap_abandon_ext() is ignored, as
// there's nothing useful to do with it
case NS_ERROR_OUT_OF_MEMORY:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgId, 0, 0);
return NS_ERROR_OUT_OF_MEMORY;
break;
(void *)ldap_abandon_ext(mConnectionHandle, mMsgID, 0, 0);
return NS_ERROR_OUT_OF_MEMORY;
break;
case NS_ERROR_UNEXPECTED:
case NS_ERROR_ILLEGAL_VALUE:
default:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgId, 0, 0);
return NS_ERROR_UNEXPECTED;
(void *)ldap_abandon_ext(mConnectionHandle, mMsgID, 0, 0);
return NS_ERROR_UNEXPECTED;
}
return NS_OK;
@@ -177,143 +180,107 @@ nsLDAPOperation::SimpleBind(const char *passwd)
//
int
nsLDAPOperation::SearchExt(const char *base, // base DN to search
int scope, // LDAP_SCOPE_{BASE,ONELEVEL,SUBTREE}
const char* filter, // search filter
char **attrs, // attribute types to be returned
int attrsOnly, // attrs only, or values too?
LDAPControl **serverctrls,
LDAPControl **clientctrls,
struct timeval *timeoutp, // how long to wait
int sizelimit) // max # of entries to return
int scope, // SCOPE_{BASE,ONELEVEL,SUBTREE}
const char* filter, // search filter
char **attrs, // attribute types to be returned
int attrsOnly, // attrs only, or values too?
LDAPControl **serverctrls,
LDAPControl **clientctrls,
struct timeval *timeoutp, // how long to wait
int sizelimit) // max # of entries to return
{
if (mMessageListener == 0) {
NS_ERROR("nsLDAPOperation::SearchExt(): mMessageListener not set");
return NS_ERROR_NOT_INITIALIZED;
NS_ERROR("nsLDAPOperation::SearchExt(): mMessageListener not set");
return NS_ERROR_NOT_INITIALIZED;
}
return ldap_search_ext(this->mConnectionHandle, base, scope,
filter, attrs, attrsOnly, serverctrls,
clientctrls, timeoutp, sizelimit,
&(this->mMsgId));
return ldap_search_ext(mConnectionHandle, base, scope,
filter, attrs, attrsOnly, serverctrls,
clientctrls, timeoutp, sizelimit,
&mMsgID);
}
/**
* wrapper for ldap_search_ext(): kicks off an async search request.
*
* @param aBaseDn Base DN to search
* @param aScope One of LDAP_SCOPE_{BASE,ONELEVEL,SUBTREE}
* @param aFilter Search filter
* @param aTimeOut How long to wait
* @param aSizeLimit Maximum number of entries to return.
* @param aBaseDn Base DN to search
* @param aScope One of SCOPE_{BASE,ONELEVEL,SUBTREE}
* @param aFilter Search filter
* @param aTimeOut How long to wait
* @param aSizeLimit Maximum number of entries to return.
*
* XXX doesn't currently handle LDAPControl params
*
* void searchExt(in string aBaseDn, in PRInt32 aScope,
* in string aFilter, in PRIntervalTime aTimeOut,
* in PRInt32 aSizeLimit);
* in string aFilter, in PRIntervalTime aTimeOut,
* in PRInt32 aSizeLimit);
*/
NS_IMETHODIMP
nsLDAPOperation::SearchExt(const char *aBaseDn, PRInt32 aScope,
const char *aFilter, PRIntervalTime aTimeOut,
PRInt32 aSizeLimit)
const char *aFilter, PRIntervalTime aTimeOut,
PRInt32 aSizeLimit)
{
// XXX deal with timeouts
//
int retVal = nsLDAPOperation::SearchExt(aBaseDn, aScope, aFilter, NULL, 0,
NULL, NULL, NULL, aSizeLimit);
int retVal = SearchExt(aBaseDn, aScope, aFilter, 0, 0,
0, 0, 0, aSizeLimit);
switch (retVal) {
case LDAP_SUCCESS:
break;
break;
case LDAP_ENCODING_ERROR:
return NS_ERROR_LDAP_ENCODING_ERROR;
break;
return NS_ERROR_LDAP_ENCODING_ERROR;
case LDAP_SERVER_DOWN:
return NS_ERROR_LDAP_SERVER_DOWN;
break;
return NS_ERROR_LDAP_SERVER_DOWN;
case LDAP_NO_MEMORY:
return NS_ERROR_OUT_OF_MEMORY;
break;
return NS_ERROR_OUT_OF_MEMORY;
case LDAP_NOT_SUPPORTED:
return NS_ERROR_LDAP_NOT_SUPPORTED;
break;
return NS_ERROR_LDAP_NOT_SUPPORTED;
case LDAP_PARAM_ERROR:
return NS_ERROR_INVALID_ARG;
default:
NS_ERROR("nsLDAPOperation::SearchExt(): unexpected return value");
return NS_ERROR_UNEXPECTED;
NS_ERROR("nsLDAPOperation::SearchExt(): unexpected return value");
return NS_ERROR_UNEXPECTED;
}
// make sure the connection knows where to call back once the messages
// for this operation start coming in
//
nsresult rv = mConnection->AddPendingOperation(this);
nsresult rv = NS_STATIC_CAST(nsLDAPConnection *, NS_STATIC_CAST(
nsILDAPConnection *, mConnection.get()))->AddPendingOperation(this);
if (NS_FAILED(rv)) {
switch (rv) {
case NS_ERROR_OUT_OF_MEMORY:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgId, 0, 0);
return NS_ERROR_OUT_OF_MEMORY;
break;
switch (rv) {
case NS_ERROR_OUT_OF_MEMORY:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgID, 0, 0);
return NS_ERROR_OUT_OF_MEMORY;
default:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgId, 0, 0);
NS_ERROR("nsLDAPOperation::SearchExt(): unexpected error in "
"mConnection->AddPendingOperation");
return NS_ERROR_UNEXPECTED;
break;
}
default:
(void *)ldap_abandon_ext(mConnectionHandle, mMsgID, 0, 0);
NS_ERROR("nsLDAPOperation::SearchExt(): unexpected error in "
"mConnection->AddPendingOperation");
return NS_ERROR_UNEXPECTED;
}
}
return NS_OK;
}
// wrapper for ldap_url_search
//
NS_IMETHODIMP
nsLDAPOperation::UrlSearch(const char *aURL, // the search URL
PRBool aAttrsOnly) // skip attribute names?
nsLDAPOperation::GetMessageID(PRInt32 *aMsgID)
{
NS_ENSURE_ARG(aURL);
NS_PRECONDITION(mMessageListener != 0, "MessageListener not set");
this->mMsgId = ldap_url_search(this->mConnectionHandle, aURL,
aAttrsOnly);
if (this->mMsgId == -1) {
// XXX
PR_Abort();
#ifdef DEBUG
char *s;
(void)this->mConnection->GetErrorString(&s);
PR_fprintf(PR_STDERR, "UrlSearch failed: %s\n", s);
ldap_memfree(s);
#endif
return NS_ERROR_FAILURE;
if (!aMsgID) {
return NS_ERROR_ILLEGAL_VALUE;
}
// make sure the connection knows where to call back once the messages
// for this operation start coming in
// XXX should abandon operation if this fails
nsresult rv = mConnection->AddPendingOperation(this);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
NS_IMETHODIMP
nsLDAPOperation::GetMessageId(PRInt32 *aMsgId)
{
if (!aMsgId) {
return NS_ERROR_ILLEGAL_VALUE;
}
*aMsgId = this->mMsgId;
*aMsgID = mMsgID;
return NS_OK;
}
@@ -323,41 +290,40 @@ nsLDAPOperation::GetMessageId(PRInt32 *aMsgId)
//
nsresult
nsLDAPOperation::AbandonExt(LDAPControl **serverctrls,
LDAPControl **clientctrls)
LDAPControl **clientctrls)
{
nsresult rv;
int retVal;
if ( mMessageListener == 0 || mMsgId == 0 ) {
NS_ERROR("nsLDAPOperation::AbandonExt(): mMessageListener or "
"mMsgId not initialized");
return NS_ERROR_NOT_INITIALIZED;
if ( mMessageListener == 0 || mMsgID == 0 ) {
NS_ERROR("nsLDAPOperation::AbandonExt(): mMessageListener or "
"mMsgId not initialized");
return NS_ERROR_NOT_INITIALIZED;
}
retVal = ldap_abandon_ext(mConnectionHandle, mMsgId, serverctrls,
clientctrls);
retVal = ldap_abandon_ext(mConnectionHandle, mMsgID, serverctrls,
clientctrls);
switch (retVal) {
case LDAP_SUCCESS:
break;
break;
case LDAP_ENCODING_ERROR:
return NS_ERROR_LDAP_ENCODING_ERROR;
break;
return NS_ERROR_LDAP_ENCODING_ERROR;
case LDAP_SERVER_DOWN:
return NS_ERROR_LDAP_SERVER_DOWN;
break;
return NS_ERROR_LDAP_SERVER_DOWN;
case LDAP_NO_MEMORY:
return NS_ERROR_OUT_OF_MEMORY;
break;
return NS_ERROR_OUT_OF_MEMORY;
case LDAP_PARAM_ERROR:
return NS_ERROR_INVALID_ARG;
default:
NS_ERROR("nsLDAPOperation::AbandonExt(): unexpected return value from "
"ldap_abandon_ext");
return NS_ERROR_UNEXPECTED;
NS_ERROR("nsLDAPOperation::AbandonExt(): unexpected return value from "
"ldap_abandon_ext");
return NS_ERROR_UNEXPECTED;
}
// try to remove it from the pendingOperations queue, if it's there.
@@ -365,15 +331,17 @@ nsLDAPOperation::AbandonExt(LDAPControl **serverctrls,
// succeeded (and there's nothing else the caller can reasonably do),
// so we only pay attention to this in debug builds.
//
rv = mConnection->RemovePendingOperation(this);
rv = NS_STATIC_CAST(nsLDAPConnection *, NS_STATIC_CAST(
nsILDAPConnection *, mConnection.get()))->RemovePendingOperation(this);
if (NS_FAILED(rv)) {
// XXXdmose should we use keep Abandon from happening on multiple
// threads at the same time? that's when this condition is most
// likely to occur. i _think_ the LDAP C SDK is ok with this; need
// to verify.
//
NS_WARNING("nsLDAPOperation::AbandonExt: "
"mConnection->RemovePendingOperation(this) failed.");
// XXXdmose should we use keep Abandon from happening on multiple
// threads at the same time? that's when this condition is most
// likely to occur. i _think_ the LDAP C SDK is ok with this; need
// to verify.
//
NS_WARNING("nsLDAPOperation::AbandonExt: "
"mConnection->RemovePendingOperation(this) failed.");
}
return NS_OK;
@@ -382,5 +350,5 @@ nsLDAPOperation::AbandonExt(LDAPControl **serverctrls,
NS_IMETHODIMP
nsLDAPOperation::Abandon(void)
{
return nsLDAPOperation::AbandonExt(NULL, NULL);
return nsLDAPOperation::AbandonExt(0, 0);
}

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -64,14 +65,14 @@ class nsLDAPOperation : public nsILDAPOperation
* XXX should move to idl, once LDAPControls have an IDL representation
*/
int SearchExt(const char *base, // base DN to search
int scope, // LDAP_SCOPE_{BASE,ONELEVEL,SUBTREE}
const char* filter, // search filter
char **attrs, // attribute types to be returned
int attrsOnly, // attrs only, or values too?
LDAPControl **serverctrls,
LDAPControl **clientctrls,
struct timeval *timeoutp, // how long to wait
int sizelimit); // max # of entries to return
int scope, // SCOPE_{BASE,ONELEVEL,SUBTREE}
const char* filter, // search filter
char **attrs, // attribute types to be returned
int attrsOnly, // attrs only, or values too?
LDAPControl **serverctrls,
LDAPControl **clientctrls,
struct timeval *timeoutp, // how long to wait
int sizelimit); // max # of entries to return
/**
* wrapper for ldap_abandon_ext().
@@ -80,10 +81,14 @@ class nsLDAPOperation : public nsILDAPOperation
*/
nsresult AbandonExt(LDAPControl **serverctrls, LDAPControl **clientctrls);
nsCOMPtr<nsILDAPConnection> mConnection; // connection this op is on
nsCOMPtr<nsILDAPMessageListener> mMessageListener; // results go here
PRInt32 mMsgId; // opaque handle to outbound message for this op
LDAP *mConnectionHandle; // cached from mConnection->GetConnectionHandle()
nsCOMPtr<nsILDAPConnection> mConnection; // connection this op is on
LDAP *mConnectionHandle; // cache connection handle
PRInt32 mMsgID; // opaque handle to outbound message for this op
};
#endif /* _nsLDAPOperation_h */
#endif // _nsLDAPOperation_h

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -17,7 +18,7 @@
* Rights Reserved.
*
* Contributor(s): Dan Mosedale <dmose@mozilla.org>
* Brian Ryner <bryner@uiuc.edu>
* Brian Ryner <bryner@uiuc.edu>
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU General Public License Version 2 or later (the
@@ -47,12 +48,10 @@ NS_IMPL_ISUPPORTS1(nsLDAPProtocolHandler, nsIProtocolHandler)
nsLDAPProtocolHandler::nsLDAPProtocolHandler()
{
NS_INIT_ISUPPORTS();
/* member initializers and constructor code */
}
nsLDAPProtocolHandler::~nsLDAPProtocolHandler()
{
/* destructor code */
}
// nsIProtocolHandler methods
@@ -63,7 +62,7 @@ NS_IMETHODIMP
nsLDAPProtocolHandler::GetScheme(char **result)
{
*result = nsCRT::strdup("ldap");
if ( *result == nsnull )
if ( ! *result )
return NS_ERROR_OUT_OF_MEMORY;
else
return NS_OK;
@@ -82,7 +81,7 @@ nsLDAPProtocolHandler::GetDefaultPort(PRInt32 *result)
//
NS_IMETHODIMP
nsLDAPProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result)
nsIURI **result)
{
nsCOMPtr<nsILDAPURL> url;
nsresult rv;
@@ -108,24 +107,24 @@ nsLDAPProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
NS_IMETHODIMP
nsLDAPProtocolHandler::NewChannel(nsIURI* uri,
nsIChannel* *result)
nsIChannel* *result)
{
nsresult rv;
nsLDAPChannel *channel;
nsresult rv;
nsLDAPChannel *channel;
rv = nsLDAPChannel::Create(nsnull, NS_GET_IID(nsIChannel),
NS_REINTERPRET_CAST(void **, &channel));
NS_ENSURE_SUCCESS(rv, rv);
rv = nsLDAPChannel::Create(0, NS_GET_IID(nsIChannel),
NS_REINTERPRET_CAST(void **, &channel));
NS_ENSURE_SUCCESS(rv, rv);
rv = channel->Init(uri);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
// the channel was already AddRefed for us, and since this function itself
// is a getter, there's no need to release it here.
//
*result = channel;
rv = channel->Init(uri);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
// the channel was already AddRefed for us, and since this function itself
// is a getter, there's no need to release it here.
//
*result = channel;
return NS_OK;
return NS_OK;
}

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -44,12 +45,12 @@
class nsLDAPProtocolHandler : public nsIProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
nsLDAPProtocolHandler();
virtual ~nsLDAPProtocolHandler();
nsLDAPProtocolHandler();
virtual ~nsLDAPProtocolHandler();
};
#endif // nsLDAPProtocolHandler_h__

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -54,18 +55,18 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsLDAPURL);
static nsModuleComponentInfo components[] =
{
{ "LDAP Protocol Handler", NS_LDAPPROTOCOLHANDLER_CID,
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ldap",
nsLDAPProtocolHandlerConstructor },
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ldap",
nsLDAPProtocolHandlerConstructor },
{ "LDAP Service", NS_LDAPSERVICE_CID,
"@mozilla.org/network/ldap-service;1", nsLDAPServiceConstructor },
"@mozilla.org/network/ldap-service;1", nsLDAPServiceConstructor },
{ "LDAP Connection", NS_LDAPCONNECTION_CID,
"@mozilla.org/network/ldap-connection;1",
nsLDAPConnectionConstructor },
"@mozilla.org/network/ldap-connection;1",
nsLDAPConnectionConstructor },
{ "LDAP Operation", NS_LDAPOPERATION_CID,
"@mozilla.org/network/ldap-operation;1",
nsLDAPOperationConstructor },
"@mozilla.org/network/ldap-operation;1",
nsLDAPOperationConstructor },
{ "LDAP Message", NS_LDAPMESSAGE_CID,
"@mozilla.org/network/ldap-message;1", nsLDAPMessageConstructor },
"@mozilla.org/network/ldap-message;1", nsLDAPMessageConstructor },
{ "LDAP URL", NS_LDAPURL_CID,
"@mozilla.org/network/ldap-url;1", nsLDAPURLConstructor }
};
@@ -74,6 +75,6 @@ static nsModuleComponentInfo components[] =
//
NS_IMPL_NSGETMODULE("nsLDAPProtocolModule", components);
#ifdef DEBUG
#ifdef PR_LOGGING
PRLogModuleInfo *gLDAPLogModule = 0;
#endif

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -38,7 +39,7 @@
//
nsLDAPService::nsLDAPService()
{
NS_INIT_ISUPPORTS();
NS_INIT_ISUPPORTS();
}
// destructor
@@ -55,15 +56,15 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsLDAPService,nsIRunnable);
NS_IMETHODIMP
nsLDAPService::Init(void)
{
nsresult rv;
nsresult rv;
NS_ASSERTION(!mThread, "nsLDAPService already initialized!");
NS_ASSERTION(!mThread, "nsLDAPService already initialized!");
rv = NS_NewThread(getter_AddRefs(mThread),
this, 0, PR_JOINABLE_THREAD);
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewThread(getter_AddRefs(mThread),
this, 0, PR_JOINABLE_THREAD);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
return NS_OK;
}
// for nsIRunnable. all the processing work happens here.
@@ -71,14 +72,14 @@ nsLDAPService::Init(void)
NS_IMETHODIMP
nsLDAPService::Run(void)
{
PR_LOG(gLDAPLogModule, PR_LOG_DEBUG, ("nsLDAPService::Run() entered\n"));
PR_LOG(gLDAPLogModule, PR_LOG_DEBUG, ("nsLDAPService::Run() entered\n"));
// XXX - should use mThreadRunning here
//
while (1) {
// XXX - should use mThreadRunning here
//
while (1) {
}
}
return NS_OK;
return NS_OK;
}

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -48,25 +49,25 @@
class nsLDAPService : public nsIRunnable
{
public:
// interface decls
//
NS_DECL_ISUPPORTS
NS_DECL_NSIRUNNABLE
public:
// interface decls
//
NS_DECL_ISUPPORTS
NS_DECL_NSIRUNNABLE
// constructor and destructor
//
nsLDAPService();
virtual ~nsLDAPService();
// constructor and destructor
//
nsLDAPService();
virtual ~nsLDAPService();
// initialize; should only be called by the generic
// constructor after creation
//
NS_METHOD Init(void);
// initialize; should only be called by the generic
// constructor after creation
//
NS_METHOD Init(void);
protected:
nsCOMPtr<nsIThread> mThread;
PRBool mThreadRunning;
protected:
nsCOMPtr<nsIThread> mThread;
PRBool mThreadRunning;
};

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -45,7 +46,7 @@ nsLDAPURL::~nsLDAPURL()
ldap_free_urldesc(mDesc);
}
const char *kEmptyString = "";
static const char *kEmptyString = "";
// A string representation of the URI. Setting the spec
// causes the new spec to be parsed, initializing the URI. Setting
@@ -58,17 +59,16 @@ NS_IMETHODIMP
nsLDAPURL::GetSpec(char* *aSpec)
{
NS_ENSURE_ARG_POINTER(aSpec);
NS_ENSURE_FALSE(mSpec.IsEmpty(), NS_ERROR_NOT_INITIALIZED);
// copy it out
//
*aSpec = mSpec.ToNewCString();
// XXXdmose - presumably this is the right thing. nsString.h doesn't
// document whether there can be a NULL return code.
// document whether there can be a 0 return code.
//
if (*aSpec == nsnull) {
return NS_ERROR_OUT_OF_MEMORY;
if ( ! *aSpec ) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
@@ -86,22 +86,22 @@ nsLDAPURL::SetSpec(const char * aSpec)
switch (rc) {
case LDAP_SUCCESS:
return NS_OK;
break;
return NS_OK;
break;
case LDAP_URL_ERR_NOTLDAP:
case LDAP_URL_ERR_NODN:
case LDAP_URL_ERR_BADSCOPE:
return NS_ERROR_MALFORMED_URI;
break;
return NS_ERROR_MALFORMED_URI;
break;
case LDAP_URL_ERR_MEM:
return NS_ERROR_OUT_OF_MEMORY;
break;
return NS_ERROR_OUT_OF_MEMORY;
break;
case LDAP_URL_ERR_PARAM:
return NS_ERROR_INVALID_POINTER;
break;
return NS_ERROR_INVALID_POINTER;
break;
}
// this shouldn't happen
@@ -109,7 +109,8 @@ nsLDAPURL::SetSpec(const char * aSpec)
return NS_ERROR_UNEXPECTED;
}
/* attribute string prePath; */
// attribute string prePath;
//
NS_IMETHODIMP nsLDAPURL::GetPrePath(char * *aPrePath)
{
return NS_ERROR_NOT_IMPLEMENTED;
@@ -119,14 +120,15 @@ NS_IMETHODIMP nsLDAPURL::SetPrePath(const char * aPrePath)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string scheme; */
// attribute string scheme;
//
NS_IMETHODIMP nsLDAPURL::GetScheme(char * *aScheme)
{
// need to deal with ldaps here too?
//
char *scheme = nsCRT::strdup("ldap");
if (scheme == nsnull) {
return NS_ERROR_OUT_OF_MEMORY;
if (!scheme) {
return NS_ERROR_OUT_OF_MEMORY;
}
*aScheme = scheme;
@@ -137,7 +139,8 @@ NS_IMETHODIMP nsLDAPURL::SetScheme(const char * aScheme)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string preHost; */
// attribute string preHost;
//
NS_IMETHODIMP
nsLDAPURL::GetPreHost(char * *aPreHost)
{
@@ -149,7 +152,8 @@ nsLDAPURL::SetPreHost(const char * aPreHost)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string username; */
// attribute string username
//
NS_IMETHODIMP
nsLDAPURL::GetUsername(char * *aUsername)
{
@@ -161,7 +165,8 @@ nsLDAPURL::SetUsername(const char * aUsername)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string password; */
// attribute string password;
//
NS_IMETHODIMP
nsLDAPURL::GetPassword(char * *aPassword)
{
@@ -173,20 +178,23 @@ nsLDAPURL::SetPassword(const char * aPassword)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string host; */
// attribute string host;
//
NS_IMETHODIMP
nsLDAPURL::GetHost(char * *aHost)
{
NS_ENSURE_FALSE(mDesc == nsnull, NS_ERROR_NOT_INITIALIZED);
NS_ENSURE_TRUE(mDesc, NS_ERROR_NOT_INITIALIZED);
NS_ENSURE_ARG_POINTER(aHost);
if ( mDesc->lud_host == nsnull ) {
*aHost = nsCRT::strdup(kEmptyString);
} else
*aHost = nsCRT::strdup(mDesc->lud_host);
if ( ! mDesc->lud_host ) {
*aHost = nsCRT::strdup(kEmptyString);
} else {
*aHost = nsCRT::strdup(mDesc->lud_host);
}
if (*aHost == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
if ( ! *aHost ) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
}
@@ -196,17 +204,19 @@ nsLDAPURL::SetHost(const char * aHost)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute long port; */
// attribute long port;
//
NS_IMETHODIMP
nsLDAPURL::GetPort(PRInt32 *aPort)
{
NS_ENSURE_ARG_POINTER(aPort);
NS_ENSURE_FALSE(mDesc == nsnull, NS_ERROR_NOT_INITIALIZED);
NS_ENSURE_TRUE(mDesc, NS_ERROR_NOT_INITIALIZED);
if ( mDesc->lud_port )
*aPort = mDesc->lud_port;
else
*aPort = -1;
if ( mDesc->lud_port ) {
*aPort = mDesc->lud_port;
} else {
*aPort = -1;
}
return NS_OK;
}
@@ -216,7 +226,8 @@ nsLDAPURL::SetPort(PRInt32 aPort)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string path; */
// attribute string path;
//
NS_IMETHODIMP nsLDAPURL::GetPath(char * *aPath)
{
return NS_ERROR_NOT_IMPLEMENTED;
@@ -226,13 +237,15 @@ NS_IMETHODIMP nsLDAPURL::SetPath(const char * aPath)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* boolean equals (in nsIURI other); */
// boolean equals (in nsIURI other)
//
NS_IMETHODIMP nsLDAPURL::Equals(nsIURI *other, PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* boolean schemeIs(in PRUint32 scheme); */
// boolean schemeIs(in PRUint32 scheme);
//
NS_IMETHODIMP nsLDAPURL::SchemeIs(PRUint32 i_Scheme, PRBool *o_Equals)
{
*o_Equals = (i_Scheme == nsIURI::LDAP);
@@ -240,39 +253,43 @@ NS_IMETHODIMP nsLDAPURL::SchemeIs(PRUint32 i_Scheme, PRBool *o_Equals)
return NS_OK;
}
/* nsIURI clone (); */
// nsIURI clone ();
//
NS_IMETHODIMP nsLDAPURL::Clone(nsIURI **_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* string resolve (in string relativePath); */
// string resolve (in string relativePath);
//
NS_IMETHODIMP nsLDAPURL::Resolve(const char *relativePath, char **_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* the following attributes come from nsILDAPURL */
// the following attributes come from nsILDAPURL
/* attribute string dn; */
// attribute string dn;
//
NS_IMETHODIMP nsLDAPURL::GetDn(char * *aDn)
{
if (!aDn) {
return NS_ERROR_ILLEGAL_VALUE;
return NS_ERROR_ILLEGAL_VALUE;
}
if (!mDesc) {
return NS_ERROR_NOT_INITIALIZED;
return NS_ERROR_NOT_INITIALIZED;
}
if ( mDesc->lud_dn == NULL ) {
*aDn = nsCRT::strdup(kEmptyString);
if ( mDesc->lud_dn == 0 ) {
*aDn = nsCRT::strdup(kEmptyString);
} else {
*aDn = nsCRT::strdup(mDesc->lud_dn);
*aDn = nsCRT::strdup(mDesc->lud_dn);
}
if ( *aDn == nsnull )
return NS_ERROR_OUT_OF_MEMORY;
if ( ! *aDn ) {
return NS_ERROR_OUT_OF_MEMORY;
}
return NS_OK;
}
@@ -281,17 +298,20 @@ NS_IMETHODIMP nsLDAPURL::SetDn(const char * aDn)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* void getAttributes (out unsigned long count, [array, size_is (count), retval] out string values); */
// void getAttributes (out unsigned long count,
// [array, size_is (count), retval] out string values);
//
NS_IMETHODIMP nsLDAPURL::GetAttributes(PRUint32 *count, char ***values)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute long scope; */
// attribute long scope;
//
NS_IMETHODIMP nsLDAPURL::GetScope(PRInt32 *aScope)
{
NS_ENSURE_ARG_POINTER(aScope);
NS_ENSURE_FALSE(mDesc == nsnull, NS_ERROR_NOT_INITIALIZED);
NS_ENSURE_TRUE(mDesc, NS_ERROR_NOT_INITIALIZED);
*aScope = mDesc->lud_scope;
@@ -302,22 +322,25 @@ NS_IMETHODIMP nsLDAPURL::SetScope(PRInt32 aScope)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute string filter; */
// attribute string filter;
//
NS_IMETHODIMP nsLDAPURL::GetFilter(char * *aFilter)
{
NS_ENSURE_ARG_POINTER(aFilter);
NS_ENSURE_FALSE(mDesc == nsnull, NS_ERROR_NOT_INITIALIZED);
NS_ENSURE_TRUE(mDesc, NS_ERROR_NOT_INITIALIZED);
// if these aren't set, insert the defaults.
//
if ((mDesc->lud_filter == NULL) || (nsCRT::strlen(mDesc->lud_filter) == 0))
*aFilter = nsCRT::strdup("objectClass=*");
else
*aFilter = nsCRT::strdup(mDesc->lud_filter);
if ( ! (mDesc->lud_filter && mDesc->lud_filter[0] ) ) {
*aFilter = nsCRT::strdup("objectClass=*");
} else {
*aFilter = nsCRT::strdup(mDesc->lud_filter);
}
if ( ! *aFilter ) {
return NS_ERROR_OUT_OF_MEMORY;
}
if (*aFilter == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP nsLDAPURL::SetFilter(const char * aFilter)
@@ -325,7 +348,8 @@ NS_IMETHODIMP nsLDAPURL::SetFilter(const char * aFilter)
return NS_ERROR_NOT_IMPLEMENTED;
}
/* attribute unsigned long options; */
// attribute unsigned long options;
//
NS_IMETHODIMP nsLDAPURL::GetOptions(PRUint32 *aOptions)
{
return NS_ERROR_NOT_IMPLEMENTED;

View File

@@ -1,4 +1,5 @@
/*
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -9,7 +10,7 @@
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the mozilla.org LDAP XPCOM component.
* The Original Code is the mozilla.org LDAP XPCOM SDK.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
@@ -31,12 +32,6 @@
* GPL.
*/
// so g++ doesn't whine about one of the files included by ldap.h
//
#ifdef linux
#define __STRICT_ANSI__
#endif
#include "nsLDAP.h"
#include "ldap.h"
#include "nsILDAPURL.h"
@@ -58,6 +53,6 @@ class nsLDAPURL : public nsILDAPURL
virtual ~nsLDAPURL();
protected:
LDAPURLDesc *mDesc; // the URL descriptor we're wrapping
nsCString mSpec; // string representation
LDAPURLDesc *mDesc; // the URL descriptor we're wrapping
nsCString mSpec; // string representation
};

View File

@@ -9,7 +9,7 @@
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the mozilla.org LDAP RDF datasource
# The Original Code is the mozilla.org LDAP XPCOM SDK.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are

View File

@@ -1,4 +1,5 @@
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
@@ -49,14 +50,6 @@ const NS_RDF_NO_VALUE = NS_ERROR_RDF_BASE + 2;
const NS_RDF_ASSERTION_ACCEPTED = Components.results.NS_OK;
const NS_RDF_ASSERTION_REJECTED = NS_ERROR_RDF_BASE + 3;
// some stuff from ldap.h
//
const LDAP_RES_BIND = 0x61;
const LDAP_RES_SEARCH_ENTRY = 0x64;
const LDAP_RES_SEARCH_RESULT = 0x65;
const NS_LDAP_SCOPE_BASE = 0;
// ArrayEnumerator courtesy of Brendan Eich <brendan@mozilla.org>
//
function ArrayEnumerator(array) {
@@ -816,7 +809,7 @@ nsLDAPMessageRDFDelegateFactory.prototype =
// XXX how do we deal with this in release builds?
// XXX deal with already bound case
//
if (aMessage.type != LDAP_RES_BIND) {
if (aMessage.type != aMessage.RES_BIND) {
dump("bind failed\n");
}
@@ -859,7 +852,7 @@ nsLDAPMessageRDFDelegateFactory.prototype =
var listHash;
if (aMessage.type == LDAP_RES_SEARCH_ENTRY) {
if (aMessage.type == aMessage.RES_SEARCH_ENTRY) {
if (DEBUG) {
dump("getTargetsSearchCallback() called with " +
"message " + aMessage.dn + " for " +
@@ -926,7 +919,7 @@ nsLDAPMessageRDFDelegateFactory.prototype =
}
}
}
else if (aMessage.type == LDAP_RES_SEARCH_RESULT) {
else if (aMessage.type == aMessage.RES_SEARCH_RESULT) {
listHash = this.callerObject.mMessagesListHash;
if (listHash.hasOwnProperty(this.outer.Value)
&& (listHash[this.outer.Value].Count() == 1)
@@ -987,7 +980,7 @@ nsLDAPMessageRDFDelegateFactory.prototype =
// make sure that this if this URL is for a messagelist, it
// represents something other than a base search
//
if ((aKey == "messagelist.ldap") && (url.scope == NS_LDAP_SCOPE_BASE)) {
if ((aKey == "messagelist.ldap") && (url.scope == url.SCOPE_BASE)) {
throw Components.results.NS_ERROR_FAILURE;
}

View File

@@ -5,7 +5,8 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<tree datasources="rdf:ldap"
flex="2" id="testTree" ref="ldap://memberdir.netscape.com:389/ou=member_directory,o=netcenter.com??one?(sn=Rasputin)">
flex="2" id="testTree"
ref="ldap://alpha.dante.org.uk:389/dc=dante,dc=org,dc=uk??sub?drink=*">
<template>
<rule>
@@ -18,19 +19,19 @@
<bindings>
<binding subject="?child"
predicate="http://www.mozilla.org/LDAPATTR-rdf#mail"
object="?mail" />
predicate="http://www.mozilla.org/LDAPATTR-rdf#drink"
object="?drink" />
<binding subject="?child"
predicate="http://www.mozilla.org/LDAPATTR-rdf#cn"
object="?cn" />
predicate="http://www.mozilla.org/LDAPATTR-rdf#givenname"
object="?givenname" />
</bindings>
<action>
<treechildren flex="1">
<treeitem uri="?child">
<treerow>
<treecell class="treecell-indent" value="?mail" flex="1" />
<treecell value="?cn" flex="1" />
<treecell class="treecell-indent" value="?drink" flex="1" />
<treecell value="?givenname" flex="1" />
</treerow>
</treeitem>
</treechildren>
@@ -40,14 +41,14 @@
</template>
<treecols id="theColumns">
<treecol id="mail" flex="1" />
<treecol id="cn" flex="1" />
<treecol id="drink" flex="1" />
<treecol id="givenname" flex="1" />
</treecols>
<treehead>
<treerow id="headRow">
<treecell value="Email Address" flex="1" />
<treecell value="Real Name" flex="1" />
<treecell value="Drink" flex="1" />
<treecell value="Given Name" flex="1" />
</treerow>
</treehead>
</tree>