private static void HandleRead(GXDLMSSettings settings, GXDLMSServer server, byte type, GXByteBuffer data,
List<ValueEventArgs> list, List<ValueEventArgs> reads, List<ValueEventArgs> actions,
GXByteBuffer replyData, GXDLMSTranslatorStructure xml)
{
int sn = data.GetInt16();
if (xml != null)
{
if (xml.OutputType == TranslatorOutputType.StandardXml)
{
xml.AppendStartTag(
TranslatorTags.VariableAccessSpecification);
}
else
{
sn &= 0xFFFF;
}
if (type == (byte)VariableAccessSpecification.ParameterisedAccess)
{
xml.AppendStartTag(Command.ReadRequest,
VariableAccessSpecification.ParameterisedAccess);
xml.AppendLine(
(int)Command.ReadRequest << 8
| (int)VariableAccessSpecification.VariableName,
"Value", xml.IntegerToHex(sn, 4));
xml.AppendLine(TranslatorTags.Selector, "Value",
xml.IntegerToHex(data.GetUInt8(), 2));
GXDataInfo di = new GXDataInfo();
di.xml = xml;
xml.AppendStartTag(TranslatorTags.Parameter);
GXCommon.GetData(settings, data, di);
xml.AppendEndTag(TranslatorTags.Parameter);
xml.AppendEndTag(Command.ReadRequest,
VariableAccessSpecification.ParameterisedAccess);
}
else
{
xml.AppendLine(
(int)Command.ReadRequest << 8
| (int)VariableAccessSpecification.VariableName,
"Value", xml.IntegerToHex(sn, 4));
}
if (xml.OutputType == TranslatorOutputType.StandardXml)
{
xml.AppendEndTag(TranslatorTags.VariableAccessSpecification);
}
return;
}
GXSNInfo info = FindSNObject(server, sn & 0xFFFF);
ValueEventArgs e = new ValueEventArgs(settings, info.Item, info.Index, 0, null);
e.action = info.IsAction;
if (type == (byte)VariableAccessSpecification.ParameterisedAccess)
{
e.Selector = data.GetUInt8();
GXDataInfo di = new GXDataInfo();
e.Parameters = GXCommon.GetData(settings, data, di);
}
//Return error if connection is not established.
if (!settings.Connected && (!e.action || e.Target.ShortName != 0xFA00 || e.Index != 8))
{
replyData.Add(GXDLMSServer.GenerateConfirmedServiceError(ConfirmedServiceError.InitiateError,
ServiceError.Service, (byte)Service.Unsupported));
return;
}
list.Add(e);
if (!e.action && info.Item.GetAccess(info.Index) == AccessMode.NoAccess)
{
e.Error = ErrorCode.ReadWriteDenied;
}
else if (e.action && info.Item.GetMethodAccess(info.Index) == MethodAccessMode.NoAccess)
{
e.Error = ErrorCode.ReadWriteDenied;
}
else
{
if (e.action)
{
actions.Add(e);
}
else
{
reads.Add(e);
}
}
}