/* * Copyright (c) 2008, 2009, 2011, 2012 Eike Stepper (Berlin, Germany) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eike Stepper - initial API and implementation */ package org.eclipse.net4j.buddies.internal.common.protocol; import org.eclipse.net4j.buddies.common.IAccount; import org.eclipse.net4j.buddies.common.IBuddy; import org.eclipse.net4j.buddies.common.IBuddyContainer; import org.eclipse.net4j.buddies.common.IMessage; import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import org.eclipse.net4j.util.io.ExtendedDataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamClass; import java.util.Collection; import java.util.HashSet; import java.util.Set; /** * @author Eike Stepper */ public final class ProtocolUtil { private ProtocolUtil() { } public static void writeBuddies(ExtendedDataOutputStream out, Collection<IBuddy> buddies) throws IOException { if (buddies == null) { out.writeInt(0); } else { out.writeInt(buddies.size()); for (IBuddy buddy : buddies) { out.writeString(buddy.getUserID()); } } } public static Set<IBuddy> readBuddies(ExtendedDataInputStream in, IBuddyContainer buddyContainer) throws IOException { int size = in.readInt(); Set<IBuddy> buddies = new HashSet<IBuddy>(); for (int i = 0; i < size; i++) { String userID = in.readString(); IBuddy buddy = buddyContainer.getBuddy(userID); if (buddy != null) { buddies.add(buddy); } } return buddies; } public static String[] readUserIDs(ExtendedDataInputStream in) throws IOException { int size = in.readInt(); String[] userIDs = new String[size]; for (int i = 0; i < size; i++) { userIDs[i] = in.readString(); } return userIDs; } public static void writeAccount(ExtendedDataOutputStream out, IAccount account) throws IOException { if (account != null) { out.writeBoolean(true); ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(account); } else { out.writeBoolean(false); } } public static IAccount readAccount(ExtendedDataInputStream in) throws IOException { boolean exists = in.readBoolean(); if (!exists) { return null; } try { ObjectInputStream ois = new ObjectInputStream(in); return (IAccount)ois.readObject(); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw WrappedException.wrap(ex); } } public static void writeState(ExtendedDataOutputStream out, IBuddy.State state) throws IOException { switch (state) { case AVAILABLE: out.writeByte(ProtocolConstants.STATE_AVAILABLE); break; case LONESOME: out.writeByte(ProtocolConstants.STATE_LONESOME); break; case AWAY: out.writeByte(ProtocolConstants.STATE_AWAY); break; case DO_NOT_DISTURB: out.writeByte(ProtocolConstants.STATE_DO_NOT_DISTURB); break; default: throw new IllegalArgumentException("Illegal state: " + state); //$NON-NLS-1$ } } public static IBuddy.State readState(ExtendedDataInputStream in) throws IOException { byte state = in.readByte(); switch (state) { case ProtocolConstants.STATE_AVAILABLE: return IBuddy.State.AVAILABLE; case ProtocolConstants.STATE_LONESOME: return IBuddy.State.LONESOME; case ProtocolConstants.STATE_AWAY: return IBuddy.State.AWAY; case ProtocolConstants.STATE_DO_NOT_DISTURB: return IBuddy.State.DO_NOT_DISTURB; default: throw new IllegalArgumentException("Illegal state: " + state); //$NON-NLS-1$ } } public static void writeFacilityTypes(ExtendedDataOutputStream out, String[] facilityTypes) throws IOException { if (facilityTypes == null) { out.writeInt(0); } else { out.writeInt(facilityTypes.length); for (String facilityType : facilityTypes) { out.writeString(facilityType); } } } public static String[] readFacilityTypes(ExtendedDataInputStream in) throws IOException { int size = in.readInt(); String[] facilityTypes = new String[size]; for (int i = 0; i < size; i++) { facilityTypes[i] = in.readString(); } return facilityTypes; } public static void writeMessage(ExtendedDataOutputStream out, IMessage message) throws IOException { ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(message); } public static IMessage readMessage(ExtendedDataInputStream in, final ClassLoader classLoader) throws IOException { try { ObjectInputStream ois = new ObjectInputStream(in) { @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String className = desc.getName(); return classLoader.loadClass(className); } }; return (IMessage)ois.readObject(); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw WrappedException.wrap(ex); } } }