} //only calculated for case of "CQ DX" message, true = different continent from this QTH public static new WsjtxMessage Parse(byte[] message) { if (!CheckMagicNumber(message)) { return(null); } var enqueueDecodeMessage = new EnqueueDecodeMessage(); int cur = MAGIC_NUMBER_LENGTH; enqueueDecodeMessage.SchemaVersion = DecodeQInt32(message, ref cur); var messageType = (MessageType)DecodeQInt32(message, ref cur); if (messageType != MessageType.ENQUEUE_DECODE_MESSAGE_TYPE) { return(null); } enqueueDecodeMessage.Id = DecodeString(message, ref cur); enqueueDecodeMessage.AutoGen = DecodeBool(message, ref cur); enqueueDecodeMessage.SinceMidnight = DecodeQTime(message, ref cur); enqueueDecodeMessage.RxDate = DateTime.UtcNow.Date; enqueueDecodeMessage.Snr = DecodeQInt32(message, ref cur); enqueueDecodeMessage.DeltaTime = DecodeDouble(message, ref cur); enqueueDecodeMessage.DeltaFrequency = DecodeQInt32(message, ref cur); enqueueDecodeMessage.Mode = DecodeString(message, ref cur); enqueueDecodeMessage.Message = DecodeString(message, ref cur); //this actually happens, because of AP (a priori) set //'W1AW K1HZ FN42 ? a2' //01234567890123456789012345678901234567890 // 1 2 3 4 int idx = enqueueDecodeMessage.Message.IndexOf(" "); if (idx != -1) { enqueueDecodeMessage.Message = enqueueDecodeMessage.Message.Substring(0, idx); } //hashed message case, brackets and only two words: // <K1JT> KG6EMU/AG enqueueDecodeMessage.Message = RemoveAngleBrackets(enqueueDecodeMessage.Message); enqueueDecodeMessage.UseStdReply = false; //used in ReplyToCq enqueueDecodeMessage.IsDx = DecodeBool(message, ref cur); enqueueDecodeMessage.Modifier = DecodeBool(message, ref cur); enqueueDecodeMessage.Priority = false; //set here temporarily //enqueueDecodeMessage.messageWords = enqueueDecodeMessage.Message.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); return(enqueueDecodeMessage); }
public static WsjtxMessage Parse(byte[] datagram) { if (!CheckMagicNumber(datagram)) { return(null); } int cur = MAGIC_NUMBER_LENGTH; int schemaVersion = DecodeQInt32(datagram, ref cur); var messageType = (MessageType)DecodeQInt32(datagram, ref cur); try { if (schemaVersion == 2 || schemaVersion == 3) { WsjtxMessage result; if (messageType == MessageType.HEARTBEAT_MESSAGE_TYPE) { result = HeartbeatMessage.Parse(datagram); } else if (messageType == MessageType.STATUS_MESSAGE_TYPE) { result = StatusMessage.Parse(datagram); } else if (messageType == MessageType.DECODE_MESSAGE_TYPE) { result = DecodeMessage.Parse(datagram); } else if (messageType == MessageType.ENQUEUE_DECODE_MESSAGE_TYPE) { result = EnqueueDecodeMessage.Parse(datagram); } else if (messageType == MessageType.CLEAR_MESSAGE_TYPE) { result = ClearMessage.Parse(datagram); } else if (messageType == MessageType.QSO_LOGGED_MESSAGE_TYPE) { result = QsoLoggedMessage.Parse(datagram); } else if (messageType == MessageType.CLOSE_MESSAGE_TYPE) { result = CloseMessage.Parse(datagram); } else if (messageType == MessageType.WSPR_DECODE_MESSAGE_TYPE) { result = WsprDecodeMessage.Parse(datagram); } else if (messageType == MessageType.LOGGED_ADIF_MESSAGE_TYPE) { result = LoggedAdifMessage.Parse(datagram); } else { result = new UnknownMessage(); } return(result); } } catch (Exception ex) { throw new ParseFailureException(messageType, datagram, ex); } throw new NotImplementedException($"Schema version {schemaVersion}, message type {messageType}"); }