package pl.radical.open.gg.utils; import pl.radical.open.gg.IStatus; import pl.radical.open.gg.MessageClass; import pl.radical.open.gg.RemoteStatus; import pl.radical.open.gg.User; import pl.radical.open.gg.packet.dicts.GGMessageClass; import pl.radical.open.gg.packet.dicts.GGStatuses; import pl.radical.open.gg.packet.dicts.GGUser; import pl.radical.open.gg.packet.dicts.MessageStatus; import pl.radical.open.gg.packet.dicts.StatusType; import pl.radical.open.gg.packet.in.GGSendMsgAck; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created on 2005-01-31 * * @author <a href="mailto:mati@sz.home.pl">Mateusz Szczap</a> */ public final class GGConversion { private static final Logger LOG = LoggerFactory.getLogger(GGConversion.class); private GGConversion() { } public static User.UserMode getUserMode(final int protocolStatus) { if ((protocolStatus & GGStatuses.GG_STATUS_FRIENDS_MASK) == GGStatuses.GG_STATUS_FRIENDS_MASK) { return User.UserMode.FRIEND; } if ((protocolStatus & GGStatuses.GG_STATUS_BLOCKED) == GGStatuses.GG_STATUS_BLOCKED) { return User.UserMode.BLOCKED; } LOG.warn("Unable to convert from protocolUserMode, falling back to unknown."); return User.UserMode.UNKNOWN; } public static byte getProtocolUserMode(final User.UserMode userMode) { if (userMode == User.UserMode.BUDDY) { return GGUser.GG_USER_BUDDY; } if (userMode == User.UserMode.BLOCKED) { return GGUser.GG_USER_BLOCKED; } if (userMode == User.UserMode.FRIEND) { return GGUser.GG_USER_FRIEND; } LOG.warn("Unable to convert userMode to protocolUserMode, falling back to unknown."); return GGUser.GG_USER_UNKNOWN; } public static RemoteStatus getClientRemoteStatus(final int status, final String description, final long returnTimeInMillis) { RemoteStatus remoteStatus = null; switch (status) { case GGStatuses.GG_STATUS_AVAIL: remoteStatus = new RemoteStatus(StatusType.ONLINE); break; case GGStatuses.GG_STATUS_AVAIL_DESCR: remoteStatus = new RemoteStatus(StatusType.ONLINE_WITH_DESCRIPTION); remoteStatus.setDescription(description); break; case GGStatuses.GG_STATUS_BUSY: remoteStatus = new RemoteStatus(StatusType.BUSY); break; case GGStatuses.GG_STATUS_BUSY_DESCR: remoteStatus = new RemoteStatus(StatusType.BUSY_WITH_DESCRIPTION); remoteStatus.setDescription(description); break; case GGStatuses.GG_STATUS_INVISIBLE: remoteStatus = new RemoteStatus(StatusType.INVISIBLE); break; case GGStatuses.GG_STATUS_INVISIBLE_DESCR: remoteStatus = new RemoteStatus(StatusType.INVISIBLE_WITH_DESCRIPTION); remoteStatus.setDescription(description); break; case GGStatuses.GG_STATUS_NOT_AVAIL: remoteStatus = new RemoteStatus(StatusType.OFFLINE); break; case GGStatuses.GG_STATUS_NOT_AVAIL_DESCR: remoteStatus = new RemoteStatus(StatusType.OFFLINE); remoteStatus.setDescription(description); break; // FIXME Default?? } if (remoteStatus != null && returnTimeInMillis != -1) { remoteStatus.setReturnDate(new Date(returnTimeInMillis)); } if ((status & GGStatuses.GG_STATUS_BLOCKED) == GGStatuses.GG_STATUS_BLOCKED) { remoteStatus.setBlocked(true); } else if (remoteStatus != null) { // Zupełnie bezsensowny null był remoteStatus.setBlocked(false); } return remoteStatus; } public static int getProtocolStatus(final IStatus clientStatus, final boolean isFriendsOnly, final boolean isBlocked) { if (clientStatus == null) { throw new IllegalArgumentException("clientStatus cannot be null."); } int protocolStatus = -1; switch (clientStatus.getStatusType()) { // FIXME Tu brakuje w cholerę statusów! case ONLINE: protocolStatus = GGStatuses.GG_STATUS_AVAIL; break; case ONLINE_WITH_DESCRIPTION: protocolStatus = GGStatuses.GG_STATUS_AVAIL_DESCR; break; case BUSY: protocolStatus = GGStatuses.GG_STATUS_BUSY; break; case BUSY_WITH_DESCRIPTION: protocolStatus = GGStatuses.GG_STATUS_BUSY_DESCR; break; case OFFLINE: protocolStatus = GGStatuses.GG_STATUS_NOT_AVAIL; break; case OFFLINE_WITH_DESCRIPTION: protocolStatus = GGStatuses.GG_STATUS_NOT_AVAIL_DESCR; break; case INVISIBLE: protocolStatus = GGStatuses.GG_STATUS_INVISIBLE; break; case INVISIBLE_WITH_DESCRIPTION: protocolStatus = GGStatuses.GG_STATUS_INVISIBLE_DESCR; break; default: // TODO Czy to aby dobry pomysł? protocolStatus = GGStatuses.GG_STATUS_UNKNOWN; } if (protocolStatus != -1) { if (isFriendsOnly) { protocolStatus |= GGStatuses.GG_STATUS_FRIENDS_MASK; } if (isBlocked) { protocolStatus |= GGStatuses.GG_STATUS_BLOCKED; } return protocolStatus; } LOG.warn("Unable to convert status, falling back to unknown."); return GGStatuses.GG_STATUS_UNKNOWN; } public static MessageStatus getClientMessageStatus(final int protocolMsgStatus) { MessageStatus msgStatus; switch (protocolMsgStatus) { case GGSendMsgAck.GG_ACK_DELIVERED: msgStatus = MessageStatus.DELIVERED; break; case GGSendMsgAck.GG_ACK_NOT_DELIVERED: msgStatus = MessageStatus.NOT_DELIVERED; break; case GGSendMsgAck.GG_ACK_BLOCKED: msgStatus = MessageStatus.BLOCKED; break; case GGSendMsgAck.GG_ACK_MBOXFULL: msgStatus = MessageStatus.BLOCKED_MBOX_FULL; break; case GGSendMsgAck.GG_ACK_QUEUED: msgStatus = MessageStatus.QUEUED; break; default: { LOG.warn("Unable to convert message status, falling back to unknown."); msgStatus = MessageStatus.UNKNOWN; } } return msgStatus; } public static MessageClass getClientMessageClass(final int protocolMsgClass) { MessageClass msgClass; switch (protocolMsgClass) { case GGMessageClass.GG_CLASS_ACK: msgClass = MessageClass.DO_NOT_CONFIRM; break; case GGMessageClass.GG_CLASS_CHAT: msgClass = MessageClass.CHAT; break; case GGMessageClass.GG_CLASS_CTCP: msgClass = MessageClass.PING; break; case GGMessageClass.GG_CLASS_MSG: msgClass = MessageClass.MESSAGE; break; case GGMessageClass.GG_CLASS_QUEUED: msgClass = MessageClass.QUEUED; break; case GGMessageClass.GG_CLASS_QUEUED2: msgClass = MessageClass.QUEUED; break; default: { LOG.warn("Unable to convert message class, falling back to unknown."); msgClass = MessageClass.UNKNOWN; } } return msgClass; } public static int getProtocolMessageClass(final MessageClass clientMsgClass) { int result; switch (clientMsgClass) { case CHAT: result = GGMessageClass.GG_CLASS_CHAT; break; case DO_NOT_CONFIRM: result = GGMessageClass.GG_CLASS_ACK; break; case MESSAGE: result = GGMessageClass.GG_CLASS_MSG; break; case QUEUED: result = GGMessageClass.GG_CLASS_QUEUED; break; case PING: result = GGMessageClass.GG_CLASS_CTCP; break; default: LOG.warn("Unable to convert protocol message class, falling back to unknown."); result = GGMessageClass.GG_CLASS_UNKNOWN; } return result; } }