Moving micasa 1.5 trunk to Novell forge.
This commit is contained in:
142
c_micasad/communication/UnixIPCChannel.cs
Normal file
142
c_micasad/communication/UnixIPCChannel.cs
Normal file
@@ -0,0 +1,142 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user