public bool SendMessage(eMsgType msgType, ulong msgId, byte[] msg, ulong responseMsgId=0)
{
if (totalBytesInQUeue > sm.maxQueueSizeInBytes)
{
//Cleaning queue
lock (lock_q)
{
totalBytesInQUeue = 0;
q.Clear();
}
//Generating exception
throw new Exception("tiesky.com.SharmIpc: ReaderWriterHandler max queue treshold is reached " + sm.maxQueueSizeInBytes);
//return false;
}
lock (lock_q)
{
//Splitting message
int i = 0;
int left = msg == null ? 0 : msg.Length;
byte[] pMsg = null;
ushort totalChunks = msg == null ? (ushort)1 : (msg.Length == 0) ? Convert.ToUInt16(1) : Convert.ToUInt16(Math.Ceiling((double)msg.Length / (double)bufferLenS));
ushort currentChunk = 1;
while (true)
{
if (left > bufferLenS)
{
pMsg = new byte[bufferLenS + protocolLen];
//Writing protocol header
Buffer.BlockCopy(new byte[] { (byte)msgType }, 0, pMsg, 0, 1); //MsgType (1 for standard message)
Buffer.BlockCopy(BitConverter.GetBytes(msgId), 0, pMsg, 1, 8); //msgId_Sending
Buffer.BlockCopy(BitConverter.GetBytes(bufferLenS), 0, pMsg, 9, 4); //payload len
Buffer.BlockCopy(BitConverter.GetBytes(currentChunk), 0, pMsg, 13, 2); //current chunk
Buffer.BlockCopy(BitConverter.GetBytes(totalChunks), 0, pMsg, 15, 2); //total chunks
Buffer.BlockCopy(BitConverter.GetBytes(responseMsgId), 0, pMsg, 17, 8); //total chunks
//Writing payload
if(msg != null && msg.Length>0)
Buffer.BlockCopy(msg, i, pMsg, protocolLen, bufferLenS);
left -= bufferLenS;
i += bufferLenS;
q.Enqueue(pMsg);
totalBytesInQUeue += pMsg.Length;
}
else
{
pMsg = new byte[left + protocolLen];
//Writing protocol header
Buffer.BlockCopy(new byte[] { (byte)msgType }, 0, pMsg, 0, 1); //MsgType (1 for standard message)
Buffer.BlockCopy(BitConverter.GetBytes(msgId), 0, pMsg, 1, 8); //msgId_Sending
Buffer.BlockCopy(BitConverter.GetBytes((msg != null && msg.Length == 0) ? Int32.MaxValue : left), 0, pMsg, 9, 4); //payload len
Buffer.BlockCopy(BitConverter.GetBytes(currentChunk), 0, pMsg, 13, 2); //current chunk
Buffer.BlockCopy(BitConverter.GetBytes(totalChunks), 0, pMsg, 15, 2); //total chunks
Buffer.BlockCopy(BitConverter.GetBytes(responseMsgId), 0, pMsg, 17, 8); //total chunks
//Writing payload
if (msg != null && msg.Length > 0)
Buffer.BlockCopy(msg, i, pMsg, protocolLen, left);
q.Enqueue(pMsg);
totalBytesInQUeue += pMsg.Length;
break;
}
currentChunk++;
}
////For SendProcedure1
//mreSmthToSend.Set();
}//eo lock
StartSendProcedure();
return true;
}