Initial commit
[mono.git] / mcs / class / referencesource / mscorlib / system / runtime / remoting / clientsponsor.cs
1 // ==++==
2 // 
3 //   Copyright (c) Microsoft Corporation.  All rights reserved.
4 // 
5 // ==--==
6 //+----------------------------------------------------------------------------
7 //
8 // File:        ClientSponsor.cs
9 //
10 // Contents:    Agent for keeping Server Object's lifetime in [....] with a client's lifetime
11 //
12 // History:     8/9/00   <EMAIL>[....]</EMAIL>        Created
13 //
14 //+----------------------------------------------------------------------------
15
16 namespace System.Runtime.Remoting.Lifetime
17 {
18     using System;
19     using System.Collections;
20     using System.Security.Permissions;
21
22     [System.Security.SecurityCritical]  // auto-generated_required
23     [SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.Infrastructure)]    
24     [System.Runtime.InteropServices.ComVisible(true)]
25     public class ClientSponsor : MarshalByRefObject, ISponsor
26     {
27         private Hashtable sponsorTable = new Hashtable(10);
28         private TimeSpan m_renewalTime = TimeSpan.FromMinutes(2);
29
30         public ClientSponsor()
31         {
32         }
33
34         public ClientSponsor(TimeSpan renewalTime)
35         {
36             this.m_renewalTime = renewalTime;
37         }
38
39         public TimeSpan RenewalTime
40         {
41             get{ return m_renewalTime;}
42             set{ m_renewalTime = value;}
43         }
44             
45         [System.Security.SecurityCritical]  // auto-generated
46         public bool Register(MarshalByRefObject obj)
47         {
48             BCLDebug.Trace("REMOTE", "ClientSponsor Register "+obj);
49             ILease lease = (ILease)obj.GetLifetimeService();
50             if (lease == null)
51                 return false;
52
53             lease.Register(this);
54             lock(sponsorTable)
55             {
56                 sponsorTable[obj] = lease;
57             }
58             return true;
59         }
60
61         [System.Security.SecurityCritical]  // auto-generated
62         public void Unregister(MarshalByRefObject obj)
63         {
64             BCLDebug.Trace("REMOTE", "ClientSponsor Unregister "+obj);
65
66             ILease lease = null;
67             lock(sponsorTable)
68             {
69                 lease = (ILease)sponsorTable[obj];
70             }
71             if (lease != null)
72                 lease.Unregister(this);
73         }
74
75         // ISponsor method
76         [System.Security.SecurityCritical]
77         public TimeSpan Renewal(ILease lease)
78         {
79             BCLDebug.Trace("REMOTE", "ClientSponsor Renewal "+m_renewalTime);
80             return m_renewalTime;
81         }
82
83         [System.Security.SecurityCritical]  // auto-generated
84         public void Close()
85         {
86             BCLDebug.Trace("REMOTE","ClientSponsor Close");
87             lock(sponsorTable)
88             {
89                 IDictionaryEnumerator e = sponsorTable.GetEnumerator();
90                 while(e.MoveNext())
91                     ((ILease)e.Value).Unregister(this);
92                 sponsorTable.Clear();
93             }
94         }
95
96         // Don't create a lease on the sponsor
97         [System.Security.SecurityCritical]
98         public override Object InitializeLifetimeService()
99         {
100             return null;
101         }
102
103         [System.Security.SecuritySafeCritical] // finalizers should be treated as safe
104         ~ClientSponsor()
105         {
106             BCLDebug.Trace("REMOTE","ClientSponsor Finalize");
107         }
108     }
109 }