+ *
+ * + * @param packet the packet to process. + */ + public void processPacket(Packet packet) + { + if(packet != null && !(packet instanceof NotificationEventIQ)) + return; + + NotificationEventIQ notifyEvent = (NotificationEventIQ)packet; + + if(logger.isDebugEnabled()) + { + if (logger.isDebugEnabled()) + logger.debug("Received notificationEvent from " + + notifyEvent.getFrom() + + " msg : " + + notifyEvent.toXML()); + } + + String fromUserID + = org.jivesoftware.smack.util.StringUtils.parseBareAddress( + notifyEvent.getFrom()); + + Contact sender = opSetPersPresence.findContactByID(fromUserID); + + if(sender == null) + sender = opSetPersPresence.createVolatileContact(fromUserID); + + fireNewEventNotification( + sender, + notifyEvent.getEventName(), + notifyEvent.getEventValue(), + notifyEvent.getEventSource()); + } + + /** + * Fires new notification event. + * @param from common from Contact. + * @param eventName the event name. + * @param eventValue the event value. + */ + private void fireNewEventNotification( + Contact from, + String eventName, + String eventValue, + String source) + { + String sourceUserID + = org.jivesoftware.smack.util.StringUtils.parseBareAddress( + source); + Contact sourceContact = + opSetPersPresence.findContactByID(sourceUserID); + if(sourceContact == null) + sourceContact = opSetPersPresence + .createVolatileContact(sourceUserID); + + GenericEvent + event = new GenericEvent( + jabberProvider, from, eventName, eventValue, sourceContact); + + Iterable+ *
+ * Extensions of this class must override this method. + * + * @return the child element section of the IQ XML. + */ + @Override + public String getChildElementXML() + { + StringBuilder buf = new StringBuilder(); + buf.append("<").append(ELEMENT_NAME). + append(" xmlns=\"").append(NAMESPACE). + append("\">"); + + buf.append("<").append(EVENT_NAME).append(">"). + append(StringUtils.escapeForXML(this.getEventName())) + .append("").append(EVENT_NAME).append(">"); + + buf.append("<"). + append(EVENT_VALUE).append(">"). + append(StringUtils.escapeForXML(this.getEventValue())) + .append("").append(EVENT_VALUE).append(">"); + + buf.append("<"). + append(EVENT_SOURCE).append(">"). + append(StringUtils.escapeForXML(this.getEventSource())) + .append("").append(EVENT_SOURCE).append(">"); + + buf.append("").append(ELEMENT_NAME).append(">"); + return buf.toString(); + } + + /** + * Current notification event name. + * @return current event name. + */ + public String getEventName() + { + return eventName; + } + + /** + * Sets event new name. + * @param eventName new event name. + */ + public void setEventName(String eventName) + { + this.eventName = eventName; + } + + /** + * Current notification event value. + * @return current event value. + */ + public String getEventValue() + { + return eventValue; + } + + /** + * Sets event new value. + * @param eventValue new event value. + */ + public void setEventValue(String eventValue) + { + this.eventValue = eventValue; + } + + /** + * Current notification event source. + * @return the current notification event source. + */ + public String getEventSource() + { + return eventSource; + } + + /** + * Sets event source new value. + * @param eventSource value. + */ + public void setEventSource(String eventSource) + { + this.eventSource = eventSource; + } +} diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/extensions/notification/NotificationEventIQProvider.java b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/notification/NotificationEventIQProvider.java new file mode 100644 index 000000000..1601fb982 --- /dev/null +++ b/src/net/java/sip/communicator/impl/protocol/jabber/extensions/notification/NotificationEventIQProvider.java @@ -0,0 +1,67 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.protocol.jabber.extensions.notification; + +import org.jivesoftware.smack.packet.*; +import org.jivesoftware.smack.provider.*; +import org.xmlpull.v1.*; + +/** + * The NotificationEventIQProvider parses Notification Event packets. + * + * @author Damian Minkov + */ +public class NotificationEventIQProvider + implements IQProvider +{ + /** + * Parse the IQ sub-document and create an IQ instance. Each IQ must have a + * single child element. At the beginning of the method call, the xml parser + * will be positioned at the opening tag of the IQ child element. At the end + * of the method call, the parser must be positioned on the closing + * tag of the child element. + * + * @param parser an XML parser. + * @return a new IQ instance. + * @throws Exception if an error occurs parsing the XML. + */ + public IQ parseIQ(XmlPullParser parser) + throws Exception + { + NotificationEventIQ result = new NotificationEventIQ(); + + boolean done = false; + while (!done) + { + int eventType = parser.next(); + if(eventType == XmlPullParser.START_TAG) + { + if(parser.getName().equals(NotificationEventIQ.EVENT_NAME)) + { + result.setEventName(parser.nextText()); + } + else if(parser.getName().equals(NotificationEventIQ.EVENT_VALUE)) + { + result.setEventValue(parser.nextText()); + } + else if(parser.getName().equals(NotificationEventIQ.EVENT_SOURCE)) + { + result.setEventSource(parser.nextText()); + } + } + else if(eventType == XmlPullParser.END_TAG) + { + if(parser.getName().equals(NotificationEventIQ.ELEMENT_NAME)) + { + done = true; + } + } + } + + return result; + } +} diff --git a/src/net/java/sip/communicator/service/protocol/OperationSetGenericNotifications.java b/src/net/java/sip/communicator/service/protocol/OperationSetGenericNotifications.java new file mode 100644 index 000000000..923635795 --- /dev/null +++ b/src/net/java/sip/communicator/service/protocol/OperationSetGenericNotifications.java @@ -0,0 +1,68 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.protocol; + +import net.java.sip.communicator.service.protocol.event.*; + +/** + * Provides notification for custom/generic events and possibility to generate + * such events. + * + * @author Damian Minkov + */ +public interface OperationSetGenericNotifications + extends OperationSet +{ + /** + * Generates new generic event notification and send it to the + * supplied contact. + * @param contact the contact to receive the event notification. + * @param eventName the event name of the notification. + * @param eventValue the event value of the notification. + */ + public void notifyForEvent( + Contact contact, + String eventName, + String eventValue); + + /** + * Generates new generic event notification and send it to the + * supplied contact. + * @param jid the contact jid which will receive the event notification. + * @param eventName the event name of the notification. + * @param eventValue the event value of the notification. + */ + public void notifyForEvent( + String jid, + String eventName, + String eventValue); + + /** + * Registers a GenericEventListener with this + * operation set so that it gets notifications for new + * event notifications. + * + * @param eventName register the listener for certain event name. + * @param listener the GenericEventListener + * to register. + */ + public void addGenericEventListener( + String eventName, + GenericEventListener listener); + + /** + * Unregisters listener so that it won't receive any further + * notifications upon new event notifications. + * + * @param eventName unregister the listener for certain event name. + * @param listener the GenericEventListener + * to unregister. + */ + public void removeGenericEventListener( + String eventName, + GenericEventListener listener); +} diff --git a/src/net/java/sip/communicator/service/protocol/event/GenericEvent.java b/src/net/java/sip/communicator/service/protocol/event/GenericEvent.java new file mode 100644 index 000000000..b5b52c612 --- /dev/null +++ b/src/net/java/sip/communicator/service/protocol/event/GenericEvent.java @@ -0,0 +1,121 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.protocol.event; + +import net.java.sip.communicator.service.protocol.*; + +import java.util.*; + +/** + * GenericEvents indicate reception of an new generic event. + * + * @author Damian Minkov + */ +public class GenericEvent + extends EventObject +{ + /** + * The contact which is the source of this event. + */ + private Contact from; + + /** + * The event name. + */ + private String eventName; + + /** + * The event value. + */ + private String eventValue; + + /** + * The source contact for this event. + */ + private Contact sourceContact; + + /** + * Constructs a GenericEvent. + * + * @param sourceProtocolProvider The object on which the Event initially occurred. + * @param from the contact from which this event is coming from. + * @param eventName the event name. + * @param eventValue the event value. + * @param sourceContact contact for this event. + * @throws IllegalArgumentException if source is null. + */ + public GenericEvent(ProtocolProviderService sourceProtocolProvider, + Contact from, + String eventName, + String eventValue, + Contact sourceContact) + { + super(sourceProtocolProvider); + + this.from = from; + this.eventName = eventName; + this.eventValue = eventValue; + this.sourceContact = sourceContact; + } + + /** + * The event name. + * @return the event name. + */ + public String getEventName() + { + return eventName; + } + + /** + * The event value. + * @return the event value. + */ + public String getEventValue() + { + return eventValue; + } + + /** + * The contact which is the source of this event. + * @return the contact which is the source of this event. + */ + public Contact getFrom() + { + return from; + } + + /** + * Returns the ProtocolProviderService which originated this event. + * + * @return the source ProtocolProviderService + */ + public ProtocolProviderService getSourceProvider() + { + return (ProtocolProviderService) getSource(); + } + + /** + * Returns a String representation of this GenericEvent. + * + * @return A a String representation of this GenericEvent. + */ + public String toString() + { + return "GenericEvent from:" + from + " - eventName:"+ eventName + + " eventValue:" + eventValue; + } + + /** + * Returns The source contact for this event. + * @return the event source contact. + */ + public Contact getSourceContact() + { + return sourceContact; + } +} diff --git a/src/net/java/sip/communicator/service/protocol/event/GenericEventListener.java b/src/net/java/sip/communicator/service/protocol/event/GenericEventListener.java new file mode 100644 index 000000000..b4f0bb321 --- /dev/null +++ b/src/net/java/sip/communicator/service/protocol/event/GenericEventListener.java @@ -0,0 +1,22 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.service.protocol.event; + +/** + * A listener that would gather and notify for incoming generic + * events. + * + * @author Damian Minkov + */ +public interface GenericEventListener +{ + /** + * Notify for incoming GenericEvent. + * @param event the incoming event. + */ + public void notify(GenericEvent event); +}