CASA/c_micasad/communication/UnixIPCChannel.cs

143 lines
3.9 KiB
C#
Raw Normal View History

using System;
using System.Net;
using System.Net.Sockets;
using Mono.Posix;
using System.IO;
using System.Text;
using sscs.common;
using sscs.verbs;
using sscs.constants;
namespace sscs.communication
{
class UnixIPCChannel : IPCChannel
{
// Data
private Socket clientSocket;
private UnixUserIdentifier userId;
//Methods
internal UnixIPCChannel(Socket connectedSocket)
{
CSSSLogger.ExecutionTrace(this);
clientSocket = connectedSocket;
PeerCred cred = new PeerCred(connectedSocket);
userId = new UnixUserIdentifier(cred.UserID);
}
override internal UserIdentifier GetIPCChannelUserId()
{
CSSSLogger.ExecutionTrace(this);
return userId;
}
private UnixIPCChannel()
{
CSSSLogger.ExecutionTrace(this);
}
~UnixIPCChannel()
{
CSSSLogger.ExecutionTrace(this);
clientSocket.Close();
}
override internal int Read(byte[] buf)
{
return 0;
}
override internal byte[] Read()
{
CSSSLogger.ExecutionTrace(this);
int bytesRecvd = 0;
try
{
byte[] msgIdBytes = new byte[2];
bytesRecvd = clientSocket.Receive(msgIdBytes);
if( 0 == bytesRecvd )
{
return null;
}
if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
{
throw new CommunicationException("Client has not sent data.");
}
byte[] msgLenBytes = new byte[4];
bytesRecvd = clientSocket.Receive(msgLenBytes);
if( 0 == bytesRecvd )
{
return null;
}
if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
{
throw new CommunicationException("Client has not sent data.");
}
byte[] bufToReturn = null;
uint msgLen = BitConverter.ToUInt32(msgLenBytes,0);
if( msgLen > 6 )
{
byte[] buf = new byte[msgLen - 6];
bytesRecvd = clientSocket.Receive (buf);
CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " Bytes received is " + bytesRecvd);
if( 0 == bytesRecvd )
{
return null;
}
if( bytesRecvd < 0 ) // IPC is fine and Client had some problem
{
throw new CommunicationException("Client has not sent data.");
}
bufToReturn = new byte[msgLen];
Array.Copy(msgIdBytes,bufToReturn,2);
Array.Copy(msgLenBytes,0,bufToReturn,2,4);
Array.Copy(buf,0,bufToReturn,6,buf.Length);
return bufToReturn;
}
else
{
bufToReturn = new byte[6];
Array.Copy(msgIdBytes,bufToReturn,2);
Array.Copy(msgLenBytes,0,bufToReturn,2,4);
return bufToReturn;
}
}
catch(CommunicationException e)
{
throw e;
}
catch(Exception e)
{
CSSSLogger.ExpLog(e.ToString());
throw new CommunicationException(e.ToString());
}
}
override internal int Write(byte[] buf)
{
try
{
CSSSLogger.ExecutionTrace(this);
int bytesSent = clientSocket.Send(buf);
CSSSLogger.DbgLog("In " + CSSSLogger.GetExecutionPath(this) + " - Bytes sent is " + bytesSent);
return bytesSent;
}
catch(Exception e)
{
CSSSLogger.ExpLog(e.ToString());
return -1;
}
}
override internal void Close()
{
CSSSLogger.ExecutionTrace(this);
clientSocket.Close();
}
}
}