/**
   * Create a protocol buffer object from the binary data
   *
   * @param bs The binary representation of the protocol buffer
   * @return The parsed Element
   */
  public ClementineElement parse(byte[] bs) {
    Message msg = null;
    ClementineElement parsedElement = new InvalidData();

    try {
      msg = Message.parseFrom(bs);

      // First check the proto version
      if (msg.getVersion() < Message.getDefaultInstance().getVersion()) {
        parsedElement = new OldProtoVersion();
      } else {
        parsedElement = parseMsg(msg);
      }
    } catch (InvalidProtocolBufferException e) {
      msg = null;
      parsedElement = new InvalidData();
    }

    return parsedElement;
  }
  /**
   * Parse the message itself
   *
   * @param msg The created message
   * @return The parsed data
   */
  private ClementineElement parseMsg(Message msg) {
    ClementineElement parsedElement = null;

    if (msg.getType().equals(MsgType.INFO)) {
      parseInfos(msg.getResponseClementineInfo());
      parsedElement = new Connected();
    } else if (msg.getType().equals(MsgType.CURRENT_METAINFO)) {
      Song s = parseSong(msg.getResponseCurrentMetadata());
      App.mClementine.setCurrentSong(s);
      parsedElement = new Reload();
    } else if (msg.getType().equals(MsgType.UPDATE_TRACK_POSITION)) {
      parseUpdateTrackPosition(msg.getResponseUpdateTrackPosition());
      parsedElement = new Reload();
    } else if (msg.getType().equals(MsgType.KEEP_ALIVE)) {
      App.mClementineConnection.setLastKeepAlive(System.currentTimeMillis());
    } else if (msg.getType().equals(MsgType.SET_VOLUME)) {
      App.mClementine.setVolume(msg.getRequestSetVolume().getVolume());
    } else if (msg.getType().equals(MsgType.PLAY)) {
      App.mClementine.setState(Clementine.State.PLAY);
      parsedElement = new Reload();
    } else if (msg.getType().equals(MsgType.PAUSE)) {
      App.mClementine.setState(Clementine.State.PAUSE);
      parsedElement = new Reload();
    } else if (msg.getType().equals(MsgType.STOP)) {
      App.mClementine.setState(Clementine.State.STOP);
      parsedElement = new Reload();
    } else if (msg.getType().equals(MsgType.DISCONNECT)) {
      parsedElement = parseDisconnect(msg.getResponseDisconnect());
    }

    return parsedElement;
  }