Examples of TPropertyHandler


Examples of de.desy.tine.server.properties.TPropertyHandler

    if (stockPropertiesRegistered) return;
    final TEquipmentModule thisEqm = this;
    if (gEqmFactory == null) gEqmFactory = TEquipmentModuleFactory.getInstance();
    stockList = new TPropertyList();
    // TODO Separate handlers for overloaded properties
    stockList.addProperty(TStockProperties.SRVCOMMANDS, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        return getTEqmFactory().callWrAccessTableInfo(moduleName,devName, dout, din, devAccess);
      }
    });
   
    TPropertyHandler propertiesStructHandler = new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout != null)
        {
          switch (dout.dFormat)
          { // TODO: tidy this copy-and-past job up !
            case TFormat.CF_STRUCT:
              if (dout.getTag().compareTo("PRPQSr4") == 0 || (dout.getArrayLength() % TPropertyQuery.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;
                  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);
                    if ((lhr=getLocalHistoryRecord(prpq[i].prpName,"#0")) != null)
                    {
                      prpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
                      prpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
                    }
                    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);
                  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();
            else return TErrorList.invalid_keyword;
          }
        }
        return dout.putData(n);
      }
    });
    stockList.addProperty(TStockProperties.ADDIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return addRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.DELIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return removeRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.ACCESSLOCK, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc = 0;
        if (din != null && devAccess.isWrite())
        {
          short[] svals = new short[2];
          if ((cc=din.getData(svals)) != 0) return cc;
          TClient tc = getCaller();
          if ((cc=accessLock.setAccessLock(tc,svals[0],svals[1])) != 0) return cc;
          gEqmFactory.lockToExclusiveRead(tc);
        }
        if (dout != null)
        {
          String[] s = accessLock.getAccessLockAsString();
          NAME32[] n32 = new NAME32[3];
          n32[0] = new NAME32(s[0]);
          n32[1] = new NAME32(s[1]);
          n32[2] = new NAME32(s[2]);
          cc = dout.putData(n32);
        }
        return cc;
      }
    });
    stockList.addProperty(TStockProperties.SRVSELFTEST, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout.getFormat() != TFormat.CF_TEXT) return TErrorList.illegal_format;
        String fileName = gEqmFactory.getInitializer().getFecHome() + "/" + getLocalName() + "-selftest.csv";
View Full Code Here

Examples of de.desy.tine.server.properties.TPropertyHandler

    if (stockPropertiesRegistered) return;
    final TEquipmentModule thisEqm = this;
    if (gEqmFactory == null) gEqmFactory = TEquipmentModuleFactory.getInstance();
    stockList = new TPropertyList();
    // TODO Separate handlers for overloaded properties
    stockList.addProperty(TStockProperties.SRVCOMMANDS, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        return getTEqmFactory().callWrAccessTableInfo(moduleName,devName, dout, din, devAccess);
      }
    });
   
    TPropertyHandler propertiesStructHandler = new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout != null)
        {
          switch (dout.dFormat)
          { // TODO: tidy this copy-and-past job up !
            case TFormat.CF_STRUCT:
              if (dout.getTag().compareTo("PRPQSr4") == 0 || (dout.getArrayLength() % TPropertyQuery.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;
                  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);
                    if ((lhr=getLocalHistoryRecord(prpq[i].prpName,"#0")) != null)
                    {
                      prpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
                      prpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
                    }
                    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);
                  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();
            else return TErrorList.invalid_keyword;
          }
        }
        return dout.putData(n);
      }
    });
    stockList.addProperty(TStockProperties.ADDIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return addRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.DELIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return removeRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.ACCESSLOCK, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc = 0;
        if (din != null && devAccess.isWrite())
        {
          short[] svals = new short[2];
          if ((cc=din.getData(svals)) != 0) return cc;
          TClient tc = getCaller();
          if ((cc=accessLock.setAccessLock(tc,svals[0],svals[1])) != 0) return cc;
          gEqmFactory.lockToExclusiveRead(tc);
        }
        if (dout != null)
        {
          String[] s = accessLock.getAccessLockAsString();
          NAME32[] n32 = new NAME32[3];
          n32[0] = new NAME32(s[0]);
          n32[1] = new NAME32(s[1]);
          n32[2] = new NAME32(s[2]);
          cc = dout.putData(n32);
        }
        return cc;
      }
    });
    stockList.addProperty(TStockProperties.SRVSELFTEST, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout.getFormat() != TFormat.CF_TEXT) return TErrorList.illegal_format;
        String fileName = gEqmFactory.getInitializer().getFecHome() + "/" + getLocalName() + "-selftest.csv";
View Full Code Here

