1 /** 2 * $RCSfile$ 3 * $Revision: 2779 $ 4 * $Date: 2005-09-05 17:00:45 -0300 (Mon, 05 Sep 2005) $ 5 * 6 * Copyright 2003-2006 Jive Software. 7 * 8 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 21 package org.jivesoftware.smackx.muc; 22 23 import org.jivesoftware.smack.PacketListener; 24 import org.jivesoftware.smack.filter.MessageTypeFilter; 25 import org.jivesoftware.smack.filter.PacketExtensionFilter; 26 import org.jivesoftware.smack.filter.PacketFilter; 27 import org.jivesoftware.smack.filter.PacketTypeFilter; 28 import org.jivesoftware.smack.packet.Message; 29 import org.jivesoftware.smack.packet.Packet; 30 import org.jivesoftware.smack.packet.Presence; 31 32 /** 33 * The single <code>PacketListener</code> used by each {@link MultiUserChat} 34 * for all basic processing of presence, and message packets targeted to that chat. 35 * 36 * @author Larry Kirschner 37 */ 38 class PacketMultiplexListener implements PacketListener { 39 40 private static final PacketFilter MESSAGE_FILTER = 41 new MessageTypeFilter(Message.Type.groupchat); 42 private static final PacketFilter PRESENCE_FILTER = new PacketTypeFilter(Presence.class); 43 private static final PacketFilter SUBJECT_FILTER = new PacketFilter() { 44 public boolean accept(Packet packet) { 45 Message msg = (Message) packet; 46 return msg.getSubject() != null; 47 } 48 }; 49 private static final PacketFilter DECLINES_FILTER = 50 new PacketExtensionFilter("x", 51 "http://jabber.org/protocol/muc#user"); 52 53 private ConnectionDetachedPacketCollector messageCollector; 54 private PacketListener presenceListener; 55 private PacketListener subjectListener; 56 private PacketListener declinesListener; 57 58 public PacketMultiplexListener( 59 ConnectionDetachedPacketCollector messageCollector, 60 PacketListener presenceListener, 61 PacketListener subjectListener, PacketListener declinesListener) { 62 if (messageCollector == null) { 63 throw new IllegalArgumentException("MessageCollector is null"); 64 } 65 if (presenceListener == null) { 66 throw new IllegalArgumentException("Presence listener is null"); 67 } 68 if (subjectListener == null) { 69 throw new IllegalArgumentException("Subject listener is null"); 70 } 71 if (declinesListener == null) { 72 throw new IllegalArgumentException("Declines listener is null"); 73 } 74 this.messageCollector = messageCollector; 75 this.presenceListener = presenceListener; 76 this.subjectListener = subjectListener; 77 this.declinesListener = declinesListener; 78 } 79 80 public void processPacket(Packet p) { 81 if (PRESENCE_FILTER.accept(p)) { 82 presenceListener.processPacket(p); 83 } 84 else if (MESSAGE_FILTER.accept(p)) { 85 messageCollector.processPacket(p); 86 87 if (SUBJECT_FILTER.accept(p)) { 88 subjectListener.processPacket(p); 89 } 90 } 91 else if (DECLINES_FILTER.accept(p)) { 92 declinesListener.processPacket(p); 93 } 94 } 95 96 } 97