Home
Browse all 647 examples
Download all 647 examples
Download sample chapters
Reviews
Errata
Acknowledgments
Links on .NET
Paradoxal Press

Buy directly from Paradoxal Press at $33.99 (Save 43%)



Category: Programming
Level: Beginner to seasoned
900 pages
ISBN-10 097661322-0
ISBN-13 978-097661322-0
$59.99 USA
$79.99 CANADA


Listing 22-30 extracted from chapter .NET Remoting


Listing 22-29<     > Listing 22-31


This listing can be compiled with the command line:
csc.exe /out:CustomChannelSink.dll /target:library Example_22_30_to_rename_CustomChannelSink.cs
Errors: 0 Warnings: 0


Example_22_30_to_rename_CustomChannelSink.cs
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.Collections;
using System.IO;

namespace CustomChannelSink {
   internal static class Helper {
     public static Stream GetStreamLength(Stream inStream,out long length){
        // Does 'inStream' support seek access?
        if (inStream.CanSeek) {
           length = inStream.Length;
           return inStream;
        }
        // Here 'seek acces' is not supported. We must copy 'inStream'
        // to 'outStream' to obtain the stream length.
        Stream outStream = new MemoryStream();
        byte[] buffer = new Byte[1024];
        int tmp, nBytesRead = 0;
        while ( ( tmp = inStream.Read( buffer, 01024 ) ) > ) {
           outStream.Write( buffer, nBytesRead, tmp );
           nBytesRead += tmp;
        }
        outStream.Seek( 0SeekOrigin.Begin );
        length = nBytesRead;
        return outStream;
     }
   }

   //
   // Custom Client Sink.
   //
   public class CustomClientSink : BaseChannelSinkWithProperties,
                                   IClientChannelSink {
      private IClientChannelSink m_NextSink;
      public CustomClientSinkIClientChannelSink nextSink ) { 
         m_NextSink = nextSink; 
      }
      public IClientChannelSink NextChannelSink { 
         get return m_NextSink; } 
      }
      public void AsyncProcessRequest( IClientChannelSinkStack sinkStack,
                                       IMessage msgIn,
                                       ITransportHeaders headers,
                                       Stream msgStream ) {
         long length;
         msgStream = Helper.GetStreamLength( msgStream, out length );
         Console.WriteLine(
            "CustomClientSink:Async, length of the request stream {0}",
            length );
         // Chaining message sink for async return processing.
         sinkStack.Push( thisnull );
         m_NextSink.AsyncProcessRequest(sinkStack,msgIn,headers,msgStream);
      }
      public void AsyncProcessResponse(
                           IClientResponseChannelSinkStack sinkStack,
                           Object state,
                           ITransportHeaders headers,
                           Stream msgStream) {
         long length;
         msgStream = Helper.GetStreamLength( msgStream, out length );
         Console.WriteLine(
            "CustomClientSink:Async, length of the response stream {0}",
            length);
         m_NextSink.AsyncProcessResponse(
                                     sinkStack, state, headers, msgStream);
      }
      public Stream GetRequestStream(IMessage msg,
                                     ITransportHeaders headers) {
         return m_NextSink.GetRequestStream( msg, headers );
      }

      public void ProcessMessage( IMessage msg,
                                  ITransportHeaders headersIn,
                                  Stream msgInStream,
                                  out ITransportHeaders headersOut,
                                  out Stream msgOutStream) {
         long length;
         msgInStream = Helper.GetStreamLength( msgInStream, out length );
         Console.WriteLine(
            "CustomClientSink:Sync, length of the request stream {0}",
            length);
         m_NextSink.ProcessMessage(msg, headersIn, msgInStream,
                                   out headersOut, out msgOutStream);
         msgOutStream = Helper.GetStreamLength( msgOutStream, out length );
         Console.WriteLine(
            "CustomClientSink:Sync, length of the response stream {0}",
            length);
      }
   }

   //
   // Custom Server Sink.
   //
   public class CustomServerSink : BaseChannelSinkWithProperties,
                                   IServerChannelSink {
      private IServerChannelSink m_NextSink;
      public CustomServerSinkIServerChannelSink nextSink ) {
         m_NextSink = nextSink;
      }
      public IServerChannelSink NextChannelSink { 
         get return m_NextSink; } 
      }
      public void AsyncProcessResponse(
                        IServerResponseChannelSinkStack sinkStack,
                        object state,
                        IMessage msg,
                        ITransportHeaders headers,
                        Stream msgStream) {
         long length;
         msgStream = Helper.GetStreamLength( msgStream, out length );
         Console.WriteLine(
            "CustomServerSink:Async, length of the response stream {0}",
            length);
         m_NextSink.AsyncProcessResponse(
                             sinkStack, state, msg, headers, msgStream);
      }

      public Stream GetResponseStream(
                        IServerResponseChannelSinkStack sinkStack,
                        object state,
                        IMessage msg,
                        ITransportHeaders headers) {
         return null;
      }

      public ServerProcessing ProcessMessage(
                        IServerChannelSinkStack sinkStack,
                        IMessage msgIn,
                        ITransportHeaders headersIn,
                        Stream msgInStream,
                        out IMessage msgOut,
                        out ITransportHeaders headersOut,
                        out Stream msgOutStream) {
         long length;
         msgInStream = Helper.GetStreamLength(msgInStream, out length);
         Console.WriteLine(
            "CustomServerSink:Sync, length of the request stream {0}",
            length);
         // Chaining message sink for return processing.          
         sinkStack.Push( thisnull );
         ServerProcessing svrProc = m_NextSink.ProcessMessage(
                        sinkStack, msgIn, headersIn, msgInStream,
                        out msgOut, out headersOut, out msgOutStream);
         msgOutStream = Helper.GetStreamLength(msgOutStream,out length);
         Console.WriteLine(
            "CustomServerSink:Sync, length of the response stream {0}",
            length);
         return svrProc;
      }
   }

   //
   // Custom Client Sink Provider.
   //
   public class CustomClientSinkProvider : IClientChannelSinkProvider {
      private IClientChannelSinkProvider m_NextProvider;
      public CustomClientSinkProvider(IDictionary prop,
         ICollection providerData) { }
      public IClientChannelSinkProvider Next {
         get return m_NextProvider; }  set { m_NextProvider = value; }
      }
      public IClientChannelSink CreateSink(
                           IChannelSender channel,
                           string url,
                           object remoteChannelData ) {
         IClientChannelSink next =
            m_NextProvider.CreateSink( channel, url, remoteChannelData );
         Console.WriteLine(        
            "CustomClientSinkProvider:Creating a message sink.");
         return new CustomClientSink( next );
      }
   }

   //
   // Custom Server Sink Provider.
   //
   public class CustomServerSinkProvider : IServerChannelSinkProvider {
      private IServerChannelSinkProvider m_NextProvider;
      public CustomServerSinkProviderIDictionary prop,
                                       ICollection providerData) { }
      public IServerChannelSinkProvider Next {
         get return m_NextProvider; set { m_NextProvider = value; }
      }
      public IServerChannelSink CreateSink(IChannelReceiver canal) {
         IServerChannelSink next = m_NextProvider.CreateSink(canal);
         Console.WriteLine(
            "CustomServerSinkProvider:Creating a message sink.");
         return new CustomServerSink( next );
      }
      public void GetChannelData( IChannelDataStore channelData ) { }
   }
}	
Copyright Patrick Smacchia 2006 2007