2009-12-02 Jb Evain <jbevain@novell.com>
[mono.git] / mcs / class / corlib / System.Runtime.Remoting.Services / TrackingServices.cs
1 //
2 // System.Runtime.Remoting.Services.TrackingServices.cs
3 //
4 // Author:
5 //      Jaime Anguiano Olarra (jaime@gnome.org)
6 //      Patrik Torstensson
7 //
8 // (C) 2002, Jaime Anguiano Olarra
9 //
10
11 //
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 // 
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 // 
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 //
33
34 using System;
35 using System.Collections;
36 using System.Runtime.Remoting;
37 using System.Runtime.InteropServices;
38
39 namespace System.Runtime.Remoting.Services {
40         [ComVisible (true)]
41         public class TrackingServices {
42                 static ArrayList _handlers = new ArrayList();
43
44                 public TrackingServices () {
45                 }
46
47                 public static void RegisterTrackingHandler (ITrackingHandler handler) {
48                         if (null == handler)
49                                 throw new ArgumentNullException("handler");
50
51                         lock (_handlers.SyncRoot) {
52                                 if (-1 != _handlers.IndexOf(handler))
53                                         throw new RemotingException("handler already registered");
54
55                                 _handlers.Add(handler);
56                         }
57                 }
58
59                 public static void UnregisterTrackingHandler (ITrackingHandler handler) {
60                         if (null == handler)
61                                 throw new ArgumentNullException("handler");
62
63                         lock (_handlers.SyncRoot) {
64                                 int idx = _handlers.IndexOf(handler);
65                                 if (idx == -1)
66                                         throw new RemotingException("handler is not registered");
67
68                                 _handlers.RemoveAt(idx);
69                         }
70                 }
71     \r
72                 public static ITrackingHandler[] RegisteredHandlers {\r
73                         get {\r
74                                 lock (_handlers.SyncRoot) {\r
75                                         if (_handlers.Count == 0)\r
76                                                 return new ITrackingHandler[0];\r
77 \r
78 \r
79                                         return (ITrackingHandler[]) _handlers.ToArray (typeof(ITrackingHandler));\r
80                                 }\r
81                         }\r
82                 }\r
83 \r
84                 internal static void NotifyMarshaledObject(Object obj, ObjRef or)
85                 {\r
86                         ITrackingHandler[] handlers;
87                         \r
88                         lock (_handlers.SyncRoot) {
89                                 if (_handlers.Count == 0) return;
90                                 handlers = (ITrackingHandler[]) _handlers.ToArray (typeof(ITrackingHandler));
91                         }
92                         \r
93                         for(int i = 0; i < handlers.Length; i++) {\r
94                                 handlers[i].MarshaledObject (obj, or);\r
95                         }\r
96                 }\r
97     \r
98                 internal static void NotifyUnmarshaledObject(Object obj, ObjRef or)
99                 {\r
100                         ITrackingHandler[] handlers;
101                         \r
102                         lock (_handlers.SyncRoot) {
103                                 if (_handlers.Count == 0) return;
104                                 handlers = (ITrackingHandler[]) _handlers.ToArray (typeof(ITrackingHandler));
105                         }
106                         \r
107                         for(int i = 0; i < handlers.Length; i++) {\r
108                                 handlers[i].UnmarshaledObject (obj, or);\r
109                         }\r
110                 }\r
111 \r
112                 internal static void NotifyDisconnectedObject(Object obj)
113                 {\r
114                         ITrackingHandler[] handlers;
115                         \r
116                         lock (_handlers.SyncRoot) {
117                                 if (_handlers.Count == 0) return;
118                                 handlers = (ITrackingHandler[]) _handlers.ToArray (typeof(ITrackingHandler));
119                         }
120                         \r
121                         for(int i = 0; i < handlers.Length; i++) {\r
122                                 handlers[i].DisconnectedObject (obj);\r
123                         }\r
124                 }\r
125         }
126 }
127