String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
TPropertyQuery[] prpq = new TPropertyQuery[slst.length];
if (slst.length == 0) break;
byte[] tba = new byte[slst.length * TPropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
prp = propertyList.getFirstProperty(slst[i]);
prpq[i] = new TPropertyQuery(prp,1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
}
else if (dout.getTag().compareTo("XPQS") == 0 || (dout.getArrayLength() % XPropertyQuery.sizeInBytes) == 0)
{
if (din != null)
{ // looking for a specific property ...
LinkedList<TExportProperty> propInstances;
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getEqualProperties(propertyName);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
THistoryRecord lhr = null;
XPropertyQuery[] xpq = new XPropertyQuery[propInstances.size()];
byte[] tba = new byte[xpq.length * XPropertyQuery.sizeInBytes];
Iterator<TExportProperty> it = propInstances.iterator();
for (int i = 0; (it.hasNext()) && (i < xpq.length); i++)
{
xpq[i] = new XPropertyQuery((TExportProperty) it.next(), propInstances.size() - 1);
if ((lhr=getLocalHistoryRecord(xpq[i].prpName,"#0")) != null)
{
xpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
xpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
}
System.arraycopy(xpq[i].toByteArray(), 0, tba, i * XPropertyQuery.sizeInBytes,
XPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "XPQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
XPropertyQuery[] xpq = new XPropertyQuery[slst.length];
if (slst.length == 0) break;
byte[] tba = new byte[slst.length * XPropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
prp = propertyList.getFirstProperty(slst[i]);
xpq[i] = new XPropertyQuery(prp,1);
System.arraycopy(xpq[i].toByteArray(), 0, tba, i * XPropertyQuery.sizeInBytes,
XPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "XPQS");
}
}
else if (dout.getTag().compareTo("PQS") == 0 || (dout.getArrayLength() % PropertyQuery.sizeInBytes) == 0)
{ // legacy request ...
if (din != null)
{ // looking for a specific property ...
LinkedList<TExportProperty> propInstances;
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getEqualProperties(propertyName);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
PropertyQuery[] pqs = new PropertyQuery[1];
TExportProperty prp = propertyList.getFirstProperty(propertyName);
byte[] tba = new byte[PropertyQuery.sizeInBytes];
pqs[0] = new PropertyQuery();
pqs[0].name = propertyName;
pqs[0].prpDesc = prp.getDescription().getText();
pqs[0].prpAccess = (byte)prp.getAccessMode();
pqs[0].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[0].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[0].toByteArray(), 0, tba, 0, PropertyQuery.sizeInBytes);
return dout.putData(tba, "PQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
PropertyQuery[] pqs = new PropertyQuery[slst.length];
byte[] tba = new byte[slst.length * PropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
pqs[i] = new PropertyQuery();
pqs[i].name = slst[i];
prp = propertyList.getFirstProperty(slst[i]);
pqs[i].prpDesc = prp.getDescription().getText();
pqs[i].prpAccess = (byte)prp.getAccessMode();
pqs[i].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[i].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[i].toByteArray(), 0, tba, i * PropertyQuery.sizeInBytes,
PropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PQS");
}
}
}
}
/**/
return TErrorList.illegal_format;
}
};
TPropertyHandler metapropertiesStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (dout != null)
{
int filter = getMetaPrpsCallFilter(din);
switch (dout.dFormat)
{ // TODO: tidy this copy-and-past job up !
case TFormat.CF_STRUCT:
LinkedList<TExportProperty> propInstances;
if (dout.getTag().compareTo("PRPQSr4") == 0 || (dout.getArrayLength() % TPropertyQuery.sizeInBytes) == 0)
{
if (din != null && filter != 0x7fffffff)
{ // looking for a specific property ...
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getFilledMetaProperties(propertyName,filter);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
TPropertyQuery[] prpq = new TPropertyQuery[propInstances.size()];
byte[] tba = new byte[prpq.length * TPropertyQuery.sizeInBytes];
Iterator<TExportProperty> it = propInstances.iterator();
for (int i = 0; (it.hasNext()) && (i < prpq.length); i++)
{
prpq[i] = new TPropertyQuery((TExportProperty) it.next(), propInstances.size() - 1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
propInstances = new LinkedList<TExportProperty>();
LinkedList<TExportProperty> theseInstances;
for (int i=0; i<slst.length; i++)
{
theseInstances = propertyList.getFilledMetaProperties(slst[i],filter);
if (theseInstances.size() > 0) propInstances.addAll(theseInstances);
}
int size = propInstances.size();
TExportProperty prp;
TPropertyQuery[] prpq = new TPropertyQuery[size];
byte[] tba = new byte[size * TPropertyQuery.sizeInBytes];
for (int i=0; i<size; i++)
{
prp = propInstances.get(i);
prpq[i] = new TPropertyQuery(prp,1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
}
else if (dout.getTag().compareTo("PQS") == 0 || (dout.getArrayLength() % PropertyQuery.sizeInBytes) == 0)
{ // legacy request ...
if (din != null && filter != 0x7fffffff)
{ // looking for a specific property ...
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getFilledMetaProperties(propertyName,filter);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
PropertyQuery[] pqs = new PropertyQuery[1];
TExportProperty prp = propertyList.getFirstProperty(propertyName);
byte[] tba = new byte[PropertyQuery.sizeInBytes];
pqs[0] = new PropertyQuery();
pqs[0].name = propertyName;
pqs[0].prpDesc = prp.getDescription().getText();
pqs[0].prpAccess = (byte)prp.getAccessMode();
pqs[0].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[0].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[0].toByteArray(), 0, tba, 0, PropertyQuery.sizeInBytes);
return dout.putData(tba, "PQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
propInstances = new LinkedList<TExportProperty>();
LinkedList<TExportProperty> theseInstances;
for (int i=0; i<slst.length; i++)
{
theseInstances = propertyList.getFilledMetaProperties(slst[i],filter);
if (theseInstances.size() > 0) propInstances.addAll(theseInstances);
}
int size = propInstances.size();
PropertyQuery[] pqs = new PropertyQuery[size];
byte[] tba = new byte[size * PropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<size; i++)
{
prp = propInstances.get(i);
pqs[i] = new PropertyQuery();
pqs[i].name = prp.getName();
pqs[i].prpDesc = prp.getDescription().getText();
pqs[i].prpAccess = (byte)prp.getAccessMode();
pqs[i].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[i].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[i].toByteArray(), 0, tba, i * PropertyQuery.sizeInBytes,
PropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PQS");
}
}
}
}
/**/
return TErrorList.illegal_format;
}
};
TPropertyHandler alarmsStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (dout == null) return TErrorList.dimension_error;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
int[] amrb = new int[4];
if (din != null)
{
switch (din.dFormat)
{
case TFormat.CF_STRUCT:
if (din.dArrayLength != 16) return TErrorList.illegal_format;
byte[] bdata = din.getDataBuffer();
byte[] ival = new byte[4];
for (int i=0; i<3; i++)
{
System.arraycopy(bdata,i*4,ival,0,4);
amrb[i] = Swap.Long(ival);
}
break;
case TFormat.CF_LONG:
din.getData(amrb);
break;
default:
return TErrorList.illegal_format;
}
}
else
{
amrb[0] = 0; // start time
amrb[1] = (int)(System.currentTimeMillis()/1000); // stop time
amrb[2] = 0; // minimum severity
amrb[3] = 0; // as yet unused ...
}
boolean collapse = false;
int dstart, dstop;
int astart = amrb[0];
int astop = amrb[1];
int asev = amrb[2];
if (devName == null || devName.length() == 0 || devName.startsWith("#") || devName.contains("*"))
{ // currently any of these is a signal that the caller want's ALL alarms
int nalms = deviceList.getNumberOfAlarms();
if (nalms > TAlarm.getAlmCollapseWindow()) collapse = true;
dstart = 0; dstop = deviceList.getNumberOfDevices();
}
else
{
dstart = deviceList.getDeviceNumber(devName);
dstop = dstart + 1;
}
TAlarm[] alms = null;
TAlarmMessage[] ams = null;
int buflength = 0;
//byte[] tba = null;
int code = TErrorList.max_alarms_exceeded, na = 0;
if (collapse)
{ // collapse to a single message
na = buflength = 1;
ams = new TAlarmMessage[buflength];
String atag = "more than "+TAlarm.getAlmCollapseWindow()+" total alarms";
short[] tna = new short[32];
int itna = 1;
tna[0] = (short)deviceList.getNumberOfAlarms();
TDevice[] tdevs = deviceList.getDeviceList();
TAlarm[] as;
int n = 0;
for (TDevice td : tdevs)
{ // scan thru the device list
if ((as=td.getAlarmList()) == null ||
as.length == 0 || as[0] == null) continue;
for (int i=0; i<as.length; i++)
if (isCasInClientList()) as[i].allowRemoval();
if (code == TErrorList.max_alarms_exceeded) code = as[0].getCode();
if (itna < 32 && code != tna[itna]) tna[itna] = (short)code;
if (code != as[0].getCode()) break;
n++;
}
if (n > TAlarm.getAlmCollapseWindow())
{ // at least this many with the same code
code = TAlarm.isDiskSpaceAlarm(code) ? (code & 0xff) : TAlarm.getBaseCode(code);
TAlarmDefinition ad = getAlarmDefinition(code);
atag = ""+n+" alarms: "+ ad != null ? ad.getAlarmTag() : "<no defined alarm tag>";
}
TDataType dt = new TDataType(tna);
ams[0] = new TAlarmMessage(thisEqm.getExportName(),thisEqm.getExportName(),atag,code,
deviceList.getHighestAlarmSeverity(null,0),almDynSet,dt);
//tba = new byte[buflength * TAlarmMessage.sizeInBytes];
}
else
{
int ts = 0;
buflength = deviceList.getNumberOfAlarms();
ams = new TAlarmMessage[buflength];
//tba = new byte[buflength * TAlarmMessage.sizeInBytes];
TDevice[] dlst = deviceList.getDeviceList();
String dnam = null, atag = null;
for (int i=dstart; i<dstop; i++)
{
alms = dlst[i].getAlarmList();
if ((alms == null) || (alms.length == 0)) continue;
for (int n=0; n<alms.length && na<buflength; n++)
{
if ((ts=alms[n].getTimeStamp()) < astart || ts > astop) continue;
if (alms[n].getSeverity() < asev) continue;
dnam = dlst[i].getName();
code = alms[n].getCode();
atag = null;
if (TAlarm.isLinkErrorAlarm(code))
{
dnam = thisEqm.getExportName();
int lid = TAlarm.decodeLinkErrorAlarm(code);
TLink lnk = TLinkFactory.getInstance().getLinkFromTable(lid);
if (lnk != null) atag = "link error: "+lnk.getDeviceServer();
}
// TODO: if (TAlarm.isDiskSpaceAlarm(code)) dnam = getDiskName();
ams[na] = new TAlarmMessage(thisEqm,dnam,atag,alms[n]);
if (TAlarm.isHiddenAlarm(alms[n].getCode()))
{ // flagged as hidden
ams[na].setAlarmSystem(TAlarm.hideAlarmSystem(ams[na].getAlarmSystem()));
}
//System.arraycopy(ams[na].toByteArray(), 0, tba, (na)*TAlarmMessage.sizeInBytes, TAlarmMessage.sizeInBytes);
// CAS is configured and has now read the alarm => can remove it !
if (casReadRequired && isCasInClientList()) alms[n].allowRemoval();
na++;
}
}
}
byte[] tba = new byte[buflength * TAlarmMessage.sizeInBytes];
if (dout.getTag().compareTo("AMSr4") == 0)
{ // modern
for (int i=0; i<buflength && i<na; i++)
{
System.arraycopy(ams[i].toByteArray(), 0, tba, i*TAlarmMessage.sizeInBytes, TAlarmMessage.sizeInBytes);
}
if (na < dout.getArrayLength()) dout.setArrayLength(na);
return dout.putData(tba, "AMSr4");
}
else
{ // is legacy support necessary ?
}
return TErrorList.invalid_structure_tag;
}
};
TPropertyHandler alarmDefsStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TAlarmDefinition[] adef = (TAlarmDefinition[])alarmDefinitionList.values().toArray(new TAlarmDefinition[0]);
int almdefsize = alarmDefinitionList.size();
if (devAccess.isWrite())
{
if (din == null) return TErrorList.dimension_error;
if (din.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("ADSr4") != 0) return TErrorList.invalid_structure_tag;
TAlarmDefinition[] inpt = new TAlarmDefinition[1];
inpt[0] = new TAlarmDefinition();
din.getData(inpt);
boolean found = false;
for (int i=0; i<almdefsize; i++)
{
if (adef[i].getAlarmCode() == inpt[0].getAlarmCode())
{ // got it
adef[i].setFields(inpt[0]);
found = true;
break;
}
}
if (!found) return TErrorList.un_allocated;
if (dout == null || dout.getArrayLength() == 0) return 0;
}
if (dout == null) return TErrorList.dimension_error;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
int adssize = TStructRegistry.getSizeInBytes("ADSr4");
byte[] tba = new byte[almdefsize * adssize];
if (dout.getTag().compareTo("ADSr4") == 0)
{ // modern
for (int i=0; i<almdefsize; i++)
{
System.arraycopy(adef[i].toByteArray(), 0, tba, i*adssize, adssize);
}
if (almdefsize < dout.getArrayLength()) dout.setArrayLength(almdefsize);
return dout.putData(tba, "ADSr4");
}
else
{ // is legacy support necessary ?
}
return TErrorList.invalid_structure_tag;
}
};
TPropertyHandler alarmWatchStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (dout == null) return TErrorList.dimension_error;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
synchronized (gAlarmWatchList)
{
int almwtblsize = gAlarmWatchList.size();
int awssize = TStructRegistry.getSizeInBytes("AWSr4");
byte[] tba = new byte[almwtblsize * awssize];
TAlarmWatchEntry[] aws = (TAlarmWatchEntry[])gAlarmWatchList.toArray(new TAlarmWatchEntry[0]);
if (devAccess.isWrite())
{
if (din.getFormat() != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("AWSr4") == 0)
{
TAlarmWatchEntry[] awe = new TAlarmWatchEntry[1];
awe[0] = new TAlarmWatchEntry();
din.getData(awe);
awe[0].setEquipmentModule(getLocalName());
boolean isNew = false;
for (int i=0; i<aws.length; i++)
{
if (aws[i].equals(awe[0]))
{
aws[i].adjustFrom(awe[0]);
isNew = true;
break;
}
}
if (isNew)
{ // wasn't in list
TExportProperty p = propertyList.getFirstProperty(awe[0].getPrp());
if (p == null) return TErrorList.illegal_property;
if (awe[0].getSiz() <= 0 || awe[0].getSiz() > p.getOutputSize())
{
awe[0].setSiz(p.getOutputSize());
}
awe[0].setFmt(p.getOutputFormat());
gAlarmWatchList.add(awe[0]);
}
}
else
{
return TErrorList.invalid_structure_tag;
}
}
if (dout.getTag().compareTo("AWSr4") == 0)
{ // modern
for (int i=0; i<almwtblsize; i++)
{
System.arraycopy(aws[i].toByteArray(), 0, tba, i*awssize, awssize);
}
if (almwtblsize < dout.getArrayLength()) dout.setArrayLength(almwtblsize);
return dout.putData(tba, "AWSr4");
}
}
return TErrorList.invalid_structure_tag;
}
};
stockList.addProperty(TStockProperties.NALARMS, new TPropertyHandler()
{
int nalmdefs = alarmDefinitionList.size();
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int devnr = -1;
if (!devName.contains("*") && !devName.startsWith("#"))
{
devnr = deviceList.getDeviceNumber(devName);
}
if (casName != null && !hasCasAttached) isCasInClientList();
int[] nalms = new int[6];
if (devnr < 0)
{ // all of them
nalms[0] = deviceList.getNumberOfAlarms();
nalms[1] = deviceList.getMostRecentAlarmTimestamp(nalms,3);
nalms[2] = deviceList.getHighestAlarmSeverity(nalms,4);
nalms[5] = nalmdefs;
if (nalms[0] > TAlarm.getAlmCollapseWindow())
{
nalms[1] = almDynSet.timestamp;
nalms[4] = nalms[3] = nalms[0] = 1;
}
}
else
{ // just the device given ...
int mrts = 0, ts, hsv = 0, sv, nts = 0, nsv = 0;
TDevice[] dlst = deviceList.getDeviceList();
if (devnr >= dlst.length) return TErrorList.device_not_connected;
TAlarm[] alms = dlst[devnr].getAlarmList();
nalms[0] = alms.length;
for (int i=0; i<alms.length; i++)
{
if ((ts=alms[i].getTimeStamp()) > mrts)
{
mrts = ts;
nts = 0;
}
if (ts == mrts) nts++;
if ((sv=alms[i].getSeverity()) > hsv)
{
hsv = sv;
nsv = 0;
}
if (sv == hsv) nsv++;
}
nalms[1] = mrts;
nalms[2] = hsv;
nalms[3] = nts;
nalms[4] = nsv;
nalms[5] = nalmdefs;
}
if (dout.dArrayLength > 5) nalms[5] = getAlarmDefinitionList().size();
return dout.putData(nalms);
}
});
stockList.addProperty(TStockProperties.NALARMDEFS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)alarmDefinitionList.size());
}
});
stockList.addProperty(TStockProperties.NALMWATCH, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)gAlarmWatchList.size());
}
});
stockList.addProperty(TStockProperties.ALARMS, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMSEXT, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMSEXT_STRUCTIN, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMDEFS, alarmDefsStructHandler);
stockList.addProperty(TStockProperties.ALMWATCHTBL, alarmWatchStructHandler);
stockList.addProperty(TStockProperties.NHISTORIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)gLclHstList.size());
}
});
stockList.addProperty(TStockProperties.HISTORIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return hstCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.HISTORIES_STRUCT, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return hstCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.ADDHISTORY, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (devAccess.isWrite())
{
if (din.getFormat() != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("HRSr4") == 0)
{
THistoryRecordStruct[] hrs = new THistoryRecordStruct[1];
hrs[0] = new THistoryRecordStruct();
din.getData(hrs);
String prp = hrs[0].getProperty();
String dev = hrs[0].getDevice();
THistoryRecord hr = getLocalHistoryRecord(prp,dev);
if (hr == null)
{ // wasn't in list
TExportProperty p = getPropertyList().getFirstProperty(prp);
TPropertyDescription pd = p.getDescription();
int at = pd != null ? pd.getArrayType() : TArrayType.AT_UNKNOWN;
int idx = TEquipmentModuleFactory.getInstance().getNextHistoryRecordIndex();
THistorySpecification hspec = new THistorySpecification(hrs[0].getPollingRate(), hrs[0].getArchiveRate(), hrs[0].getDepthShort(), hrs[0].getDepthLong(), hrs[0].getHeartbeat(), hrs[0].getPercentTolerance(), hrs[0].getAbsoluteTolerance(), null);
addLocalHistoryRecord(idx, dev, prp, hrs[0].getSize(), hrs[0].getFormat(),at,hspec);
dumpHistoryManifest();
}
else
{ // just an edit ...
THistorySpecification hsp = hr.getHspec();
hsp.setAbsoluteTolerance(hrs[0].getAbsoluteTolerance());
hsp.setPercentTolerance(hrs[0].getPercentTolerance());
hsp.setArchiveRate(hrs[0].getArchiveRate());
hsp.setPollngRate(hrs[0].getPollingRate());
hsp.setDepthLong(hrs[0].getDepthLong());
hsp.setDepthShort(hrs[0].getDepthShort());
hsp.setHeartbeat(hrs[0].getHeartbeat());
}
return 0;
}
else
{
return TErrorList.invalid_structure_tag;
}
}
return TErrorList.illegal_read_write;
}
});
stockList.addProperty(TStockProperties.ADDHISTORY_STR, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (devAccess.isWrite())
{
short fmt = din.getFormat();
if (!TFormat.isName(fmt) && fmt != TFormat.CF_CHAR) return TErrorList.illegal_format;
NAME64[] tgt = new NAME64[1];
int cc = din.getData(tgt);
if (cc != 0) return cc;
String prp = tgt[0].getName();
TExportProperty p = getPropertyList().getFirstProperty(prp);
if (p == null) return TErrorList.invalid_property;
int hfmt = p.getOutputFormat();
int hsiz = p.getOutputSize();
int idx = gEqmFactory.getNextHistoryRecordIndex(getLocalName(),prp,devName,hfmt,hsiz);
addLocalHistoryRecord(idx, devName, prp, hsiz, hfmt);
dumpHistoryManifest();
return 0;
}
return TErrorList.illegal_read_write;
}
});
//TODO: finish these ...
stockList.addProperty(TStockProperties.METAPROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return metaprpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.METAPROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return metaprpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.METAPROPERTIES_STRUCT, metapropertiesStructHandler);
stockList.addProperty(TStockProperties.METAPROPS_STRUCT, metapropertiesStructHandler);
stockList.addProperty(TStockProperties.DEVLOCATION, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
char[] newLocation = new char[64];
if ((cc=din.getData(newLocation)) != 0) return cc;
tdv.setLocation(new String(newLocation));
}
String dloc = tdv.getLocation();
if (dloc == null) dloc = gEqmFactory.getFecLocation();
if (dloc != null && dloc.startsWith("<"))
{ /* redirection character */
String rdrstr = null, envstr;
dloc = dloc.substring(1); dloc.trim();
if (dloc.startsWith("$"))
{
int idx = dloc.indexOf('/');
if (idx < 0) idx = dloc.length();
envstr = dloc.substring(1, idx);
rdrstr = System.getenv(envstr);
if (rdrstr == null) MsgLog.log("TEquipmentModule:DEVLOCATION", "environment variable "+envstr+" not set",TErrorList.not_defined,null,0);
dloc = dloc.substring(idx);
}
if (rdrstr == null) rdrstr = "";
rdrstr += dloc;
if (rdrstr.indexOf('[') < 0) rdrstr += "[Location]";
return gEqmFactory.setRedirectionString(rdrstr);
}
return dout.putData(dloc == null ? "" : dloc);
}
});
stockList.addProperty(TStockProperties.DEVMASK, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
int[] newMask = new int[1];
if ((cc=din.getData(newMask)) != 0) return cc;
tdv.setMask(newMask[0]);
}
int mask = tdv.getMask();
return dout.putData(mask);
}
});
stockList.addProperty(TStockProperties.ZPOSITION, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
float[] newZPos = new float[1];
if ((cc=din.getData(newZPos)) != 0) return cc;
tdv.setZposition(newZPos[0]);
}
float p = tdv.getZposition();
return dout.putData(p);
}
});
stockList.addProperty(TStockProperties.DEVONLINE, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
int[] newFlg = new int[1];
if ((cc=din.getData(newFlg)) != 0) return cc;
tdv.setOffline(newFlg[0] == 0 ? true : false);
}
boolean p = !tdv.isOffline();
return dout.putData(p);
}
});
stockList.addProperty(TStockProperties.PROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPERTIES_USTRING, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPERTIES_STRUCT, propertiesStructHandler);
stockList.addProperty(TStockProperties.PROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPS_USTRING, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPS_STRUCT, propertiesStructHandler);
stockList.addProperty(TStockProperties.NPROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData(propertyList.countUniqueProperties());
}
});
// Same as NPROPERTIES
stockList.addProperty(TStockProperties.NPROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData(propertyList.countUniqueProperties());
}
});
stockList.addProperty(TStockProperties.NDEVICES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
//return dout.putData(deviceList.size());
return dout.putData(deviceList.getNumberOfDevices());
}
});
stockList.addProperty(TStockProperties.DEVICES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
String[] namlst;
if (devName.compareTo("*") != 0 && devName.indexOf("*") != -1)
{ // query for a subset of device names ...
WildcardMatch wc = new WildcardMatch(devName);
TDevice dev;
LinkedList<String> nl = new LinkedList<String>();
String dn;
int n = 0, mask = 0;
if (din != null && din.dArrayLength == 1 && din.dFormat == TFormat.CF_INT32)
{
int[] msk = new int[1];
din.getData(msk);
mask = msk[0];
}
for (int i=0; i<deviceList.getNumberOfDevices(); i++)
{
if ((dev=deviceList.getDevice(i)) == null) continue;
if (dev.isOffline()) continue;
if (mask > 0 && !dev.isMaskSet(mask)) continue;
dn = dev.getName();
if (!wc.matches(dn)) continue;
nl.add(dn);
n++;
}
namlst = nl.toArray(new String[n]);
}
else
{
namlst = deviceList.getDeviceNameList();
}
int cc = dout.putData(StringToName.stringArrayToName64(namlst));
if (cc == 0)
{
if (dout.getArrayLength() > namlst.length) dout.setArrayLength(namlst.length);
if (getDeviceList().isPropertyOriented())
cc = TErrorList.has_query_function | TErrorList.CE_SENDDATA;
}
return cc;
}
});
stockList.addProperty(TStockProperties.DEVDESCRIPTION, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
String dsc = tdv.getDescription();
return dout.putData(dsc == null ? "" : dsc);
}
});
stockList.addProperty(TStockProperties.SRVSUBSYSTEM, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
String subs = getSubsystem();
return dout.putData(subs == null ? "" : subs);
}
});
stockList.addProperty(TStockProperties.SRVIDLE, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int cc = 0;
int[] idleState = new int[1];
if (din != null && devAccess.isWrite())
{
if ((cc=din.getData(idleState)) != 0) return cc;
isIdle = idleState[0] == 0 ? false : true;
}
if (dout != null && dout.dArrayLength > 0)
{
idleState[0] = isIdle ? -1 : 0;
cc = dout.putData(idleState);
}
return cc;
}
});
stockList.addProperty(TStockProperties.SRVINIT, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int cc = 0;
if (!devAccess.isWrite()) return TErrorList.illegal_read_write;
{
if (eqpIni == null) return TErrorList.not_implemented;
cc = eqpIni.initialize();
}
return cc;
}
});
stockList.addProperty(TStockProperties.SRVADDR, new TPropertyHandler()
{
protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
NAME32[] n32 = new NAME32[dout.dArrayLength];
String eqm, exp;
TEquipmentModule eq;
int cc = 0;
if (gEqmFactory.isServiceRequest(moduleName))
{
NAME32[] tgt = new NAME32[3];
if ((cc=din.getData(tgt)) != 0) return cc;
String ctxName = tgt[0].getName();
//String eqmName = tgt[1].getName();
String expName = tgt[2].getName();
if ((eq=gEqmFactory.getEquipmentModuleFromExportName(expName)) == null)
return TErrorList.invalid_data;
if (eq.context.compareToIgnoreCase(ctxName) != 0) return TErrorList.invalid_data;
eqm = eq.moduleName;
exp = eq.exportName;
}
else
{
eqm = moduleName;
exp = exportName;
}
cc = gEqmFactory.getSrvAddress(n32,eqm,exp);
return (short) dout.putData(n32);
}
});
stockList.addProperty(TStockProperties.USERS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
NAME16[] n16 = getRegisteredUsers();
if (din != null && din.dArrayLength > 0)
{
if (!TFormat.isString(din.dFormat)) return TErrorList.illegal_format;
char[] data = new char[TStrings.PROPERTY_NAME_SIZE];
int cc = din.getData(data);
if (cc != 0) return cc;
String str = new String(data).trim();
TExportProperty txp = getPropertyList().getFirstProperty(str);
if (txp != null)
{ // property name given as input
n16 = txp.getRegisteredUsers();
}
else
{ // maybe a device name then ...
TDevice dev = getDeviceList().getDevice(str);
if (dev != null) n16 = dev.getRegisteredUsers();
else return TErrorList.invalid_keyword;
}
}
if (n16 == null)
{
n16 = new NAME16[1];
n16[0] = new NAME16("");
}
dout.dArrayLength = n16 == null ? 0 : n16.length;
return n16 == null ? 0 : dout.putData(n16);
}
});
stockList.addProperty(TStockProperties.NUSERS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
short n = (short)gRegisteredUsersList.size();
if (din != null && din.dArrayLength > 0)
{
if (!TFormat.isString(din.dFormat)) return TErrorList.illegal_format;
char[] data = new char[TStrings.PROPERTY_NAME_SIZE];
int cc = din.getData(data);
if (cc != 0) return cc;
String str = new String(data).trim();
TExportProperty txp = getPropertyList().getFirstProperty(str);
if (txp != null)
{ // property name given as input
n = (short)txp.getNumberRegisteredUsers();
}
else
{ // maybe a device name then ...
TDevice dev = getDeviceList().getDevice(str);
if (dev != null) n = (short)dev.getNumberRegisteredUsers();
else return TErrorList.invalid_keyword;
}
}
return dout.putData(n);
}
});
stockList.addProperty(TStockProperties.ADDUSER, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int cc;
if (din != null && devAccess.isWrite())
{
NAME16[] usr = new NAME16[1];
if ((cc=din.getData(usr)) != 0) return cc;
return addRegisteredUser(usr[0].getName());
}
return TErrorList.illegal_read_write;
}
});
stockList.addProperty(TStockProperties.DELUSER, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int cc;
if (din != null && devAccess.isWrite())
{
NAME16[] usr = new NAME16[1];
if ((cc=din.getData(usr)) != 0) return cc;
return removeRegisteredUser(usr[0].getName());
}
return TErrorList.illegal_read_write;
}
});
stockList.addProperty(TStockProperties.IPNETS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
NAME16[] n16 = getRegisteredNets();
if (din != null && din.dArrayLength > 0)
{
if (!TFormat.isString(din.dFormat)) return TErrorList.illegal_format;
char[] data = new char[TStrings.PROPERTY_NAME_SIZE];
int cc = din.getData(data);
if (cc != 0) return cc;
String str = new String(data).trim();
TExportProperty txp = getPropertyList().getFirstProperty(str);
if (txp != null)
{ // property name given as input
n16 = txp.getRegisteredNets();
}
else
{ // maybe a device name then ...
TDevice dev = getDeviceList().getDevice(str);
if (dev != null) n16 = dev.getRegisteredNets();
else return TErrorList.invalid_keyword;
}
}
dout.dArrayLength = n16 == null ? 0 : n16.length;
return n16 == null ? 0 : dout.putData(n16);
}
});
stockList.addProperty(TStockProperties.NIPNETS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
short n = (short)gRegisteredNetsList.size();
if (din != null && din.dArrayLength > 0)
{
if (!TFormat.isString(din.dFormat)) return TErrorList.illegal_format;
char[] data = new char[TStrings.PROPERTY_NAME_SIZE];
int cc = din.getData(data);
if (cc != 0) return cc;
String str = new String(data).trim();
TExportProperty txp = getPropertyList().getFirstProperty(str);
if (txp != null)
{ // property name given as input
n = (short)txp.getNumberRegisteredUsers();
}
else
{ // maybe a device name then ...
TDevice dev = getDeviceList().getDevice(str);
if (dev != null) n = (short)dev.getNumberRegisteredNets();