private static void ParseSetMask(ExtMessageConfigCommandResponse result, byte[] data)
        {
            var status = data[6];

            result.IsError = status == 0;
            var start      = data[2] + (data[3] << 8);
            var end        = data[4] + (data[5] << 8);
            var maskLength = end - start + 1;

            if (data.Length < maskLength + 8)
            {
                throw new QcdmManagerException(Strings.QcdmInvalidResponseCommand);
            }

            var enabledMessages = new List <MessageId>();

            for (var i = 0; i < maskLength; ++i)
            {
                var ind = i * 4 + 8;
                if (ind < data.Length)
                {
                    var v = data[ind] + (data[ind + 1] << 8) + (data[ind + 2] << 16) + (data[ind + 3] << 24);
                    if (v != 0)
                    {
                        enabledMessages.Add((MessageId)(i + start));
                    }
                }
            }

            result.Messages = enabledMessages.ToArray();
        }
        public static ExtMessageConfigCommandResponse Parse(byte[] data)
        {
            var result = new ExtMessageConfigCommandResponse();

            result.CheckResponse(data);
            var command = (ExtMessageConfigOperation)data[1];

            switch (command)
            {
            case ExtMessageConfigOperation.Disable:
            case ExtMessageConfigOperation.RetrieveIdRanges:
                ParseMessages(result, data);
                break;

            case ExtMessageConfigOperation.RetrieveValidMask:
                ParseRetrieveValidMask(result, data);
                break;

            case ExtMessageConfigOperation.SetMask:
                ParseSetMask(result, data);
                break;
            }

            return(result);
        }
        public static ExtMessageConfigCommandResponse Parse(byte[] data)
        {
            var result = new ExtMessageConfigCommandResponse();

            result.CheckResponse(data);
            var command = data[1];
            var status  = data[6];

            result.IsError = status == 0;
            var start      = data[2] + (data[3] << 8);
            var end        = data[4] + (data[5] << 8);
            var maskLength = end - start + 1;

            if (data.Length < (maskLength + 8))
            {
                throw new QcdmManagerException(Strings.QcdmInvalidResponseCommand);
            }

            var enabledMessages = new List <MessageId>();

            for (var i = 0; i < maskLength; ++i)
            {
                var ind = i * 4 + 8;
                if (ind < data.Length)
                {
                    var v = data[ind] + (data[ind + 1] << 8) + (data[ind + 2] << 16) + (data[ind + 3] << 24);
                    if (v != 0)
                    {
                        enabledMessages.Add((MessageId)(i + start));
                    }
                }
            }
            result.EnabledMessages = enabledMessages.ToArray();
            return(result);
        }
        private static void ParseRetrieveValidMask(ExtMessageConfigCommandResponse result, byte[] data)
        {
            if (data.Length < 8)
            {
                throw new QcdmManagerException(Strings.QcdmInvalidResponseCommand);
            }

            var start = data[2] + (data[3] << 8);
            var end   = data[4] + (data[5] << 8);

            var count    = (data.Length - 8) / 4;
            var pos      = 8;
            var messages = new MessageIdState[count];

            for (var i = 0; i < count; ++i)
            {
                var messageId = (MessageId)(start + i);
                var message   = new MessageIdState(messageId, BitConverter.ToUInt16(data, pos),
                                                   BitConverter.ToUInt16(data, pos + 2));
                pos        += 4;
                messages[i] = message;
            }

            result.MessageStates = messages;
        }
        private static void ParseMessages(ExtMessageConfigCommandResponse result, byte[] data)
        {
            if (data.Length < 8)
            {
                throw new QcdmManagerException(Strings.QcdmInvalidResponseCommand);
            }

            var count    = (data.Length - 8) / 2;
            var pos      = 8;
            var messages = new MessageId[count];

            for (var i = 0; i < count; ++i)
            {
                messages[i] = (MessageId)BitConverter.ToUInt16(data, pos);
                pos        += 2;
            }
            result.Messages = messages;
        }