private static void ProccessData_Term(Hashtable param)
{
BufferedSocket socket = (BufferedSocket)param["socket"];
MemoryStream strm = (MemoryStream)param["strm"];
string removeFromEnd = (string)param["removeFromEnd"];
_FixedStack stack = (_FixedStack)param["stack"];
int nextReadWriteLen = (int)param["nextReadWriteLen"];
object tag = param["tag"];
SocketCallBack callBack = (SocketCallBack)param["callBack"];
while(nextReadWriteLen > 0){
// We used buffer, request more data
if(socket.AvailableInBuffer < nextReadWriteLen){
// Store nextReadWriteLen for next call of this command
param["nextReadWriteLen"] = nextReadWriteLen;
// Recieve next bytes
byte[] buff = new byte[1024];
param["recieveBuffer"] = buff;
socket.BeginReceive(buff,0,buff.Length,0,new AsyncCallback(OnRecievedData),param);
// End this method, if data arrives, this method is called again
return;
}
//Read byte(s)
byte[] b = new byte[nextReadWriteLen];
int countRecieved = socket.ReceiveFromFuffer(b);
// Increase readed count
param["readedCount"] = ((long)param["readedCount"] + countRecieved);
// Write byte(s) to buffer, if length isn't exceeded.
if((long)param["readedCount"] < (long)param["maxLength"]){
strm.Write(b,0,countRecieved);
}
// Message size exceeded, we must junk stream data.
else if(strm.Length > 0){
strm.SetLength(0);
}
// Write to stack(terminator checker)
nextReadWriteLen = stack.Push(b,countRecieved);
}
// If we reach so far, then we have successfully readed data
if((long)param["readedCount"] < (long)param["maxLength"]){
// Remove "removeFromEnd" from end
if(removeFromEnd.Length > 0 && strm.Length > removeFromEnd.Length){
strm.SetLength(strm.Length - removeFromEnd.Length);
}
strm.Position = 0;
// We got all data successfully, call EndRecieve call back
callBack(SocketCallBackResult.Ok,(long)param["readedCount"],null,tag);
}
else{
callBack(SocketCallBackResult.LengthExceeded,(long)param["readedCount"],null,tag);
}
}