blob: 886238a540688424538ca26f4d0b0a814692549b [file] [log] [blame]
/*
* 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);
}
}
}