diff options
Diffstat (limited to 'src/org/jivesoftware/smackx/PEPManager.java')
-rw-r--r-- | src/org/jivesoftware/smackx/PEPManager.java | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/src/org/jivesoftware/smackx/PEPManager.java b/src/org/jivesoftware/smackx/PEPManager.java new file mode 100644 index 0000000..857f1c4 --- /dev/null +++ b/src/org/jivesoftware/smackx/PEPManager.java @@ -0,0 +1,160 @@ +/** + * $RCSfile: PEPManager.java,v $ + * $Revision: 1.4 $ + * $Date: 2007/11/06 21:43:40 $ + * + * Copyright 2003-2007 Jive Software. + * + * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jivesoftware.smackx; + +import java.util.ArrayList; +import java.util.List; + +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.Connection; +import org.jivesoftware.smack.filter.PacketExtensionFilter; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.packet.IQ.Type; +import org.jivesoftware.smackx.packet.PEPEvent; +import org.jivesoftware.smackx.packet.PEPItem; +import org.jivesoftware.smackx.packet.PEPPubSub; + +/** + * + * Manages Personal Event Publishing (XEP-163). A PEPManager provides a high level access to + * pubsub personal events. It also provides an easy way + * to hook up custom logic when events are received from another XMPP client through PEPListeners. + * + * Use example: + * + * <pre> + * PEPManager pepManager = new PEPManager(smackConnection); + * pepManager.addPEPListener(new PEPListener() { + * public void eventReceived(String inFrom, PEPEvent inEvent) { + * LOGGER.debug("Event received: " + inEvent); + * } + * }); + * + * PEPProvider pepProvider = new PEPProvider(); + * pepProvider.registerPEPParserExtension("http://jabber.org/protocol/tune", new TuneProvider()); + * ProviderManager.getInstance().addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", pepProvider); + * + * Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track"); + * pepManager.publish(tune); + * </pre> + * + * @author Jeff Williams + */ +public class PEPManager { + + private List<PEPListener> pepListeners = new ArrayList<PEPListener>(); + + private Connection connection; + + private PacketFilter packetFilter = new PacketExtensionFilter("event", "http://jabber.org/protocol/pubsub#event"); + private PacketListener packetListener; + + /** + * Creates a new PEP exchange manager. + * + * @param connection a Connection which is used to send and receive messages. + */ + public PEPManager(Connection connection) { + this.connection = connection; + init(); + } + + /** + * Adds a listener to PEPs. The listener will be fired anytime PEP events + * are received from remote XMPP clients. + * + * @param pepListener a roster exchange listener. + */ + public void addPEPListener(PEPListener pepListener) { + synchronized (pepListeners) { + if (!pepListeners.contains(pepListener)) { + pepListeners.add(pepListener); + } + } + } + + /** + * Removes a listener from PEP events. + * + * @param pepListener a roster exchange listener. + */ + public void removePEPListener(PEPListener pepListener) { + synchronized (pepListeners) { + pepListeners.remove(pepListener); + } + } + + /** + * Publish an event. + * + * @param item the item to publish. + */ + public void publish(PEPItem item) { + // Create a new message to publish the event. + PEPPubSub pubSub = new PEPPubSub(item); + pubSub.setType(Type.SET); + //pubSub.setFrom(connection.getUser()); + + // Send the message that contains the roster + connection.sendPacket(pubSub); + } + + /** + * Fires roster exchange listeners. + */ + private void firePEPListeners(String from, PEPEvent event) { + PEPListener[] listeners = null; + synchronized (pepListeners) { + listeners = new PEPListener[pepListeners.size()]; + pepListeners.toArray(listeners); + } + for (int i = 0; i < listeners.length; i++) { + listeners[i].eventReceived(from, event); + } + } + + private void init() { + // Listens for all roster exchange packets and fire the roster exchange listeners. + packetListener = new PacketListener() { + public void processPacket(Packet packet) { + Message message = (Message) packet; + PEPEvent event = (PEPEvent) message.getExtension("event", "http://jabber.org/protocol/pubsub#event"); + // Fire event for roster exchange listeners + firePEPListeners(message.getFrom(), event); + }; + + }; + connection.addPacketListener(packetListener, packetFilter); + } + + public void destroy() { + if (connection != null) + connection.removePacketListener(packetListener); + + } + + protected void finalize() throws Throwable { + destroy(); + super.finalize(); + } +} |