// $Id$
// 
// Copyright 2007-2008 Cisco Systems Inc.
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//  
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.

using System;
using Etch.Support;
using Etch.Transport;
using Etch.Util;

/**
 * Call to message translator for ClosingServer.
 */
namespace etch.tests
{

	public class ImplClosingServer : BaseClosingServer,ObjSession
	{

		/// 
		/// <summary>Constructs the ImplClosingServer.</summary>
		///
 		/// <param name=client></param>
 		///
		public ImplClosingServer(RemoteClosingClient client )
		{
		    this.client = client;
            _delegate_close = Myclose;

		}

	    private readonly RemoteClosingClient client;

        public void Myclose()
        {
            Console.WriteLine("ImplClosingServer.sayingStopToClient");
            client._TransportControl(TransportConsts.STOP, null);

            Console.WriteLine("ImplClosingServer.saidStopToClient");
        }

       

        public new void _SessionNotify(Object eventObj)
        {
            Console.WriteLine("ImplClosingServer _sessionNotify" + eventObj);
        }

		
	}
}