package org.jacorb.orb.miop; import org.jacorb.orb.CDROutputStream; import org.jacorb.orb.giop.ClientConnection; import org.omg.MIOP.UIPMC_ProfileBody; import org.omg.MIOP.UIPMC_ProfileBodyHelper; /** * Several utility constants and static methods. * * @author Alysson Neves Bessani * @version 1.0 */ public final class MulticastUtil { /* default values of several variables */ /** * Timeout used in socket.receivePacket. */ static final int SO_TIMEOUT = 100; /** * TTL of multicast packets. */ static final int TIME_TO_LIVE = 5; /** * Maximum number of incomplete messages tolerated. * * @see org.jacorb.orb.miop.ServerMIOPConnection */ static final int INCOMPLETE_MESSAGES_THRESHOULD = 5; /** * Timeout for a packet collection be completed. * * @see org.jacorb.orb.miop.FragmentedMessage */ static final int MESSAGE_COMPLETION_TIMEOUT = 500; /** * Packet max size (data + header). Default Ethernet MTU. * * Note that while 03-01-11 states 1518 is a typical ethernet frame * consisting of 6+6 bytes mac address, 2 bytes length, 4 bytes CRC and 1500 bytes * payload, 1500 bytes is the typical amount supported by most interfaces. */ static final int PACKET_MAX_SIZE = 1500; /** * This is the actual amount of data we can successfully pass inside the UMIOP * packet. It is calculated by: * 1500 - * 20 bytes IP Hdr less 8 bytes UDP Hdr = 28. * 32 bytes UMIOP hdr = 32 * By default 1500 - (28 + 32) = 1412 */ static final short PACKET_DATA_MAX_SIZE = 60; /* UMIOP constants */ /** * Our packet collection (message) id size. */ public static final int ID_SIZE = 12; /** * Packet boundary length. Separates header from data. */ public static final int BOUNDARY = 8; /** * Magic field of MIOP packet. */ public static final char[] MAGIC = {'M','I','O','P'}; /** * MIOP packet header version (1.0). */ public static final byte HDR_VERSION = 0x10; /** * Big endian flag. Used in Java language. */ public static final byte BIG_ENDIAN = 0x00; /** * The stop flag. Must be included in the last packet of each collection. */ public static final byte STOP_FLAG = 0x02; /** * Match miop magic markers * * @param buf the buf * * @return true, if successful */ public static final boolean matchMIOPMagic(char[] buf) { // The values are hard-coded to support non-ASCII platforms. return (buf[0] == 0x4d // 'M' && buf[1] == 0x49 // 'I' && buf[2] == 0x4f // 'O' && buf[3] == 0x50); // 'P' } /** * Encapsulates the given uipmc profile and returns the bytes. * * @param orb the orb * @param upb the upb * * @return the encapsulated uipmc profile */ public static byte[] getEncapsulatedUIPMCProfile (org.jacorb.orb.ORB orb, UIPMC_ProfileBody upb) { return getEncapsulatedUIPMCProfile (orb, null, upb); } /** * Encapsulates the uipmc profile in the given ClientConnection. * * @param orb the orb * @param connection the connection * * @return the encapsulated uipmc profile */ public static byte[] getEncapsulatedUIPMCProfile (org.jacorb.orb.ORB orb, ClientConnection connection) { return getEncapsulatedUIPMCProfile (orb, connection, null); } private static byte[] getEncapsulatedUIPMCProfile (org.jacorb.orb.ORB orb, ClientConnection connection, UIPMC_ProfileBody upb) { CDROutputStream out = new CDROutputStream (orb); out.beginEncapsulatedArray (); if (connection != null) { UIPMC_ProfileBodyHelper.write (out, ((MIOPProfile)connection.getRegisteredProfile ()).getUIPMCProfile ()); } else { UIPMC_ProfileBodyHelper.write (out, upb); } byte []result = out.getBufferCopy (); out.close(); return result; } }