The Labs \ Source Viewer \ SSCLI \ System.Runtime.Remoting.Channels.Tcp \ TcpChannel

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. //==========================================================================
  16. // File: CombinedTcpChannel.cs
  17. //
  18. // Summary: Merges the client and server TCP channels
  19. //
  20. // Classes: public TcpChannel
  21. //
  22. //==========================================================================
  23. using System;
  24. using System.Collections;
  25. using System.Runtime.Remoting;
  26. using System.Runtime.Remoting.Messaging;
  27. using System.Globalization;
  28. using System.Security.Permissions;
  29. namespace System.Runtime.Remoting.Channels.Tcp
  30. {
  31.    
  32.     public class TcpChannel : IChannelReceiver, IChannelSender, ISecurableChannel
  33.     {
  34.         private TcpClientChannel _clientChannel = null;
  35.         // client channel
  36.         private TcpServerChannel _serverChannel = null;
  37.         // server channel
  38.         private int _channelPriority = 1;
  39.         // channel priority
  40.         private string _channelName = "tcp";
  41.         // channel name
  42.        
  43.         public TcpChannel()
  44.         {
  45.             _clientChannel = new TcpClientChannel();
  46.             // server channel will not be activated.
  47.         }
  48.         // TcpChannel
  49.         public TcpChannel(int port) : this()
  50.         {
  51.             _serverChannel = new TcpServerChannel(port);
  52.         }
  53.         // TcpChannel
  54.         public TcpChannel(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)
  55.         {
  56.             Hashtable clientData = new Hashtable();
  57.             Hashtable serverData = new Hashtable();
  58.            
  59.             bool portFound = false;
  60.            
  61.             // divide properties up for respective channels
  62.             if (properties != null) {
  63.                 foreach (DictionaryEntry entry in properties) {
  64.                     switch ((string)entry.Key) {
  65.                         case "name":
  66.                             // general channel properties
  67.                             _channelName = (string)entry.Value;
  68.                             break;
  69.                         case "priority":
  70.                             _channelPriority = Convert.ToInt32((string)entry.Value, CultureInfo.InvariantCulture);
  71.                             break;
  72.                         case "port":
  73.                            
  74.                             {
  75.                                 serverData["port"] = entry.Value;
  76.                                 portFound = true;
  77.                                 break;
  78.                             }
  79.                             break;
  80.                         default:
  81.                            
  82.                             clientData[entry.Key] = entry.Value;
  83.                             serverData[entry.Key] = entry.Value;
  84.                             break;
  85.                     }
  86.                 }
  87.             }
  88.            
  89.             _clientChannel = new TcpClientChannel(clientData, clientSinkProvider);
  90.            
  91.             if (portFound)
  92.                 _serverChannel = new TcpServerChannel(serverData, serverSinkProvider);
  93.         }
  94.         // TcpChannel
  95.         //
  96.         // ISecurableChannel implementation
  97.         //
  98.         public bool IsSecured {
  99.             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  100.             get {
  101.                 if (_clientChannel != null)
  102.                     return _clientChannel.IsSecured;
  103.                 if (_serverChannel != null)
  104.                     return _serverChannel.IsSecured;
  105.                 return false;
  106.             }
  107.             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  108.             set {
  109.                 if (((IList)ChannelServices.RegisteredChannels).Contains(this))
  110.                     throw new InvalidOperationException(CoreChannel.GetResourceString("Remoting_InvalidOperation_IsSecuredCannotBeChangedOnRegisteredChannels"));
  111.                 if (_clientChannel != null)
  112.                     _clientChannel.IsSecured = value;
  113.                 if (_serverChannel != null)
  114.                     _serverChannel.IsSecured = value;
  115.             }
  116.         }
  117.        
  118.         //
  119.         // IChannel implementation
  120.         //
  121.        
  122.         public int ChannelPriority {
  123.             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  124.             get { return _channelPriority; }
  125.         }
  126.         // ChannelPriority
  127.         public string ChannelName {
  128.             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  129.             get { return _channelName; }
  130.         }
  131.         // ChannelName
  132.         // returns channelURI and places object uri into out parameter
  133.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  134.         public string Parse(string url, out string objectURI)
  135.         {
  136.             return TcpChannelHelper.ParseURL(url, out objectURI);
  137.         }
  138.         // Parse
  139.         //
  140.         // end of IChannel implementation
  141.         //
  142.        
  143.        
  144.         //
  145.         // IChannelSender implementation
  146.         //
  147.        
  148.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  149.         public IMessageSink CreateMessageSink(string url, object remoteChannelData, out string objectURI)
  150.         {
  151.             return _clientChannel.CreateMessageSink(url, remoteChannelData, out objectURI);
  152.         }
  153.         // CreateMessageSink
  154.         //
  155.         // end of IChannelSender implementation
  156.         //
  157.        
  158.        
  159.         //
  160.         // IChannelReceiver implementation
  161.         //
  162.        
  163.         public object ChannelData {
  164.             [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  165.             get {
  166.                 if (_serverChannel != null)
  167.                     return _serverChannel.ChannelData;
  168.                 else
  169.                     return null;
  170.             }
  171.         }
  172.         // ChannelData
  173.        
  174.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  175.         public string[] GetUrlsForUri(string objectURI)
  176.         {
  177.             if (_serverChannel != null)
  178.                 return _serverChannel.GetUrlsForUri(objectURI);
  179.             else
  180.                 return null;
  181.         }
  182.         // GetUrlsforURI
  183.        
  184.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  185.         public void StartListening(object data)
  186.         {
  187.             if (_serverChannel != null)
  188.                 _serverChannel.StartListening(data);
  189.         }
  190.         // StartListening
  191.        
  192.         [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure, Infrastructure = true)]
  193.         public void StopListening(object data)
  194.         {
  195.             if (_serverChannel != null)
  196.                 _serverChannel.StopListening(data);
  197.         }
  198.         // StopListening
  199.         //
  200.         // IChannelReceiver implementation
  201.         //
  202.        
  203.        
  204.     }
  205.     // class TcpChannel
  206.    
  207. }
  208. // namespace System.Runtime.Remoting.Channels.Tcp

Developer Fusion