}                                       //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);
        }
示例#2
0
        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}");
        }