SafeDispatch/AndroidLIB/PreParser.cs

109 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace AndroidLIB
{
public class PreParser
{
public static InterthreadMessageQueue<AndroidMSG> AndroMessageQueue;
public PreParser()
{
AndroMessageQueue = new InterthreadMessageQueue<AndroidMSG>();
}
public void FeedData(byte[] data, int recv, string sourceIP)
{
String stringData = System.Text.Encoding.ASCII.GetString(data, 0, recv);
String usefulData = stringData.Trim();
int bProcessed =0;
int messLen = 0;
string[] tempArr = usefulData.Split('#');
try
{
messLen = Convert.ToInt32(tempArr[1]);
}
catch (Exception ex)
{
SMd.Debug("Incorect message len!!!!");
SMd.Debug(ex.ToString());
return;
}
if (messLen == 0) return;
if (recv != messLen)
{
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("message length({0}) != actual length({1})", messLen, recv);
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
Console.WriteLine("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
if (messLen < recv)//we have multiple messages in one pack
{
byte[] tempDAta = data;
int tempRecv = recv;
while ((bProcessed < recv) && (tempDAta.Length > 0))
{
String stringLen = System.Text.Encoding.ASCII.GetString(tempDAta, 1, 3);
try
{
int tempLen = Convert.ToInt32(stringLen.Replace("#", ""));
byte[] buff = new byte[tempLen];
Array.Copy(tempDAta, 0, buff, 0, tempLen);
Add2Queue(buff, tempLen,sourceIP);
tempRecv = tempRecv - tempLen;
if (tempRecv > 0)
{
byte[] buffNew = new byte[tempRecv];
Array.Copy(tempDAta, tempLen, buffNew, 0, tempRecv);
tempDAta = buffNew;
}
bProcessed += messLen;
}
catch (Exception ex)
{
SMd.Debug("Incorect message len!!!!");
SMd.Debug(ex.ToString());
return;
}
}
//process left over
}
else//incomplet message drop it
{
return;
}
}
else
{
Add2Queue(data, recv,sourceIP);
}
}
private void Add2Queue(byte[] data, int recv, string sourceIP)
{
AndroidMSG amsg = new AndroidMSG(data, recv,sourceIP);
if (amsg.OK)
{
//add message to queue
AndroMessageQueue.PostItem(amsg);
}
else
{
SMd.Debug("ERROR in PreParser.cs error:" + amsg.error);
}
}
}
}