private static void HandleReadDataBlockAccess(
GXDLMSSettings settings, GXDLMSServer server,
Command command, GXByteBuffer data, int cnt, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
GXByteBuffer bb = new GXByteBuffer();
byte lastBlock = data.GetUInt8();
UInt16 blockNumber = data.GetUInt16();
if (xml != null)
{
if (command == Command.WriteResponse)
{
xml.AppendStartTag(TranslatorTags.WriteDataBlockAccess);
}
else
{
xml.AppendStartTag(TranslatorTags.ReadDataBlockAccess);
}
xml.AppendLine("<LastBlock Value=\"" + xml.IntegerToHex(lastBlock, 2) + "\" />");
xml.AppendLine("<BlockNumber Value=\"" + xml.IntegerToHex(blockNumber, 4) + "\" />");
if (command == Command.WriteResponse)
{
xml.AppendEndTag(TranslatorTags.WriteDataBlockAccess);
}
else
{
xml.AppendEndTag(TranslatorTags.ReadDataBlockAccess);
}
return;
}
if (blockNumber != settings.BlockIndex)
{
Debug.WriteLine("handleReadRequest failed. Invalid block number. " + settings.BlockIndex + "/" + blockNumber);
bb.SetUInt8(ErrorCode.DataBlockNumberInvalid);
GXDLMS.GetSNPdu(new GXDLMSSNParameters(settings, command, 1, (byte)SingleReadResponse.DataAccessError, bb, null), replyData);
settings.ResetBlockIndex();
return;
}
int count = 1;
byte type = (byte)DataType.OctetString;
if (command == Command.WriteResponse)
{
count = GXCommon.GetObjectCount(data);
type = data.GetUInt8();
}
int size = GXCommon.GetObjectCount(data);
int realSize = data.Size - data.Position;
if (count != 1 || type != (byte)DataType.OctetString || size != realSize)
{
Debug.WriteLine("handleGetRequest failed. Invalid block size.");
bb.SetUInt8(ErrorCode.DataBlockUnavailable);
GXDLMS.GetSNPdu(new GXDLMSSNParameters(settings, command, cnt, (byte)SingleReadResponse.DataAccessError, bb, null), replyData);
settings.ResetBlockIndex();
return;
}
if (server.transaction == null)
{
server.transaction = new GXDLMSLongTransaction(null, command, data);
}
else
{
server.transaction.data.Set(data);
}
if (lastBlock == 0)
{
bb.SetUInt16(blockNumber);
settings.IncreaseBlockIndex();
if (command == Command.ReadResponse)
{
type = (byte)SingleReadResponse.BlockNumber;
}
else
{
type = (byte)SingleWriteResponse.BlockNumber;
}
GXDLMS.GetSNPdu(new GXDLMSSNParameters(settings, command, cnt, type, null, bb), replyData);
return;
}
else
{
if (server.transaction != null)
{
data.Size = 0;
data.Set(server.transaction.data);
server.transaction = null;
}
if (command == Command.ReadResponse)
{
HandleReadRequest(settings, server, data, replyData, xml);
}
else
{
HandleWriteRequest(settings, server, data, replyData, xml);
}
settings.ResetBlockIndex();
}
}