/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.entity; import com.google.j2objc.annotations.Property; import java.io.IOException; import im.actor.runtime.bser.Bser; import im.actor.runtime.bser.BserCreator; import im.actor.runtime.bser.BserObject; import im.actor.runtime.bser.BserValues; import im.actor.runtime.bser.BserWriter; public class Peer extends BserObject { public static final BserCreator<Peer> CREATOR = new BserCreator<Peer>() { @Override public Peer createInstance() { return new Peer(); } }; public static Peer fromBytes(byte[] data) throws IOException { return Bser.parse(new Peer(), data); } public static Peer fromUniqueId(long uid) { int id = (int) (uid & 0xFFFFFFFFL); int type = (int) ((uid >> 32) & 0xFFFFFFFFL); switch (type) { default: case 0: return new Peer(PeerType.PRIVATE, id); case 1: return new Peer(PeerType.GROUP, id); } } public static Peer user(int uid) { return new Peer(PeerType.PRIVATE, uid); } public static Peer group(int gid) { return new Peer(PeerType.GROUP, gid); } @Property("readonly, nonatomic") private PeerType peerType; @Property("readonly, nonatomic") private int peerId; public Peer(PeerType peerType, int peerId) { this.peerType = peerType; this.peerId = peerId; } private Peer() { } public long getUnuqueId() { int type; switch (peerType) { default: case PRIVATE: type = 0; break; case GROUP: type = 1; break; } return ((long) peerId & 0xFFFFFFFFL) + (((long) type & 0xFFFFFFFFL) << 32); } public PeerType getPeerType() { return peerType; } public int getPeerId() { return peerId; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Peer peer = (Peer) o; if (peerId != peer.peerId) return false; if (peerType != peer.peerType) return false; return true; } @Override public int hashCode() { int result = peerType.hashCode(); result = 31 * result + peerId; return result; } @Override public void parse(BserValues values) throws IOException { peerId = values.getInt(1); switch (values.getInt(2)) { default: case 1: peerType = PeerType.PRIVATE; break; case 3: peerType = PeerType.GROUP; break; case 4: peerType = PeerType.PRIVATE_ENCRYPTED; break; } } @Override public void serialize(BserWriter writer) throws IOException { writer.writeInt(1, peerId); switch (peerType) { default: case PRIVATE: writer.writeInt(2, 1); break; case GROUP: writer.writeInt(2, 3); break; case PRIVATE_ENCRYPTED: writer.writeInt(2, 4); break; } } @Override public String toString() { return "{type:" + peerType + ", id:" + peerId + "}"; } public String toIdString() { return peerType + "_" + peerId; } }