/* * Jeti, a Java Jabber client, Copyright (C) 2003 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 me at jeti@jabber.org */ package nu.fw.jeti.backend; import java.text.MessageFormat; import java.util.Iterator; import javax.swing.JOptionPane; import nu.fw.jeti.events.IQResultListener; import nu.fw.jeti.events.MessageEventListener; import nu.fw.jeti.events.MessageListener; import nu.fw.jeti.events.PresenceListener; import nu.fw.jeti.jabber.Backend; import nu.fw.jeti.jabber.JID; import nu.fw.jeti.jabber.JIDStatus; import nu.fw.jeti.jabber.elements.*; import nu.fw.jeti.util.I18N; import nu.fw.jeti.util.Log; import nu.fw.jeti.util.Popups; import nu.fw.jeti.util.ServerExpresso; /** * distributes the xml packets received from the server * @author E.S. de Boer */ public class Jabber implements PacketReceiver { private Backend backend; private Discovery discovery; private IQTimerQueue iqTimerQueue; private OwnCapabilities capabilities; public String NameContact; public String NameOrganization; public Jabber(Backend backend,OwnCapabilities capabilities, Discovery browse, IQTimerQueue timerQueue) { iqTimerQueue = timerQueue; this.backend = backend; this.discovery = browse; this.capabilities = capabilities; } public void receivePackets(Packet packet) { if (packet instanceof StreamError) backend.streamError((StreamError)packet); if (packet instanceof InfoQuery) infoQuery((InfoQuery) packet); else if (packet instanceof Message) message((Message) packet); else if (packet instanceof Presence) presence((Presence) packet); } /*------------------------------InfoQuery------------------------*/ private void infoQuery(InfoQuery infoQuery) { IQResultListener iqrListener = iqTimerQueue.getInfoQueryListener(infoQuery.getID()); if(iqrListener!=null) { iqrListener.iqResult(infoQuery); } else { if (infoQuery.hasExtensions()) { IQExtension extension = infoQuery.getIQExtension(); if (extension instanceof IQDiscoInfo) {//move to execute if (infoQuery.getType().equals("result")) { discovery.discoveryInfoResult(infoQuery.getFrom(), infoQuery.getID(), (IQDiscoInfo) extension); } else if (infoQuery.getType().equals("get")) { capabilities.answerInfoRequest(infoQuery,(IQDiscoInfo) extension); } else if (infoQuery.getType().equals("error")) { Log.xmlReceivedError("Disco error " + infoQuery.getErrorCode() + " " + infoQuery.getErrorDescription() + " from " + infoQuery.getFrom()); discovery.discoError(infoQuery.getID(), infoQuery.getFrom()); } } else if (extension instanceof IQDiscoItems) {//move to execute if (infoQuery.getType().equals("result")) { discovery.discoveryItemResult(infoQuery.getFrom(), infoQuery.getID(), (IQDiscoItems) extension); } else if (infoQuery.getType().equals("error")) { Log.xmlReceivedError("Disco error " + infoQuery.getErrorCode() + " " + infoQuery.getErrorDescription() + " from " + infoQuery.getFrom()); discovery.discoError(infoQuery.getID(), infoQuery.getFrom()); } } else if (extension instanceof IQBrowse) { /*if (infoQuery.getType().equals("result")) { browse.browseResult(infoQuery.getFrom(), infoQuery.getID(), (IQBrowse) extension); } else if (infoQuery.getType().equals("error")) { Log.xmlReceivedError("Browse error " + infoQuery.getErrorCode() + " " + infoQuery.getErrorDescription() + " from " + infoQuery.getFrom()); browse.browseError(infoQuery.getID(), infoQuery.getFrom()); }*/ } else extension.execute(infoQuery, backend); } else if (infoQuery.getType().equals("set")) { XMPPError err = new XMPPError("cancel", 501); err.addError(new XMPPErrorTag("feature-not-implemented")); backend.send(new InfoQuery(infoQuery.getFrom(), infoQuery.getID(), err)); } //TODO change Jingle code to register iq listeners instead of this else if(infoQuery.getType().equals("result") && infoQuery.getID().indexOf("jj") == 0 ){ for(Iterator i = backend.getListeners(IQResultListener.class); i.hasNext();){ ((IQResultListener)i.next()).iqResult(infoQuery); } } } } /*-------------------------------Message-------------------------*/ private void message(Message message) { MessageListener messageListener = backend.getMessageListener(message.getFrom()); if(messageListener != null) { messageListener.message(message); return; } if (message.getBody() != null || message.getType().equals("groupchat")) { for (Iterator j = backend.getListeners(MessageListener.class); j.hasNext();) { ((MessageListener) j.next()).message(message); } } if (message.hasExtensions()) { for (Iterator i = message.getExtensions(); i.hasNext();) { Extension extension = (Extension) i.next(); if (extension instanceof XExecutableExtension) { ((XExecutableExtension)extension).execute(message, backend); } else if (extension instanceof XMessageEvent) {//make executable? //goes wrong with groupchat //System.out.println( "exts" + extension); if (message.getBody() == null) { //no body so composing event for (Iterator j = backend.getListeners(MessageEventListener.class); j.hasNext();) { ((MessageEventListener) j.next()).onComposing(message.getFrom(), message.getThread(), (XMessageEvent) extension); } } else { //body so request to sent events //goes wrong with groupchat for (Iterator j = backend.getListeners(MessageEventListener.class); j.hasNext();) { ((MessageEventListener) j.next()).requestComposing(message.getFrom(), message.getID(), message.getThread()); } } } } } } //----------------------------------Presence----------------------------------------------------\\ private void presence(Presence presence) { //presence for groupchat eg PresenceListener presenceListener = backend.getPresenceListener(presence.getFrom()); if(presenceListener != null) { presenceListener.presenceChanged(presence); return; } String type = presence.getType(); if(!"error".equals(type)) { if(presence.hasExtensions()) { for(Iterator i = presence.getExtensions();i.hasNext();) { Object o = i.next(); if(o instanceof IQXCaps) { backend.setCapability(presence.getFrom(),(IQXCaps)o); break; } } } } if (type.equals("available") || type.equals("unavailable")) { for (Iterator j = backend.getListeners(PresenceListener.class); j.hasNext();) { ((PresenceListener) j.next()).presenceChanged(presence); } } else if ("subscribe".equals(type)) { JID from = presence.getFrom(); if (from.getUser() == null) { //server sendSubscribed(from, "subscribed", presence.getID()); if (backend.getJIDStatus(presence.getFrom()) == null) { backend.send(new Presence(from, "subscribe")); IQXRoster roster = new IQXRoster(new RosterItem(from, null, null, "subscribe", null)); backend.send(new InfoQuery("set", roster)); } } else { fireOnSubscriptionRequestEvent(from, presence.getID()); } } else if ("unsubscribed".equals(type)) { /** * @DATE : 14/10/2008 * @author : Alexandre Correia - alexandrecorreia@im.pr.gov.br * @Description : Trecho Comentado : * Este trecho faz com que se receba uma notificacao quando o seu * convite nao foi aceito/rejeitado. */ //Popups.messagePopup(presence.getFrom() + "unsuscribed you from his presence", "Unsubscribed"); } else if ("error".equals(type)) { Log.xmlReceivedError("Presence error " + presence.getErrorCode() + " " + presence.getErrorDescription() + " from " + presence.getFrom()); } } private void fireOnSubscriptionRequestEvent(final JID from, final String id) { /** * @Author : Alexandre Correia - alexandrecorreia@celepar.pr.gov.br * @Date : 13/10/2008 * @Description : Passa para o Servidor Expresso o uid para retornar * o cn e a organizacao do requerente, informacao que sera * mostrada, pedindo autorizacao. */ JIDStatus jidStatus = backend.getJIDStatus(from); String cName = new String(); cName = from.toString(); ServerExpresso JidName = new ServerExpresso(); String ReturnComplete = JidName.NameCN(cName); NameContact = ReturnComplete.substring(0, ReturnComplete.indexOf(";")); NameOrganization = ReturnComplete.substring(ReturnComplete.indexOf(";") + 1 ,ReturnComplete.length()); if (jidStatus != null) { Popups.OptionChoosed choose = new Popups.OptionChoosed() { public void optionChoosed(int option) { String type = "subscribed"; if (option == javax.swing.JOptionPane.YES_OPTION) type = "unsubscribed"; sendSubscribed(from, type, id); } }; Object[] options = { I18N.gettext("main.popup.Deny_subscription"), I18N.gettext("OK") }; Popups.showOptionDialog( //MessageFormat.format(I18N.gettext("main.popup.{0}_wants_to_subscribe_to_your_presence"),new Object[]{jidStatus.getNick()}), MessageFormat.format(I18N.gettext("main.popup.{0}_wants_to_subscribe_to_your_presence"),new Object[]{NameContact + "\n" + NameOrganization + " , "}), I18N.gettext("main.popup.Subscription_request"), javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.QUESTION_MESSAGE, null, options, options[1], choose); } else { Popups.OptionChoosed choose = new Popups.OptionChoosed() { public void optionChoosed(int option) { String type = "subscribed"; if ( option == javax.swing.JOptionPane.NO_OPTION ) { /** * @Author : Alexandre Correia - alexandrecorreia@celepar.pr.gov.br * @Date : 17/10/2008 * @Description : Passa para a janela o Nome do Contato consultado no Ldap Expresso. */ //add to roster //frame to addcontact ipv null?? //new nu.fw.jeti.ui.AddContact(from, null, backend).setVisible(true); new nu.fw.jeti.ui.AddContact(from, null, backend, NameContact, NameOrganization).setVisible(true); } else type = "unsubscribed"; sendSubscribed(from, type, id); // no more no filed (distracts users) // else if (option == javax.swing.JOptionPane.CANCEL_OPTION || option == javax.swing.JOptionPane.CLOSED_OPTION) // {//add to not filed make different // //subscribe(from,null,"Friends"); // IQXRoster roster = new IQXRoster(new RosterItem(from,null,null,null,null)); // backend.send(new InfoQuery("set",roster)); // } } }; Object[] options = { I18N.gettext("main.popup.Deny_subscription"), I18N.gettext("main.popup.Add_to_roster") }; Popups.showOptionDialog( //MessageFormat.format(I18N.gettext("main.popup.{0}_wants_to_subscribe_to_your_presence"),new Object[]{from}), MessageFormat.format(I18N.gettext("main.popup.{0}_wants_to_subscribe_to_your_presence"), new Object[]{NameContact + "\n" + NameOrganization + " , "}), I18N.gettext("main.popup.Subscription_request"), javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.QUESTION_MESSAGE, null, options, options[1], choose); } } private void sendSubscribed(JID from, String type, String id) { //id so need builder try { PresenceBuilder pb = new PresenceBuilder(); pb.type = type; pb.setId(id); pb.setTo(from); backend.send(pb.build()); } catch (InstantiationException e) { e.printStackTrace(); } } } /* * Overrides for emacs * Local variables: * tab-width: 4 * End: */