private static void GetRequestNormal(GXDLMSSettings settings, GXDLMSServer server, GXByteBuffer data, GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
ValueEventArgs e = null;
GXByteBuffer bb = new GXByteBuffer();
// Get type.
ErrorCode status = ErrorCode.Ok;
settings.Count = settings.Index = 0;
settings.ResetBlockIndex();
// CI
ObjectType ci = (ObjectType)data.GetUInt16();
byte[] ln = new byte[6];
data.Get(ln);
// Attribute Id
byte attributeIndex = data.GetUInt8();
// AccessSelection
byte selection = data.GetUInt8();
byte selector = 0;
object parameters = null;
GXDataInfo info = new GXDataInfo();
if (selection != 0)
{
selector = data.GetUInt8();
}
if (xml != null)
{
AppendAttributeDescriptor(xml, (int)ci, ln, attributeIndex);
if (selection != 0)
{
info.xml = xml;
xml.AppendStartTag(TranslatorTags.AccessSelection);
xml.AppendLine(TranslatorTags.AccessSelector, "Value", xml.IntegerToHex(selector, 2));
xml.AppendStartTag(TranslatorTags.AccessParameters);
GXCommon.GetData(settings, data, info);
xml.AppendEndTag(TranslatorTags.AccessParameters);
xml.AppendEndTag(TranslatorTags.AccessSelection);
}
return;
}
if (selection != 0)
{
parameters = GXCommon.GetData(settings, data, info);
}
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."
status = ErrorCode.UndefinedObject;
}
else
{
if (obj.GetAccess(attributeIndex) == AccessMode.NoAccess)
{
//Read Write denied.
status = ErrorCode.ReadWriteDenied;
}
else
{
e = new ValueEventArgs(settings, obj, attributeIndex, selector, parameters);
server.NotifyRead(new ValueEventArgs[] { e });
object value;
if (e.Handled)
{
value = e.Value;
}
else
{
value = (obj as IGXDLMSBase).GetValue(settings, e);
}
GXDLMS.AppendData(settings, obj, attributeIndex, bb, value);
status = e.Error;
}
}
GXDLMS.GetLNPdu(new GXDLMSLNParameters(settings, Command.GetResponse, 1, null, bb, (byte)status), replyData);
if (settings.Count != settings.Index || bb.Size != bb.Position)
{
server.transaction = new GXDLMSLongTransaction(new ValueEventArgs[] { e }, Command.GetRequest, bb);
}
}