/** * 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; }