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;
}
}
}
}