private static void HanleSetRequestWithDataBlock(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXDLMSLNParameters p, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
GXDataInfo reply = new GXDataInfo();
p.multipleBlocks = data.GetUInt8() == 0;
UInt32 blockNumber = data.GetUInt32();
if (blockNumber != settings.BlockIndex)
{
Debug.WriteLine("HanleSetRequestWithDataBlock failed. Invalid block number. " + settings.BlockIndex + "/" + blockNumber);
p.status = (byte)ErrorCode.DataBlockNumberInvalid;
}
else
{
int size = GXCommon.GetObjectCount(data);
int realSize = data.Size - data.Position;
if (size != realSize)
{
Debug.WriteLine("HanleSetRequestWithDataBlock failed. Invalid block size.");
p.status = (byte)ErrorCode.DataBlockUnavailable;
}
server.transaction.data.Set(data);
//If all data is received.
if (!p.multipleBlocks)
{
try
{
object value = GXCommon.GetData(settings, server.transaction.data, reply);
if (value is byte[])
{
DataType dt = (server.transaction.targets[0].Target as IGXDLMSBase).GetDataType(server.transaction.targets[0].Index);
if (dt != DataType.None && dt != DataType.OctetString)
{
value = GXDLMSClient.ChangeType((byte[])value, dt, settings.UseUtc2NormalTime);
}
}
server.transaction.targets[0].Value = value;
server.NotifyWrite(server.transaction.targets);
if (!server.transaction.targets[0].Handled && !p.multipleBlocks)
{
(server.transaction.targets[0].Target as IGXDLMSBase).SetValue(settings, server.transaction.targets[0]);
server.NotifyPostWrite(server.transaction.targets);
}
}
catch (Exception)
{
p.status = (byte)ErrorCode.HardwareFault;
}
finally
{
server.transaction = null;
}
settings.ResetBlockIndex();
}
}
p.multipleBlocks = true;
}