From 24f965ead7b1afec5b7cf015cb9494b094508540 Mon Sep 17 00:00:00 2001 From: Gaston Dombiak Date: Sat, 15 Nov 2003 19:24:00 +0000 Subject: [PATCH] Adds notification for sent packets git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@2167 b35dd754-fafc-0310-a699-88a17e54d16e --- .../org/jivesoftware/smack/PacketWriter.java | 73 ++++++++++++++++-- .../smack/PacketWriterListener.java | 75 +++++++++++++++++++ 2 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 source/org/jivesoftware/smack/PacketWriterListener.java diff --git a/source/org/jivesoftware/smack/PacketWriter.java b/source/org/jivesoftware/smack/PacketWriter.java index 0bec87aa9..5ea60b063 100644 --- a/source/org/jivesoftware/smack/PacketWriter.java +++ b/source/org/jivesoftware/smack/PacketWriter.java @@ -52,7 +52,7 @@ package org.jivesoftware.smack; -import java.util.LinkedList; +import java.util.*; import java.io.*; import org.jivesoftware.smack.packet.Packet; @@ -69,7 +69,10 @@ class PacketWriter { private XMPPConnection connection; private LinkedList queue; private boolean done = false; - private int packetsWritten = 0; + + private List listeners = new ArrayList(); + private Thread listenerThread; + private LinkedList sentPackets = new LinkedList(); /** * Creates a new packet writer with the specified connection. @@ -88,6 +91,14 @@ class PacketWriter { }; writerThread.setName("Smack Packet Writer"); writerThread.setDaemon(true); + + listenerThread = new Thread() { + public void run() { + processListeners(); + } + }; + listenerThread.setName("Smack Writer Listener Processor"); + listenerThread.setDaemon(true); } /** @@ -101,16 +112,36 @@ class PacketWriter { queue.addFirst(packet); queue.notify(); } + // Add the sent packet to the list of sent packets + // The PacketWriterListeners will be notified of the new packet + synchronized(sentPackets) { + sentPackets.addFirst(packet); + sentPackets.notify(); + } } } /** - * Returns the number of packets written through this packet writer. + * Registers a packet writer listener with this writer. The listener will be + * notified of every packet that this writer sends. * - * @return the number of packets written. + * @param packetWriterListener the packet writer listener to notify of sent packets. */ - public int getPacketsWritten() { - return packetsWritten; + public void addPacketListener(PacketWriterListener packetWriterListener) { + synchronized (listeners) { + listeners.add(packetWriterListener); + } + } + + /** + * Removes a packet writer listener. + * + * @param packetWriterListener the packet writer listener to remove. + */ + public void removePacketListener(PacketWriterListener packetWriterListener) { + synchronized (listeners) { + listeners.remove(packetWriterListener); + } } /** @@ -120,6 +151,7 @@ class PacketWriter { */ public void startup() { writerThread.start(); + listenerThread.start(); } /** @@ -162,8 +194,6 @@ class PacketWriter { while (!done) { Packet packet = nextPacket(); writer.write(packet.toXML()); - // Increment the count of packets written. - packetsWritten++; writer.flush(); } // Close the stream. @@ -186,4 +216,31 @@ class PacketWriter { } } } + + /** + * Process listeners. + */ + private void processListeners() { + while (!done) { + Packet sentPacket; + // Wait until a new packet has been sent + synchronized(sentPackets) { + while (sentPackets.size() == 0) { + try { + sentPackets.wait(); + } + catch (InterruptedException ie) { } + } + sentPacket = (Packet)sentPackets.removeLast(); + } + // Notify the listeners of the new sent packet + int size = listeners.size(); + for (int i=0; i + * + * @param packet the packet to process. + */ + public void processPacket(Packet packet); + +}