-/******************************************************************************
-* The MIT License
-* Copyright (c) 2003 Novell Inc. www.novell.com
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copy
-* of this software and associated documentation files (the Software), to deal
-* in the Software without restriction, including without limitation the rights
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the Software is
-* furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in
-* all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-* SOFTWARE.
-*******************************************************************************/
-//
-// Novell.Directory.Ldap.Utilclass.ExtResponseFactory.cs
-//
-// Author:
-// Sunil Kumar (Sunilk@novell.com)
-//
-// (C) 2003 Novell, Inc (http://www.novell.com)
-//
using System;
using Novell.Directory.Ldap;
using Novell.Directory.Ldap.Extensions;
using Novell.Directory.Ldap.Rfc2251;
+
namespace Novell.Directory.Ldap.Utilclass
{
+
/// <summary>
/// Takes an LdapExtendedResponse and returns an object
/// (that implements the base class ParsedExtendedResponse)
/// based on the OID.
///
- /// You can then call methods defined in the child
+ /// <p>You can then call methods defined in the child
/// class to parse the contents of the response. The methods available
/// depend on the child class. All child classes inherit from the
- /// ParsedExtendedResponse.
+ /// ParsedExtendedResponse.</p>
///
/// </summary>
public class ExtResponseFactory
/// </summary>
/// <param name="inResponse"> The LdapExtendedReponse object as returned by the
/// extendedOperation method in the LdapConnection object.
- ///
/// </param>
/// <returns> An object of base class LdapExtendedResponse. The actual child
/// class of this returned object depends on the operation being
/// performed.
- ///
/// </returns>
- /// <exception> LdapException A general exception which includes an error message
- /// and an Ldap error code.
- /// </exception>
static public LdapExtendedResponse convertToExtendedResponse(RfcLdapMessage inResponse)
{
LdapExtendedResponse tempResponse = new LdapExtendedResponse(inResponse);
-
// Get the oid stored in the Extended response
System.String inOID = tempResponse.ID;
- if ((System.Object) inOID == null)
- return tempResponse;
- // Is this an OID we support, if yes then build the
- // detailed LdapExtendedResponse object
+ RespExtensionSet regExtResponses = LdapExtendedResponse.RegisteredResponses;
try
{
- if (inOID.Equals(ReplicationConstants.NAMING_CONTEXT_COUNT_RES))
- {
- return new PartitionEntryCountResponse(inResponse);
- }
- if (inOID.Equals(ReplicationConstants.GET_IDENTITY_NAME_RES))
+ System.Type extRespClass = regExtResponses.findResponseExtension(inOID);
+ if (extRespClass == null)
{
- return new GetBindDNResponse(inResponse);
- }
- if (inOID.Equals(ReplicationConstants.GET_EFFECTIVE_PRIVILEGES_RES))
- {
- return new GetEffectivePrivilegesResponse(inResponse);
- }
- if (inOID.Equals(ReplicationConstants.GET_REPLICA_INFO_RES))
- {
- return new GetReplicaInfoResponse(inResponse);
+ return tempResponse;
}
- if (inOID.Equals(ReplicationConstants.LIST_REPLICAS_RES))
+ System.Type[] argsClass = new System.Type[]{typeof(RfcLdapMessage)};
+ System.Object[] args = new System.Object[]{inResponse};
+ System.Exception ex;
+ try
{
- return new ListReplicasResponse(inResponse);
+ System.Reflection.ConstructorInfo extConstructor = extRespClass.GetConstructor(argsClass);
+ try
+ {
+ System.Object resp = null;
+ resp = extConstructor.Invoke(args);
+ return (LdapExtendedResponse) resp;
+ }
+ catch (System.UnauthorizedAccessException e)
+ {
+ ex = e;
+ }
+ catch (System.Reflection.TargetInvocationException e)
+ {
+ ex = e;
+ }
+ catch (System.Exception e)
+ {
+ // Could not create the ResponseControl object
+ // All possible exceptions are ignored. We fall through
+ // and create a default LdapControl object
+ ex = e;
+ }
}
- if (inOID.Equals(ReplicationConstants.GET_REPLICATION_FILTER_RES))
+ catch (System.MethodAccessException e)
{
- return new GetReplicationFilterResponse(inResponse);
+ // bad class was specified, fall through and return a
+ // default LdapExtendedResponse object
+ ex = e;
}
- else
- return tempResponse;
}
- catch (System.IO.IOException ioe)
+ catch (System.FieldAccessException e)
{
- throw new LdapException(ExceptionMessages.DECODING_ERROR, LdapException.DECODING_ERROR, (System.String) null);
}
+ // If we get here we did not have a registered extendedresponse
+ // for this oid. Return a default LdapExtendedResponse object.
+ return tempResponse;
}
}
-}
+}
\ No newline at end of file
Novell.Directory.Ldap/AssemblyInfo.cs
+Novell.Directory.Ldap/SupportClass.cs
Novell.Directory.Ldap.Utilclass/Base64.cs
Novell.Directory.Ldap.Utilclass/DN.cs
Novell.Directory.Ldap.Utilclass/RDN.cs
+Novell.Directory.Ldap.Utilclass/RespExtensionSet.cs
Novell.Directory.Ldap.Utilclass/BindProperties.cs
Novell.Directory.Ldap.Utilclass/ReferralInfo.cs
Novell.Directory.Ldap.Utilclass/ArrayEnumeration.cs
Novell.Directory.Ldap.Rfc2251/RfcUnbindRequest.cs
Novell.Directory.Ldap.Rfc2251/RfcExtendedRequest.cs
Novell.Directory.Ldap.Rfc2251/RfcExtendedResponse.cs
-Novell.Directory.Ldap/SupportClass.cs
Novell.Directory.Ldap/LdapConnection.cs
Novell.Directory.Ldap/LdapAuthHandler.cs
Novell.Directory.Ldap/LdapBindHandler.cs
Novell.Directory.Ldap/LdapCompareRequest.cs
Novell.Directory.Ldap/LdapModification.cs
Novell.Directory.Ldap/LdapAddRequest.cs
+Novell.Directory.Ldap/LdapDSConstants.cs
Novell.Directory.Ldap/LdapResponseQueue.cs
Novell.Directory.Ldap/LdapDeleteRequest.cs
Novell.Directory.Ldap/LdapLocalException.cs
using System;
using Novell.Directory.Ldap.Rfc2251;
using Novell.Directory.Ldap.Asn1;
+using RespExtensionSet = Novell.Directory.Ldap.Utilclass.RespExtensionSet;
namespace Novell.Directory.Ldap
{
}
}
+
+ static LdapExtendedResponse()
+ {
+ registeredResponses = new RespExtensionSet();
+ }
+
+ public static RespExtensionSet RegisteredResponses
+ {
+ /* package */
+
+ get
+ {
+ return registeredResponses;
+ }
+
+ }
+
/// <summary> Returns the value part of the response in raw bytes.
///
/// </summary>
}
}
+ private static RespExtensionSet registeredResponses;
/// <summary> Creates an LdapExtendedResponse object which encapsulates
/// a server response to an asynchronous extended operation request.
public LdapExtendedResponse(RfcLdapMessage message):base(message)
{
}
+
+ /// <summary> Registers a class to be instantiated on receipt of a extendedresponse
+ /// with the given OID.
+ ///
+ /// <p>Any previous registration for the OID is overridden. The
+ /// extendedResponseClass object MUST be an extension of
+ /// LDAPExtendedResponse. </p>
+ ///
+ /// </summary>
+ /// <param name="oid"> The object identifier of the control.
+ /// </param>
+ /// <param name="extendedResponseClass"> A class which can instantiate an
+ /// LDAPExtendedResponse.
+ /// </param>
+ public static void register(System.String oid, System.Type extendedResponseClass)
+ {
+ registeredResponses.registerResponseExtension(oid, extendedResponseClass);
+ return ;
+ }
+
}
}