/* * Jeti, a Java Jabber client, Copyright (C) 2001 E.S. de Boer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For questions, comments etc, * use the website at http://jeti.jabberstudio.org * or mail/IM me at jeti@jabber.org * * created 2001 */ package nu.fw.jeti.backend; import nu.fw.jeti.jabber.elements.Packet; import nu.fw.jeti.jabber.handlers.ExtensionHandler; import nu.fw.jeti.jabber.handlers.PacketHandler; import nu.fw.jeti.jabber.handlers.UnknownPacketHandler; import nu.fw.jeti.util.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author E.S. de Boer * @version 1.0 */ public class JabberHandler extends DefaultHandler { private int depth;//current depth in xml doc private PacketHandler packetHandeler; private ExtensionHandler extensionHandler; private Handlers handlers; private PacketReceiver packetReceiver; private StringBuffer completeXML = new StringBuffer(); public JabberHandler(PacketReceiver connect,Handlers handlers) { this.handlers =handlers; this.packetReceiver = connect; } public void changePacketReceiver(PacketReceiver reciever) { packetReceiver = reciever; } public void startDocument() { //System.out.println(""); } public void endDocument(){ System.out.println("end document");} public void startElement(String namespaceURI, String sName, // simple name String qName, // qualified name Attributes attrs) throws SAXException { try{ switch(depth++) { case 0: if("stream:stream".equals(qName)) { String sessionID = attrs.getValue("id"); String xmppVersion = attrs.getValue("version"); //connected only when connecting so cast to connect make interface for register? ((ConnectionPacketReceiver)packetReceiver).connected(sessionID,xmppVersion); //no connection id on sun server so don't throw the error //if(sessionID == null) throw new SAXException("session id = null"); return; } else if(qName.equals("stream:error")) break; throw new SAXException("No stream:stream element"); case 1://iq message and presence completeXML = new StringBuffer();//new packet so clear stringbuffer //if(qName.equals("stream:error")) break; packetHandeler = handlers.getPacketHandler(qName); extensionHandler = null; if(packetHandeler == null) {//unknown handler Log.notParsedXML(qName + " is not a message, presence or iq packet"); packetHandeler = new UnknownPacketHandler(); } packetHandeler.startHandling(attrs); break; default: String xmlns = attrs.getValue("xmlns"); if(xmlns !=null) {//if contains xmlns new extension //extension in extension? ExtensionHandler tempExtensionHandler = handlers.getExtensionHandler(xmlns); if(tempExtensionHandler == null) {// unknown extension handler tempExtensionHandler = handlers.getExtensionHandler("unknown"); } if (extensionHandler != null) tempExtensionHandler.setParent(extensionHandler);//extension in extension extensionHandler = tempExtensionHandler; extensionHandler.setName(qName); extensionHandler.startHandling(attrs); } else if(extensionHandler !=null) {//no new extension extensionHandler.up(); extensionHandler.startElement(qName,attrs); } else packetHandeler.startElement(qName, attrs); } completeXML.append("<"); completeXML.append(qName); if (attrs != null) { String aName = null; for (int i = 0; i < attrs.getLength(); i++) { aName = attrs.getQName(i); completeXML.append(" "); completeXML.append(aName+"=\""+attrs.getValue(i)+"\""); } } completeXML.append(">"); } catch (Exception e){throw new SAXException(e);} } public void endElement(String namespaceURI, String sName, // simple name String qName // qualified name ) throws SAXException { try{ completeXML.append(""); switch(--depth){ case 0: // We're back at the end of the root break; case 1:// The Packet is finished Log.completeXML(completeXML); /* if(qName.equals("stream:error")) { Packet packet = packetHandeler.build(); Log.xmlPacket(packet); packetReceiver.streamError(packet); break; } */ try{ Packet packet = packetHandeler.build(); Log.xmlPacket(packet); packetReceiver.receivePackets(packet); }catch(InstantiationException e){Log.xmlParseException(e);} catch (UnsupportedOperationException e) {//only way to stop xml parser if("end xmlparser".equals(e.getMessage())) {throw new SAXException("end xmlparser");} } catch(Exception e) { e.printStackTrace(); } break; default: // Move back up the tree if(extensionHandler != null) {//in extension //if(extensionHandler.getName().equals(qName))//name matched start tag so close extension if(extensionHandler.isTop()) { ExtensionHandler parent = extensionHandler.getParent(); if(parent != null) {//extension has parent add this extension to parent try{ parent.addExtension(extensionHandler.build()); }catch(InstantiationException e){Log.xmlParseException(e);} extensionHandler.setParent(null);//clear parent extensionHandler = parent; } else {//add extension to packet try{ packetHandeler.addExtension(extensionHandler.build()); }catch(InstantiationException e){Log.xmlParseException(e);} extensionHandler = null; } }// element end inside a extension else { extensionHandler.down(); extensionHandler.endElement(qName); } }// element end inside a packet else packetHandeler.endElement(qName); } } catch (Exception e){throw new SAXException(e);} } public void characters(char buf[], int offset, int len) throws SAXException { try{ String text = new String(buf, offset,len); //.trim(); if(extensionHandler != null) extensionHandler.characters(text); else if (packetHandeler!=null) packetHandeler.characters(text); completeXML.append(text.trim()); } catch (Exception e){throw new SAXException(e);} } } /* * Overrides for emacs * Local variables: * tab-width: 4 * End: */