package de.uni_passau.fim.pkjab.model; import java.io.IOException; import java.net.Socket; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import de.uni_passau.fim.pkjab.model.xmpp.XMPPReader; import de.uni_passau.fim.pkjab.model.xmpp.XMPPReaderLogin; import de.uni_passau.fim.pkjab.model.xmpp.XMPPWriter; import de.uni_passau.fim.pkjab.util.ConnectionState; class ConnectionThread extends Thread { private final Connection connection; private Socket socket = null; private XMPPWriter output = null; private final XMLReader reader; /** * @param connection * @throws SAXException */ ConnectionThread(Connection connection) throws SAXException { this.connection = connection; reader = XMLReaderFactory.createXMLReader(); } synchronized void closeSocket() { if (socket != null) { if (!socket.isClosed()) { try { output.sendQuit(); } catch (IOException e) { /* do nothing */ } try { socket.close(); } catch (IOException e) { /* do nothing */ } } socket = null; } } synchronized boolean isConnected() { return (socket != null) && socket.isConnected(); } XMPPWriter getOutput() { return output; } synchronized void setReader(final ContentHandler handler) { reader.setContentHandler(handler); } public void run() { try { // connect socket = new Socket(connection.server, connection.port); socket.setKeepAlive(true); reader.setContentHandler((new XMPPReaderLogin(connection.callback))); output = new XMPPWriter(socket.getOutputStream()); while (true) { output.sendInit(connection.getJid().getDomain()); try { reader.parse(new InputSource(socket.getInputStream())); } catch (RestartStreamException e) { System.out.println("Restarting Stream..."); reader.setContentHandler((new XMPPReader(connection.callback))); continue; } } } catch (IOException e) { ConnectionState state = connection.getState(); if (!(state == ConnectionState.OFFLINE || state == ConnectionState.DISCONNECTING)) { System.err.println(e.getMessage()); // e.printStackTrace(); connection.disconnect(); } } catch (Exception e) { System.err.println(e.getMessage()); // e.printStackTrace(); connection.disconnect(); } } }