Examples of de.desy.tine.server.properties.TPropertyHandler

    if (stockPropertiesRegistered) return;
    final TEquipmentModule thisEqm = this;
    if (gEqmFactory == null) gEqmFactory = TEquipmentModuleFactory.getInstance();
    stockList = new TPropertyList();
    // TODO Separate handlers for overloaded properties
    stockList.addProperty(TStockProperties.SRVCOMMANDS, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        return getTEqmFactory().callWrAccessTableInfo(moduleName,devName, dout, din, devAccess);
      }
    });   
    TPropertyHandler propertiesStructHandler = new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout != null)
        {
          switch (dout.dFormat)
          { // TODO: tidy this copy-and-past job up !
            case TFormat.CF_STRUCT:
              if (dout.getTag().compareTo("PRPQSr4") == 0 || (dout.getArrayLength() % TPropertyQuery.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;
                  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);
                    if ((lhr=getLocalHistoryRecord(prpq[i].prpName,"#0")) != null)
                    {
                      prpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
                      prpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
                    }
                    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);
                  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 devMaskHandler = 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[] m = new int[deviceList.getNumberOfDevices()];
          for (int i=0; i<m.length; i++) m[i] = deviceList.getDevice(i).getMask();
          saveStockPropertyValues("DEVMASK",devName,new TDataType(m));
        }               
        int mask = tdv.getMask();
        return dout.putData(mask);
      }     
    };
    TPropertyHandler devRegionHandler = 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;
          String[] newrg = new String[1];
          switch (din.dFormat)
          {
            case TFormat.CF_INT32:
              int[] irg = new int[1];
              if ((cc=din.getData(irg)) != 0) return cc;
              newrg[0] = TRegion.getRegion(irg[0]);
              break;
            default:
              if ((cc=din.getData(newrg)) != 0) return cc;
              break;
             
          }
          tdv.setRegion(newrg[0]);         
          int[] rg = new int[deviceList.getNumberOfDevices()];
          for (int i=0; i<rg.length; i++) rg[i] = deviceList.getDevice(i).getRegionCode();
          saveStockPropertyValues("DEVREGION",devName,new TDataType(rg));
        }
        switch (dout.dFormat)
        {
          case TFormat.CF_INT32:
            return dout.putData(tdv.getRegionCode());
          default:
            return dout.putData(tdv.getRegion());
        }
      }
    };   
    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);
      }
    });
    TPropertyHandler alarmWatchStructHandler = new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        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 = true;
              for (int i=0; i<aws.length; i++)
              {
                if (aws[i].equals(awe[0]))
                {
                  aws[i].adjustFrom(awe[0]);
                  isNew = false;
                  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 == null || dout.dArrayLength == 0) return 0;
          if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
          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");
          }
          else
          {
            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[] loc = new String[deviceList.getNumberOfDevices()];
          for (int i=0; i<loc.length; i++) loc[i] = deviceList.getDevice(i).getLocation();
          saveStockPropertyValues("DEVLOCATION",devName,new TDataType(loc));
        }       
        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, devMaskHandler);
    stockList.addProperty(TStockProperties.SYS_MASK, devMaskHandler);
    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())
        {
          try
          {
            int cc = 0;
            float[] newZPos = new float[1];
            if ((cc=din.getData(newZPos)) != 0) return cc;
            tdv.setZposition(newZPos[0]);
            float[] zp = new float[deviceList.getNumberOfDevices()];
            for (int i=0; i<zp.length; i++) zp[i] = deviceList.getDevice(i).getZposition();
            saveStockPropertyValues("ZPOSITION",devName,new TDataType(zp));
          }
          catch (Exception x) { x.printStackTrace(); }
        }               
        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[] m = new boolean[deviceList.getNumberOfDevices()];
          for (int i=0; i<m.length; i++) m[i] = !deviceList.getDevice(i).isOffline();
          saveStockPropertyValues("DEVONLINE",devName,new TDataType(m));
        }               
        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;
        if (din != null && devAccess.isWrite())
        {
          int cc = 0;
          char[] newDesc = new char[64];
          if ((cc=din.getData(newDesc)) != 0) return cc;
          tdv.setDescription(new String(newDesc));         
          String[] dsc = new String[deviceList.getNumberOfDevices()];
          for (int i=0; i<dsc.length; i++) dsc[i] = deviceList.getDevice(i).getDescription();
          saveStockPropertyValues("DEVDESCRIPTION",devName,new TDataType(dsc));
        }       
        String dsc = tdv.getDescription();
        return dout.putData(dsc == null ? "" : dsc);
      }
    });   
    stockList.addProperty(TStockProperties.DEVREGION, devRegionHandler);   
    stockList.addProperty(TStockProperties.DEVREGION_N64, devRegionHandler);   
    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();
            else return TErrorList.invalid_keyword;
          }
        }
        return dout.putData(n);
      }
    });
    stockList.addProperty(TStockProperties.ADDIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return addRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.DELIPNET, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc;
        if (din != null && devAccess.isWrite())
        {
          NAME16[] ip = new NAME16[1];
          if ((cc=din.getData(ip)) != 0) return cc;
          return removeRegisteredNet(ip[0].getName());
        }
        return TErrorList.illegal_read_write;
      }
    });
    stockList.addProperty(TStockProperties.ACCESSLOCK, new TPropertyHandler()
    {
      public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        int cc = 0;
        if (din != null && devAccess.isWrite())
        {
          short[] svals = new short[2];
          if ((cc=din.getData(svals)) != 0) return cc;
          TClient tc = getCaller();
          if ((cc=accessLock.setAccessLock(tc,svals[0],svals[1])) != 0) return cc;
          gEqmFactory.lockToExclusiveRead(tc);
        }
        if (dout != null)
        {
          String[] s = accessLock.getAccessLockAsString();
          NAME32[] n32 = new NAME32[3];
          n32[0] = new NAME32(s[0]);
          n32[1] = new NAME32(s[1]);
          n32[2] = new NAME32(s[2]);
          cc = dout.putData(n32);
        }
        return cc;
      }
    });
    stockList.addProperty(TStockProperties.SRVSELFTEST, new TPropertyHandler()
    {
      protected int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
      {
        if (dout.getFormat() != TFormat.CF_TEXT) return TErrorList.illegal_format;
        String fileName = gEqmFactory.getInitializer().getFecHome() + "/" + getLocalName() + "-selftest.csv";
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.