/* * Salamander Transport Layer * * Michael J. Willis (violator@umich.edu) * * $Workfile: SalPacketDispatcher.java $ * $Author: rmalan $ * $Date: 1997/07/16 03:08:31 $ * $Revision: 1.6 $ */ package Salamander; import java.net.*; import java.io.*; import java.util.*; class SalPacketDispatcher extends Thread { DataInputStream m_in; Hashtable m_flowTable; int m_serverKey; int m_interfaceVersion; SalConnection m_connection; public SalPacketDispatcher(SalConnection connection, int versionID) { m_connection = connection; m_in = connection.m_inputStream; m_flowTable = connection.m_flowTable; m_serverKey = connection.m_key; m_interfaceVersion = versionID; } private boolean supportSalamanderVersion(int senderType) { // For now just check to see if it matches. if (senderType >= m_interfaceVersion) return true; else return false; } public void run() { try { SAL.trace("SalPacketDispatcher started"); while (true) { SalPacket p = new SalPacket(); int senderKey; int senderType; int plistSize; senderKey = 0; String key, val; Integer i = new Integer (0); // System.out.println ("Waiting for Data...\n"); /* * Read KEY (4 bytes) */ try { senderKey = m_in.readInt(); } catch (IOException e) { System.err.println ("IOException: " + e); e.printStackTrace (); /* XXX close and fail. */ //CloseConnection(); return; } System.out.println("ReadServerData: read key in."); /* * Must match! Else we're off sync. */ if (m_serverKey != senderKey) { /* XXX close and fail. */ System.out.println("ReadServerData: key DOESN'T MATCH" + m_serverKey + " ! = " + senderKey); //CloseConnection(); return; } System.out.println("ReadServerData: key matches."); /* * Read TYPE (4 bytes) */ try { senderType = m_in.readInt(); } catch (IOException e) { System.err.println ("IOException: " + e); e.printStackTrace (); /* XXX close and fail. */ //CloseConnection(); return; } System.out.println("ReadServerData: read type in."); /* * If we don't support this version, close connection and fail. * XXX. */ if (!supportSalamanderVersion(senderType)) { //CloseConnection(); System.out.println("ReadServerData: doesn't support version: " + senderType + " != " + m_interfaceVersion); return; } /* * Read LENGTH (4 bytes): */ try { plistSize = m_in.readInt(); } catch (IOException e) { System.err.println ("IOException: " + e); e.printStackTrace (); /* XXX close and fail. */ //CloseConnection(); return; } System.out.println("ReadServerData: read length " + plistSize); /* * For this version just let it read in the header a byte * at a time like previous version. Just ignore the plist * size for now. */ p.serialize(m_in); String serviceName = p.getName(); if (null == serviceName) { if (m_connection.m_feedback) { SalDataQueue q = (SalDataQueue) m_flowTable.get (SalProperties.ALL_SALAMANDER_DATA); if (q != null) { q.enqueue(p); } } else { SAL.error("Read invalid packet..."); } } else { SalDataQueue q = (SalDataQueue) m_flowTable.get( serviceName ); if (null != q) { q.enqueue(p); } } } } catch (Exception e) { e.printStackTrace(System.err); SAL.error("Exception in SalPacketDispatcher.run() while reading SalPacket\n"+e.getMessage()); SAL.error("Dispatcher has aborted."); } } }