/// <summary>
/// Handle read request.
/// </summary>
/// <param name="settings">DLMS settings.</param>
/// <param name="server">DLMS server.</param>
/// <param name="data">Received data.</param>
public static void HandleReadRequest(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
GXByteBuffer bb = new GXByteBuffer();
int cnt = 0xFF;
byte type = 0;
List <ValueEventArgs> list = new List <ValueEventArgs>();
List <ValueEventArgs> reads = new List <ValueEventArgs>();
List <ValueEventArgs> actions = new List <ValueEventArgs>();
//If get next frame.
if (xml == null && data.Size == 0)
{
if (server.transaction != null)
{
return;
}
bb.Set(replyData);
replyData.Clear();
foreach (ValueEventArgs it in server.transaction.targets)
{
list.Add(it);
}
}
else
{
cnt = GXCommon.GetObjectCount(data);
if (xml != null)
{
xml.AppendStartTag(Command.ReadRequest, "Qty", xml.IntegerToHex(cnt, 2));
}
for (int pos = 0; pos != cnt; ++pos)
{
type = data.GetUInt8();
if (type == (byte)VariableAccessSpecification.VariableName ||
type == (byte)VariableAccessSpecification.ParameterisedAccess)
{
HandleRead(settings, server, type, data, list, reads, actions, replyData, xml);
}
else if (type == (byte)VariableAccessSpecification.BlockNumberAccess)
{
HandleReadBlockNumberAccess(settings, server, data, replyData, xml);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
else if (type == (byte)VariableAccessSpecification.ReadDataBlockAccess)
{
HandleReadDataBlockAccess(settings, server, Command.ReadResponse, data, cnt, replyData, xml);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
else
{
ReturnSNError(settings, server, Command.ReadResponse, ErrorCode.ReadWriteDenied, replyData);
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
}
return;
}
}
if (reads.Count != 0)
{
server.NotifyRead(reads.ToArray());
}
if (actions.Count != 0)
{
server.NotifyAction(actions.ToArray());
}
}
if (xml != null)
{
xml.AppendEndTag(Command.ReadRequest);
return;
}
byte requestType = (byte)GetReadData(settings, list.ToArray(), bb);
if (reads.Count != 0)
{
server.NotifyPostRead(reads.ToArray());
}
if (actions.Count != 0)
{
server.NotifyPostAction(actions.ToArray());
}
GXDLMSSNParameters p = new GXDLMSSNParameters(settings, Command.ReadResponse, list.Count, requestType, null, bb);
GXDLMS.GetSNPdu(p, replyData);
if (server.transaction == null && (bb.Size != bb.Position || settings.Count != settings.Index))
{
reads = new List <ValueEventArgs>();
foreach (var it in list)
{
reads.Add(it);
}
server.transaction = new GXDLMSLongTransaction(reads.ToArray(), Command.ReadRequest, bb);
}
else if (server.transaction != null)
{
replyData.Set(bb);
return;
}
}