internal bool SaveMessageToWinlink() { // Saves the image in the mime property into the "To Winlink" table... EncodeMime(); if (!string.IsNullOrEmpty(Mime)) { var messageStore = new MessageStore(DatabaseFactory.Get()); messageStore.SaveToWinlinkMessage(MessageId, UTF8Encoding.UTF8.GetBytes(Mime)); messageStore.AddMessageIdSeen(MessageId); LocalDelivery(); return(true); } ErrorDescription = "Failure to encode mime format"; return(false); }
private void B2MessageInbound(byte[] bytInbound) // Flag to indicate still processing, used to handle re entrancy { Globals.Proposal objProp; // Code modified from RMSLLite Packet Server: // Processes and inbound compressed binary message stream... if (blnInProcess) // this handles re entrancy { queInboundData.Enqueue(bytInbound); return; } else { bytInProcess = bytInbound; queInboundData.Clear(); } blnInProcess = true; var intResult = default(int); int intPosition; Reprocess: // Strip the header on the first block of a new parial recovery int intHdr2Sumcheck = objPartialSession.StripHeaderFromPartial(ref bytInProcess); if (intHdr2Sumcheck != 0) { objMessageInbound.intB2Checksum = intHdr2Sumcheck; } intPosition = 0; Globals.UpdateProgressBar(bytInbound.Length); foreach (byte byt in bytInProcess) { intPosition += 1; intResult = objMessageInbound.BinaryInput(byt); objPartialSession.AccumulateByte(byt); if (intResult == 2) { // All OK - Block boundary ...update partial upon block boundary (every 250 bytes) objPartialSession.WritePartialToFile(); } else if (intResult == 1) { objPartialSession.PurgeCurrentPartial(); // no longer needed as message now complete if (objMessageInbound.Decompress(true) == false) { _log.Error("B2Protocol [423] Unable to decompress Inbound Message "); // objInitialProtocol._objModem.Break() ' Break for Pactor, has no affect on other channels TODO: verify placement Send("[423] Protocol Error - Unable to decompress received binary compressed message..."); Disconnect(); blnInProcess = false; queInboundData.Clear(); return; } if (objMessageInbound.DecodeB2Message() == false) { _log.Error("B2Protocol [424] Unable to decode received binary compressed message..."); // objInitialProtocol._objModem.Break() ' Break for Pactor, has no affect on other channels TODO: verify placement Send("[424] Protocol Error - Unable to decode received binary compressed message..."); Disconnect(); blnInProcess = false; queInboundData.Clear(); return; } intInboundProposalIndex += 1; intInboundMessageCount -= 1; // If the message has been successfully received and saved then // record the message ID as having been seen and processed... if (objMessageInbound.SaveToDatabase(objMessageInbound.MessageId)) { var messageStoreDatabase = new MessageStore(DatabaseFactory.Get()); messageStoreDatabase.AddMessageIdSeen(objMessageInbound.MessageId); } // Save statistics... intCompressedMessageBytesReceived += objMessageInbound.Progress; intUncompressedMessageBytesReceived += objMessageInbound.Size(); // Show message complete... Globals.queChannelDisplay.Enqueue("G*** " + objMessageInbound.MessageId + " - " + objMessageInbound.Size().ToString() + "/" + objMessageInbound.Progress.ToString() + " bytes received"); if (intInboundMessageCount == 0) { objMessageInbound = null; StateChange(EB2States.SendingB2Proposal); B2OutboundProposal(); blnInProcess = false; // Added Rev 2.0.22.0 to fix second inbound session queInboundData.Clear(); return; } else { objMessageInbound = new Message(); break; } } else if (intResult < 0) { objPartialSession.PurgeCurrentPartial(); // If error delete current partial to avoid potential loop. _log.Error("[B2MessageInbound] Protocol Error Problem receiving B2 message...nResult: " + intResult.ToString()); // objInitialProtocol._objModem.Break() ' Break for Pactor, has no affect on other channels TODO: verify placement Send("[425/" + intResult.ToString() + "] Protocol Error - Problem receiving B2 message..."); Disconnect(); blnInProcess = false; queInboundData.Clear(); return; } } if (intResult == 0 | intResult == 2) { if (queInboundData.Count == 0) { blnInProcess = false; return; } else { try { bytInProcess = (byte[])queInboundData.Dequeue(); } catch { blnInProcess = false; return; } while (queInboundData.Count > 0) { try { Globals.AppendBuffer(ref bytInProcess, (byte[])queInboundData.Dequeue()); } catch { return; } } goto Reprocess; } } // There may be all or part of the next message in the bytInProcess() array... else if (intPosition < bytInProcess.Length) { var binMore = new byte[(bytInProcess.Length - intPosition)]; for (int intCount = 0, loopTo = binMore.Length - 1; intCount <= loopTo; intCount++) { binMore[intCount] = bytInProcess[intPosition]; intPosition += 1; } objProp = cllInboundMessageIDs[intInboundProposalIndex]; string strMID = objProp.msgID; // Dim strTemp() As String = CStr(cllAcceptedInboundMids(intInboundProposalIndex)).Split(Chr(32)) var bytReceived = objPartialSession.RetrievePartial(strMID); if (true) // If bytReceived.Length = 0 Then ' TODO: This temporarily bypasses partial file recovery { objPartialSession.StartNewPartial(strMID); bytInProcess = binMore; while (queInboundData.Count > 0) { try { Globals.AppendBuffer(ref bytInProcess, (byte[])queInboundData.Dequeue()); } catch { break; } } goto Reprocess; } else // Here is where partial recovery is and there is still a latent bug here TODO: { bytInProcess = bytReceived; objPartialSession.StartNewPartial(strMID); // Set this so the first header info is stripped from the first received Block... objPartialSession.blnFirstRcvdBlk = true; // ' Set this so the extra 8 byte header is also stripped (may not be in first block!) objPartialSession.blnRemoveHdr8 = true; objPartialSession.StripHeaderFromPartial(ref binMore); // TODO: not sure what to do with sumcheck? objPartialSession.blnFirstRcvdBlk = false; objPartialSession.blnRemoveHdr8 = false; Globals.AppendBuffer(ref bytInProcess, binMore); while (queInboundData.Count > 0) { try { Globals.AppendBuffer(ref bytInProcess, (byte[])queInboundData.Dequeue()); } catch { break; } } objPartialSession.StartNewPartial(strMID); goto Reprocess; } } blnInProcess = false; } // B2MessageInbound