private void storeAndUpdate(byte[] data, SimppParser parser, UpdateType updateType) {
    if (LOG.isTraceEnabled())
      LOG.trace("Retrieved new data from: " + updateType + ", storing & updating");
    if (parser.getVersion() == IGNORE_ID && updateType == UpdateType.FROM_NETWORK)
      throw new IllegalStateException("shouldn't be here!");

    if (updateType == UpdateType.FROM_NETWORK && httpRequestControl.isRequestPending()) return;

    _lastId = parser.getVersion();
    _lastBytes = data;

    if (updateType != UpdateType.FROM_DISK) {
      FileUtils.verySafeSave(CommonUtils.getUserSettingsDir(), FILENAME, data);
    }

    for (SimppSettingsManager ssm : simppSettingsManagers)
      ssm.updateSimppSettings(parser.getPropsData());
    for (SimppListener listener : listeners) listener.simppUpdated(_lastId);
  }
  private void handleDataInternal(byte[] data, UpdateType updateType, ReplyHandler handler) {
    if (data == null) {
      if (updateType == UpdateType.FROM_NETWORK && handler != null)
        networkUpdateSanityChecker.get().handleInvalidResponse(handler, RequestType.SIMPP);
      LOG.warn("No data to handle.");
      return;
    }

    SimppDataVerifier verifier = new SimppDataVerifier(data);
    if (!verifier.verifySource()) {
      if (updateType == UpdateType.FROM_NETWORK && handler != null)
        networkUpdateSanityChecker.get().handleInvalidResponse(handler, RequestType.SIMPP);
      LOG.warn("Couldn't verify signature on data.");
      return;
    }

    if (updateType == UpdateType.FROM_NETWORK && handler != null)
      networkUpdateSanityChecker.get().handleValidResponse(handler, RequestType.SIMPP);

    SimppParser parser = null;
    try {
      parser = new SimppParser(verifier.getVerifiedData());
    } catch (IOException iox) {
      LOG.error("IOX parsing simpp data", iox);
      return;
    }

    if (LOG.isDebugEnabled()) {
      LOG.debug(
          "Got data with version: "
              + parser.getVersion()
              + " from: "
              + updateType
              + ", current version is: "
              + _lastId);
    }

    switch (updateType) {
      case FROM_NETWORK:
        if (parser.getVersion() == IGNORE_ID) {
          if (_lastId != IGNORE_ID) doHttpMaxFailover();
        } else if (parser.getVersion() > _lastId) {
          storeAndUpdate(data, parser, updateType);
        }
        break;
      case FROM_DISK:
        if (parser.getVersion() > _lastId) {
          storeAndUpdate(data, parser, updateType);
        }
        break;
      case FROM_HTTP:
        if (parser.getVersion() >= _lastId) {
          storeAndUpdate(data, parser, updateType);
        }
        break;
    }
  }