/****************************************************************************** * 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.Controls.LdapPersistSearchControl.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.Asn1; namespace Novell.Directory.Ldap.Controls { /// LdapPersistSearchControl is a Server Control that allows a client /// to receive notifications from the server of changes to entries within /// the searches result set. The client can be notified when an entry is /// added to the result set, when an entry is deleted from the result set, /// when a DN has been changed or when and attribute value has been changed. /// public class LdapPersistSearchControl:LdapControl { /// Returns the change types to be monitored as a logical OR of any or /// all of these values: ADD, DELETE, MODIFY, and/or MODDN. /// /// /// the change types to be monitored. The logical or of any of /// the following values: ADD, DELETE, MODIFY, and/or MODDN. /// /// Sets the change types to be monitored. /// /// types The change types to be monitored as a logical OR of any or all /// of these types: ADD, DELETE, MODIFY, and/or MODDN. Can also be set /// to the value ANY which is defined as the logical OR of all of the /// preceding values. /// virtual public int ChangeTypes { get { return m_changeTypes; } set { m_changeTypes = value; m_sequence.set_Renamed(CHANGETYPES_INDEX, new Asn1Integer(m_changeTypes)); setValue(); return ; } } /// Returns true if entry change controls are to be returned with the /// search results. /// /// /// true if entry change controls are to be returned with the /// search results. Otherwise, false is returned /// /// When set to true, requests that entry change controls be returned with /// the search results. /// /// /// true to return entry change controls. /// virtual public bool ReturnControls { get { return m_returnControls; } set { m_returnControls = value; m_sequence.set_Renamed(RETURNCONTROLS_INDEX, new Asn1Boolean(m_returnControls)); setValue(); return ; } } /// getChangesOnly returns true if only changes are to be returned. /// Results from the initial search are not returned. /// /// /// true of only changes are to be returned /// /// When set to true, requests that only changes be returned, results from /// the initial search are not returned. /// /// true to skip results for the initial search /// virtual public bool ChangesOnly { get { return m_changesOnly; } set { m_changesOnly = value; m_sequence.set_Renamed(CHANGESONLY_INDEX, new Asn1Boolean(m_changesOnly)); setValue(); return ; } } /* private data members */ private static int SEQUENCE_SIZE = 3; private static int CHANGETYPES_INDEX = 0; private static int CHANGESONLY_INDEX = 1; private static int RETURNCONTROLS_INDEX = 2; private static LBEREncoder s_encoder; private int m_changeTypes; private bool m_changesOnly; private bool m_returnControls; private Asn1Sequence m_sequence; /// The requestOID of the persistent search control private static System.String requestOID = "2.16.840.1.113730.3.4.3"; /// The responseOID of the psersistent search - entry change control private static System.String responseOID = "2.16.840.1.113730.3.4.7"; /// Change type specifying that you want to track additions of new entries /// to the directory. /// public const int ADD = 1; /// Change type specifying that you want to track removals of entries from /// the directory. /// public const int DELETE = 2; /// Change type specifying that you want to track modifications of entries /// in the directory. /// public const int MODIFY = 4; /// Change type specifying that you want to track modifications of the DNs /// of entries in the directory. /// public const int MODDN = 8; /// Change type specifying that you want to track any of the above /// modifications. /// public static readonly int ANY = ADD | DELETE | MODIFY | MODDN; /* public constructors */ /// The default constructor. A control with changes equal to ANY, /// isCritical equal to true, changesOnly equal to true, and /// returnControls equal to true /// public LdapPersistSearchControl():this(ANY, true, true, true) { return ; } /// Constructs an LdapPersistSearchControl object according to the /// supplied parameters. The resulting control is used to specify a /// persistent search. /// /// /// the change types to monitor. The bitwise OR of any /// of the following values: ///
  • LdapPersistSearchControl.ADD
  • ///
  • LdapPersistSearchControl.DELETE
  • ///
  • LdapPersistSearchControl.MODIFY
  • ///
  • LdapPersistSearchControl.MODDN
  • /// To track all changes the value can be set to: ///
  • LdapPersistSearchControl.ANY
  • /// /// /// true if you do not want the server to return /// all existing entries in the directory that match the search /// criteria. (Use this if you just want the changed entries to be /// returned.) /// /// /// true if you want the server to return entry /// change controls with each entry in the search results. You need to /// return entry change controls to discover what type of change /// and other additional information about the change. /// /// /// true if this control is critical to the search /// operation. If true and the server does not support this control, /// the server will not perform the search at all. /// public LdapPersistSearchControl(int changeTypes, bool changesOnly, bool returnControls, bool isCritical):base(requestOID, isCritical, null) { m_changeTypes = changeTypes; m_changesOnly = changesOnly; m_returnControls = returnControls; m_sequence = new Asn1Sequence(SEQUENCE_SIZE); m_sequence.add(new Asn1Integer(m_changeTypes)); m_sequence.add(new Asn1Boolean(m_changesOnly)); m_sequence.add(new Asn1Boolean(m_returnControls)); setValue(); return ; } public override System.String ToString() { sbyte[] data = m_sequence.getEncoding(s_encoder); System.Text.StringBuilder buf = new System.Text.StringBuilder(data.Length); for (int i = 0; i < data.Length; i++) { buf.Append(data[i].ToString()); if (i < data.Length - 1) buf.Append(","); } return buf.ToString(); } /// Sets the encoded value of the LdapControlClass private void setValue() { base.setValue(m_sequence.getEncoding(s_encoder)); return ; } static LdapPersistSearchControl() { s_encoder = new LBEREncoder(); /* * This is where we register the control response */ { /* Register the Entry Change control class which is returned by the * server in response to a persistent search request */ try { // Register LdapEntryChangeControl LdapControl.register(responseOID, System.Type.GetType("Novell.Directory.Ldap.Controls.LdapEntryChangeControl")); } catch (System.Exception e) { } } } } // end class LdapPersistentSearchControl }