New test.
[mono.git] / mcs / class / Novell.Directory.Ldap / Novell.Directory.Ldap.Events.Edir / EdirEventSource.cs
1 /******************************************************************************
2 * The MIT License
3 * Copyright (c) 2003 Novell Inc.  www.novell.com
4
5 * Permission is hereby granted, free of charge, to any person obtaining  a copy
6 * of this software and associated documentation files (the Software), to deal
7 * in the Software without restriction, including  without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
9 * copies of the Software, and to  permit persons to whom the Software is 
10 * furnished to do so, subject to the following conditions:
11
12 * The above copyright notice and this permission notice shall be included in 
13 * all copies or substantial portions of the Software.
14
15 * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *******************************************************************************/
23 //
24 // Novell.Directory.Ldap.Events.Edir.EdirEventSource.cs
25 //
26 // Author:
27 //   Anil Bhatia (banil@novell.com)
28 //
29 // (C) 2003 Novell, Inc (http://www.novell.com)
30 //
31
32
33 using System;
34
35 namespace Novell.Directory.Ldap.Events.Edir
36 {
37   /// <summary> 
38   /// This is the source class for Edir events.
39   /// </summary>
40   public class EdirEventSource : LdapEventSource
41   {
42     protected EdirEventHandler edir_event;
43
44     /// <summary>
45     /// Caller has to register with this event in order to be notified of
46     /// corresponding Edir events.
47     /// </summary>
48     public event EdirEventHandler EdirEvent
49     {
50       add
51       {
52         edir_event += value;
53         ListenerAdded();
54       }
55       remove
56       {
57         edir_event -= value;
58         ListenerRemoved();
59       }
60     }
61
62     /// <summary> 
63     /// EdirEventHandler is the delegate definition for EdirEvent.
64     /// The client (listener) has to register using this delegate in order to
65     /// get corresponding Edir events.
66     /// </summary>
67     public delegate
68     void EdirEventHandler(object source,
69                           EdirEventArgs objEdirEventArgs);
70
71     protected override int GetListeners()
72     {
73       int nListeners = 0;
74       if (null != edir_event)
75         nListeners = edir_event.GetInvocationList().Length;
76
77       return nListeners;
78     }
79
80     protected LdapConnection mConnection;
81     protected MonitorEventRequest mRequestOperation = null;
82     protected LdapResponseQueue mQueue = null;
83
84     public EdirEventSource(EdirEventSpecifier[] specifier, LdapConnection conn)
85     {
86       if ((null == specifier) || (null == conn))
87         throw new ArgumentException("Null argument specified");
88
89       mRequestOperation = new MonitorEventRequest(specifier);
90       mConnection = conn;
91     }
92
93     protected override void StartSearchAndPolling()
94     {
95       mQueue = mConnection.ExtendedOperation(mRequestOperation, null, null);
96       int[] ids = mQueue.MessageIDs;
97
98       if (ids.Length != 1)
99       {
100         throw new LdapException(
101                                 null,
102                                 LdapException.LOCAL_ERROR,
103                                 "Unable to Obtain Message Id"
104                                 );
105       }
106
107       StartEventPolling(mQueue, mConnection, ids[0]);
108     }
109
110     protected override void StopSearchAndPolling()
111     {
112       mConnection.Abandon(mQueue);
113       StopEventPolling();
114     }
115
116     protected override bool NotifyEventListeners(LdapMessage sourceMessage,
117                                EventClassifiers aClassification,
118                                int nType)
119     {
120       bool bListenersNotified = false;
121       if (null != edir_event)
122       {
123         if (null != sourceMessage)
124         {
125           if ((sourceMessage.Type == LdapMessage.INTERMEDIATE_RESPONSE) &&
126               (sourceMessage is EdirEventIntermediateResponse))
127           {
128             edir_event(this,
129                        new EdirEventArgs(sourceMessage,
130                                          EventClassifiers.CLASSIFICATION_EDIR_EVENT));
131             bListenersNotified = true;
132           }
133         }
134       }
135
136       return bListenersNotified;
137     }
138   }
139 }