private void ManagePushNotificationMessage(List <string> splitedData, ref byte[] buffer) { //Logger.WriteLine("~~~PushNotifiation - BUFFER BEFORE -> " + Encoding.UTF8.GetString(buffer)); var indexOfPushNotif = ByteArrayHelper.IndexOfSequence(buffer, bytesPushNotification); var dataBeforeNotif = buffer.Take(indexOfPushNotif).ToArray(); var dataAfterNotifWithData = buffer.Skip(indexOfPushNotif + bytesPushNotification.Length).ToArray(); // If PushNotification Contains EOCR if (ByteArrayHelper.IndexOfSequence(buffer, bytesEocr) >= 0) { var eocrIndex = ByteArrayHelper.IndexOfSequence(buffer, bytesEocr); var notifDataBytes = dataAfterNotifWithData.Take(eocrIndex).ToArray(); var notifData = Encoding.UTF8.GetString(notifDataBytes).Split(':').ToList(); if (string.IsNullOrEmpty(notifData[0])) { notifData.Skip(1); } var dataAfterNotif = dataAfterNotifWithData.Skip(eocrIndex + 5).ToArray(); buffer = dataBeforeNotif.Concat(dataAfterNotif).ToArray(); // This will exclude buffer=":" (PushNotifs that start with ":") case. if (buffer.Length == 1 && buffer[0] == byteColon) { buffer = new byte[0]; } if (buffer.Length > 2 && buffer[indexOfPushNotif - 1] == byteColon && buffer[indexOfPushNotif - 2] == byteColon) { buffer = buffer.Take(buffer.Length - 1).ToArray(); } if (buffer.Length > 0) { splitedData = Encoding.UTF8.GetString(buffer).Split(':').ToList(); } else { CommandResponseBuffer.Complete(); CommandResponseBuffer = new BufferBlock <byte[]>(); splitedData = new List <string>(); } //Logger.WriteLine("~~~PushNotifiation - BUFFER AFTER -> " + Encoding.UTF8.GetString(buffer)); Task.Factory.StartNew(AppendNewCustomFileHash(notifData[0], notifData[1], notifData[2])); } else { //read from network till EOCR occurs and then get transmited data !! Logger.WriteLine("Excepție: PushNotification - mesajul a fost pus in chunk-uri diferite. Caz netratat"); } }
private void ManageEocrMessage(List <string> splitedData, byte[] buffer) { var bytesBeforeEocr = ByteArrayHelper.IndexOfSequence(buffer, bytesEocr); // is there a message like: ::EOCR: ??? if ((bytesBeforeEocr == 1 && splitedData[0].Equals("") && buffer.Count() == 6) || (splitedData[0].Equals("EOCR") && buffer.Count() == 5)) { //IF message is :EOCR: OR EOCR: CommandResponseBuffer.Complete(); CommandResponseBuffer = new BufferBlock <byte[]>(); } else { var dataBeforeEocr = buffer.Take(bytesBeforeEocr).ToArray(); // Send data before EOCR if there is some if (dataBeforeEocr.Length > 0 && dataBeforeEocr[dataBeforeEocr.Length - 1].Equals(byteColon)) { // Cuts the ":" before EOCR and sends data. dataBeforeEocr = dataBeforeEocr.Take(dataBeforeEocr.Length - 1).ToArray(); CommandResponseBuffer.Post(dataBeforeEocr); } // Wait till the buffer is empty to complete the message !!! while (CommandResponseBuffer.Count > 0) { Thread.Sleep(10); } CommandResponseBuffer.Complete(); CommandResponseBuffer = new BufferBlock <byte[]>(); // Send remained data if there is some var bytesToEocr = bytesBeforeEocr + 5; if (bytesToEocr < buffer.Count()) { //Logger.WriteLine("~~~AsyncReading(EOCR - RemainedData) : " + Encoding.UTF8.GetString(buffer)); var dataAfterEocr = buffer.Skip(bytesToEocr).ToArray(); CommandResponseBuffer.Post(dataAfterEocr); } // This is not necessary: else if (bytesToEocr == buffer.Count()) !!! I THINK !!! } }
private Action AsyncReading() { return(() => { while (true) { try { //Reading all the available data on the network stream var buffer = new byte[Helper.BufferSize]; var readBytes = _networkStream.Read(buffer, 0, Helper.BufferSize); buffer = buffer.Take(readBytes).ToArray(); var readData = Encoding.UTF8.GetString(buffer, 0, readBytes); var cachedData = readData; var splitedData = readData.Split(':').ToList(); //File.AppendAllText(@"C:\Users\rares\Desktop\TcpCommunicationUTF8.txt", "RESPONSE: " + readData + "\n"); var pushNotificationMessage = splitedData.Any(s => s.Equals("PUSHNOTIFICATION")); if (pushNotificationMessage) { // If it contains only the Push then the buffer should be EMPTY after // 2 cases: "PUSHNOTIFICATION:data4:data5:data6:EOCR:" // ":PUSHNOTIFICATION:data4:data5:data6:EOCR:" // resulting an empty buffer. ManagePushNotificationMessage(splitedData, ref buffer); } var eocrMessage = splitedData.Any(s => s.Equals("EOCR")); if (eocrMessage) { ManageEocrMessage(splitedData, buffer); } else { // DATA message if (buffer.Length > 0) { //if (buffer.Length == 1 && buffer[0].Equals(byteEmpty)) //{ // Logger.WriteLine("~~~AsyncReading: buffer.Length == 1 && emptyByte. WHY ?!\n" + // "~~~\tCachedData: " + cachedData); //} //else //{ CommandResponseBuffer.Post(buffer); //} } else { //Logger.WriteLine("~~~AsyncReading: buffer.Length = 0. WHY ?!\n~~~\tCachedData: " + cachedData); } } } catch (ObjectDisposedException) { // Thread is async and it tries to use a disposed object. return; } catch (IOException) { // Network stream throws this exception becouse it tries to access a broken network stream. return; } catch (Exception ex) { var str = "Source: " + ex.Source + "\nMessage: " + ex.Message + "\nStackTrace: " + ex.StackTrace; MessageBox.Show(str, @"Citire asincronă - Excepție - " + ex.GetType().Name, MessageBoxButton.OK, MessageBoxImage.Error); } } }); }