/// <summary>
/// Handle get request with list command.
/// </summary>
/// <param name="data">Received data.</param>
private static void GetRequestWithList(GXDLMSSettings settings, byte invokeID, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
ValueEventArgs e;
GXByteBuffer bb = new GXByteBuffer();
int pos;
int cnt = GXCommon.GetObjectCount(data);
GXCommon.SetObjectCount(cnt, bb);
List <ValueEventArgs> list = new List <ValueEventArgs>();
if (xml != null)
{
xml.AppendStartTag(TranslatorTags.AttributeDescriptorList, "Qty", xml.IntegerToHex(cnt, 2));
}
try
{
for (pos = 0; pos != cnt; ++pos)
{
ObjectType ci = (ObjectType)data.GetUInt16();
byte[] ln = new byte[6];
data.Get(ln);
short attributeIndex = data.GetUInt8();
// AccessSelection
int selection = data.GetUInt8();
int selector = 0;
object parameters = null;
if (selection != 0)
{
selector = data.GetUInt8();
GXDataInfo info = new GXDataInfo();
parameters = GXCommon.GetData(settings, data, info);
}
if (xml != null)
{
xml.AppendStartTag(TranslatorTags.AttributeDescriptorWithSelection);
xml.AppendStartTag(TranslatorTags.AttributeDescriptor);
xml.AppendComment(ci.ToString());
xml.AppendLine(TranslatorTags.ClassId, "Value", xml.IntegerToHex((int)ci, 4));
xml.AppendComment(GXCommon.ToLogicalName(ln));
xml.AppendLine(TranslatorTags.InstanceId, "Value", GXCommon.ToHex(ln, false));
xml.AppendLine(TranslatorTags.AttributeId, "Value", xml.IntegerToHex(attributeIndex, 2));
xml.AppendEndTag(TranslatorTags.AttributeDescriptor);
xml.AppendEndTag(TranslatorTags.AttributeDescriptorWithSelection);
}
else
{
GXDLMSObject obj = settings.Objects.FindByLN(ci, GXCommon.ToLogicalName(ln));
if (obj == null)
{
obj = server.NotifyFindObject(ci, 0, GXCommon.ToLogicalName(ln));
}
if (obj == null)
{
// "Access Error : Device reports a undefined object."
e = new ValueEventArgs(server, obj, attributeIndex, 0, 0);
e.Error = ErrorCode.UndefinedObject;
list.Add(e);
}
else
{
ValueEventArgs arg = new ValueEventArgs(server, obj, attributeIndex, selector, parameters);
arg.InvokeId = invokeID;
if (server.NotifyGetAttributeAccess(arg) == AccessMode.NoAccess)
{
//Read Write denied.
arg.Error = ErrorCode.ReadWriteDenied;
list.Add(arg);
}
else
{
list.Add(arg);
}
}
}
}
}
catch (Exception ex)
{
if (xml == null)
{
throw ex;
}
}
if (xml != null)
{
xml.AppendEndTag(TranslatorTags.AttributeDescriptorList);
return;
}
server.NotifyRead(list.ToArray());
object value;
pos = 0;
foreach (ValueEventArgs it in list)
{
try
{
if (it.Handled)
{
value = it.Value;
}
else
{
value = (it.Target as IGXDLMSBase).GetValue(settings, it);
}
bb.SetUInt8(it.Error);
if (it.ByteArray)
{
bb.Set((byte[])value);
}
else
{
GXDLMS.AppendData(settings, it.Target, it.Index, bb, value);
}
invokeID = (byte)it.InvokeId;
}
catch (Exception)
{
bb.SetUInt8((byte)ErrorCode.HardwareFault);
}
if (settings.Index != settings.Count)
{
server.transaction = new GXDLMSLongTransaction(list.ToArray(), Command.GetRequest, null);
}
++pos;
}
server.NotifyPostRead(list.ToArray());
GXDLMSLNParameters p = new GXDLMSLNParameters(null, settings, invokeID, Command.GetResponse, 3, null, bb, 0xFF);
GXDLMS.GetLNPdu(p, replyData);
}