private static void GetRequestWithList(GXDLMSSettings settings, 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.AppendLine(TranslatorTags.ClassId, "Value", xml.IntegerToHex((int)ci, 4));
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, GXDLMSObject.ToLogicalName(ln));
if (obj == null)
{
obj = server.NotifyFindObject(ci, 0, GXDLMSObject.ToLogicalName(ln));
}
if (obj == null)
{
// "Access Error : Device reports a undefined object."
e = new ValueEventArgs(settings, obj, attributeIndex, 0, 0);
e.Error = ErrorCode.UndefinedObject;
list.Add(e);
}
else
{
if (obj.GetAccess(attributeIndex) == AccessMode.NoAccess)
{
//Read Write denied.
ValueEventArgs arg = new ValueEventArgs(settings, obj, attributeIndex, 0, null);
arg.Error = ErrorCode.ReadWriteDenied;
list.Add(arg);
}
else
{
ValueEventArgs arg = new ValueEventArgs(settings, obj, attributeIndex, selector, parameters);
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);
GXDLMS.AppendData(settings, it.Target, it.Index, bb, value);
}
catch (Exception)
{
bb.SetUInt8((byte)ErrorCode.HardwareFault);
}
if (settings.Index != settings.Count)
{
server.transaction = new GXDLMSLongTransaction(list.ToArray(), Command.GetRequest, null);
}
++pos;
}
GXDLMSLNParameters p = new GXDLMSLNParameters(settings, Command.GetResponse, 3, null, bb, 0xFF);
GXDLMS.GetLNPdu(p, replyData);
}