/*
  * Set value of given attribute.
  */
 @Override
 public final void setValue(final GXDLMSSettings settings, final ValueEventArgs e) {
   if (e.getIndex() == 1) {
     super.setValue(settings, e);
   } else if (e.getIndex() == 2) {
     if (e.getValue() instanceof String) {
       phyReference = e.getValue().toString();
     } else {
       phyReference =
           GXDLMSClient.changeType((byte[]) e.getValue(), DataType.OCTET_STRING).toString();
     }
   } else if (e.getIndex() == 3) {
     java.util.ArrayList<GXDLMSPppSetupLcpOption> items =
         new java.util.ArrayList<GXDLMSPppSetupLcpOption>();
     if (e.getValue() instanceof Object[]) {
       for (Object item : (Object[]) e.getValue()) {
         GXDLMSPppSetupLcpOption it = new GXDLMSPppSetupLcpOption();
         it.setType(
             GXDLMSPppSetupLcpOptionType.forValue(((Number) ((Object[]) item)[0]).intValue()));
         it.setLength(((Number) ((Object[]) item)[1]).intValue());
         it.setData(((Object[]) item)[2]);
         items.add(it);
       }
     }
     lcpOptions = items.toArray(new GXDLMSPppSetupLcpOption[items.size()]);
   } else if (e.getIndex() == 4) {
     java.util.ArrayList<GXDLMSPppSetupIPCPOption> items =
         new java.util.ArrayList<GXDLMSPppSetupIPCPOption>();
     if (e.getValue() instanceof Object[]) {
       for (Object item : (Object[]) e.getValue()) {
         GXDLMSPppSetupIPCPOption it = new GXDLMSPppSetupIPCPOption();
         it.setType(
             GXDLMSPppSetupIPCPOptionType.forValue(((Number) ((Object[]) item)[0]).intValue()));
         it.setLength(((Number) ((Object[]) item)[1]).intValue());
         it.setData(((Object[]) item)[2]);
         items.add(it);
       }
     }
     ipcpOptions = items.toArray(new GXDLMSPppSetupIPCPOption[items.size()]);
   } else if (e.getIndex() == 5) {
     userName = (byte[]) ((Object[]) e.getValue())[0];
     password = (byte[]) ((Object[]) e.getValue())[1];
   } else {
     e.setError(ErrorCode.READ_WRITE_DENIED);
   }
 }
 /*
  * Set value of given attribute.
  */
 @Override
 public void setValue(int index, Object value) {
   if (index == 1) {
     super.setValue(index, value);
   } else if (index == 2) {
     PushObjectList.clear();
     if (value instanceof Object[]) {
       for (Object it : (Object[]) value) {
         Object[] tmp = (Object[]) it;
         GXDLMSPushObject obj = new GXDLMSPushObject();
         obj.setType(ObjectType.forValue(((Number) tmp[0]).intValue()));
         obj.setLogicalName(
             GXDLMSClient.changeType((byte[]) tmp[1], DataType.BITSTRING).toString());
         obj.setAttributeIndex(((Number) tmp[2]).intValue());
         obj.setDataIndex(((Number) tmp[3]).intValue());
         PushObjectList.add(obj);
       }
     }
   } else if (index == 3) {
     Object[] tmp = (Object[]) value;
     if (tmp != null) {
       SendDestinationAndMethod.setService(ServiceType.forValue(((Number) tmp[0]).intValue()));
       SendDestinationAndMethod.setDestination(new String((byte[]) tmp[1]));
       SendDestinationAndMethod.setMessage(MessageType.forValue(((Number) tmp[2]).intValue()));
     }
   } else if (index == 4) {
     CommunicationWindow.clear();
     if (value instanceof Object[]) {
       for (Object it : (Object[]) value) {
         Object[] tmp = (Object[]) it;
         GXDateTime start =
             (GXDateTime) GXDLMSClient.changeType((byte[]) tmp[0], DataType.DATETIME);
         GXDateTime end = (GXDateTime) GXDLMSClient.changeType((byte[]) tmp[1], DataType.DATETIME);
         CommunicationWindow.add(new SimpleEntry<GXDateTime, GXDateTime>(start, end));
       }
     }
   } else if (index == 5) {
     RandomisationStartInterval = ((Number) value).intValue();
   } else if (index == 6) {
     NumberOfRetries = ((Number) value).intValue();
   } else if (index == 7) {
     RepetitionDelay = ((Number) value).intValue();
   } else {
     throw new IllegalArgumentException("GetValue failed. Invalid attribute index.");
   }
 }