/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Library Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/


using System;
using System.IO;
using System.Text;

using AppModule.NamedPipes;
using sscs.communication.win;
using sscs.common;
using sscs.verbs;
using sscs.constants;


namespace sscs.communication
{

	class WinIPCChannel : IPCChannel
	{
		// Data
		private ServerPipeConnection m_serverPipeConnection;
		private WinUserIdentifier userId = null;

		//Methods

		public WinIPCChannel(ServerPipeConnection serverPipeConnection)
		{
			m_serverPipeConnection = serverPipeConnection;		        
		}

		override internal UserIdentifier GetIPCChannelUserId()
		{
			CSSSLogger.DbgLog("In WinIPCChannel::GetIPCChannelUserId");
			return userId;
		}

		private WinIPCChannel()
		{
			CSSSLogger.DbgLog("WinIPCChannel constructor must be called with a serverPipe");

		}
		~WinIPCChannel()
		{
			//  Console.WriteLine("WinIPCChannel::~~WinIPCChannel");
		}

		override internal byte[] Read()
		{
			int localUserIDLow = 0;
			int localUserIDHigh = 0;
			string sSIDString = "";
		
			byte[] incoming = null;
			try
			{

				incoming = m_serverPipeConnection.ReadBytes();
								
				// get local Userid and SID
				m_serverPipeConnection.GetLocalUserID(ref localUserIDLow, ref localUserIDHigh, ref sSIDString);		

				if (localUserIDLow != 0 || localUserIDHigh !=0)
				{
					userId = new WinUserIdentifier(localUserIDLow, localUserIDHigh, sSIDString);								
				}

				return incoming; 
			}
			catch(Exception e)
			{
				return null;
				//CSSSLogger.DbgLog("Exception in reading data from client" + e.ToString());
				//throw new CommunicationException(e.ToString()); 
			}                
		}
		
		override internal int Read(byte[] buf)
		{
			return 0;
		}

		override internal int Write(byte[] buf)
		{

			int bytesSent = 0;        
			try 
			{
				m_serverPipeConnection.WriteBytes(buf);
				bytesSent = buf.Length;
			}
			catch (Exception)
			{

			}
			CSSSLogger.DbgLog("WinIPCChannel::Write - Bytes sent is {0}" +bytesSent);
			return bytesSent; 

		}
		override internal void Close()
		{
			CSSSLogger.DbgLog("WinIPCChannel Closed");
			//clientSocket.Close();
			m_serverPipeConnection.Close();
		}
	}
}