Gurux.DLMS.GXDLMSLNCommandHandler.GetRequestNextDataBlock C# (CSharp) Méthode

GetRequestNextDataBlock() private static méthode

Handle get request next data block command.
private static GetRequestNextDataBlock ( GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml ) : void
settings GXDLMSSettings
server GXDLMSServer
data GXByteBuffer Received data.
replyData GXByteBuffer
xml GXDLMSTranslatorStructure
Résultat void
        private static void GetRequestNextDataBlock(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
        {
            GXByteBuffer bb = new GXByteBuffer();
            UInt32 index;
            // Get block index.
            index = data.GetUInt32();
            if (xml != null)
            {
                xml.AppendLine(TranslatorTags.BlockNumber, null, xml.IntegerToHex(index, 8));
                return;
            }
            if (index != settings.BlockIndex)
            {
                Debug.WriteLine("handleGetRequest failed. Invalid block number. " + settings.BlockIndex + "/" + index);
                GXDLMS.GetLNPdu(new GXDLMSLNParameters(settings, Command.GetResponse, 2, null, bb, (byte)ErrorCode.DataBlockNumberInvalid), replyData);
            }
            else
            {
                settings.IncreaseBlockIndex();
                GXDLMSLNParameters p = new GXDLMSLNParameters(settings, Command.GetResponse, 2, null, bb, (byte)ErrorCode.Ok);
                //If transaction is not in progress.
                if (server.transaction == null)
                {
                    p.status = (byte)ErrorCode.NoLongGetOrReadInProgress;
                }
                else
                {
                    bb.Set(server.transaction.data);
                    bool moreData = settings.Index != settings.Count;
                    if (moreData)
                    {
                        //If there is multiple blocks on the buffer.
                        //This might happen when Max PDU size is very small.
                        if (bb.Size < settings.MaxPduSize)
                        {
                            foreach (ValueEventArgs arg in server.transaction.targets)
                            {
                                object value;
                                if (arg.Handled)
                                {
                                    server.NotifyRead(new ValueEventArgs[] { arg });
                                    value = arg.Value;
                                }
                                else
                                {
                                    value = (arg.Target as IGXDLMSBase).GetValue(settings, arg);
                                }
                                //Add data.
                                GXDLMS.AppendData(settings, arg.Target, arg.Index, bb, value);
                            }
                            moreData = settings.Index != settings.Count;
                        }
                    }
                    p.multipleBlocks = true;
                    GXDLMS.GetLNPdu(p, replyData);
                    if (moreData || bb.Size - bb.Position != 0)
                    {
                        server.transaction.data = bb;
                    }
                    else
                    {
                        server.transaction = null;
                    }
                }
            }
        }