/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * 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://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Pavel Savara * - Initial implementation * - messages are now serialized and deserialized on sender and receiver threads *******************************************************************************/ package net.sf.robocode.host.proxies; import net.sf.robocode.host.RobotStatics; import net.sf.robocode.host.IHostManager; import net.sf.robocode.host.serialization.RobocodeObjectInputStream; import net.sf.robocode.peer.IRobotPeer; import net.sf.robocode.peer.TeamMessage; import net.sf.robocode.repository.IRobotRepositoryItem; import robocode.MessageEvent; import robocode.robotinterfaces.peer.ITeamRobotPeer; import java.io.*; import java.util.List; /** * @author Pavel Savara (original) */ public class TeamRobotProxy extends AdvancedRobotProxy implements ITeamRobotPeer { static final int MAX_MESSAGE_SIZE = 32768; private final ByteArrayOutputStream byteStreamWriter; public TeamRobotProxy(IRobotRepositoryItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) { super(specification, hostManager, peer, statics); byteStreamWriter = new ByteArrayOutputStream(MAX_MESSAGE_SIZE); } // team public String[] getTeammates() { getCall(); return statics.getTeammates(); } public boolean isTeammate(String name) { getCall(); if (name != null) { // Bugfix [2960870] if (name.equals(statics.getName())) { return true; } final String[] teammates = statics.getTeammates(); if (teammates != null) { for (String mate : teammates) { if (mate.equals(name)) { return true; } } } } return false; } public void broadcastMessage(Serializable message) throws IOException { sendMessage(null, message); } public void sendMessage(String name, Serializable message) throws IOException { setCall(); try { if (!statics.isTeamRobot()) { throw new IOException("You are not on a team."); } byteStreamWriter.reset(); ObjectOutputStream objectStreamWriter = new ObjectOutputStream(byteStreamWriter); objectStreamWriter.writeObject(message); objectStreamWriter.flush(); byteStreamWriter.flush(); final byte[] bytes = byteStreamWriter.toByteArray(); objectStreamWriter.reset(); if (bytes.length > MAX_MESSAGE_SIZE) { throw new IOException("Message too big. " + bytes.length + ">" + MAX_MESSAGE_SIZE); } commands.getTeamMessages().add(new TeamMessage(getName(), name, bytes)); } catch (IOException e) { out.printStackTrace(e); throw e; } } @Override protected final void loadTeamMessages(List<TeamMessage> teamMessages) { if (teamMessages == null) { return; } for (TeamMessage teamMessage : teamMessages) { try { ByteArrayInputStream byteStreamReader = new ByteArrayInputStream(teamMessage.message); byteStreamReader.reset(); RobocodeObjectInputStream objectStreamReader = new RobocodeObjectInputStream(byteStreamReader, (ClassLoader) robotClassLoader); Serializable message = (Serializable) objectStreamReader.readObject(); final MessageEvent event = new MessageEvent(teamMessage.sender, message); eventManager.add(event); } catch (IOException e) { out.printStackTrace(e); } catch (ClassNotFoundException e) { out.printStackTrace(e); } } } // events public List<MessageEvent> getMessageEvents() { getCall(); return eventManager.getMessageEvents(); } }