/* * 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 java.util.*; import net.java.sip.communicator.service.protocol.event.*; /** * OperationSetPresence offers methods for * * @todo Say that ContactList management is else where and Presence functions * are here * @todo Say that presence implementations should not contain any persistent * data of subscriptions * @todo say that this is not persistent and that persistent is elsewhere. * * @author Emil Ivov */ public interface OperationSetPresence extends OperationSet { /** * Returns a PresenceStatus instance representing the state this provider is * currently in. Note that PresenceStatus instances returned by this method * MUST adequately represent all possible states that a provider might enter * during its lifecycle, including those that would not be visible to others * (e.g. Initializing, Connecting, etc ..) and those that will be sent to * contacts/buddies (On-Line, Eager to chat, etc.). * * @return the PresenceStatus last published by this provider. */ public PresenceStatus getPresenceStatus(); /** * Requests the provider to enter into a status corresponding to the * specified parameters. Note that calling this method does not necessarily * imply that the requested status would be entered. This method would * return right after being called and the caller should add itself as a * listener to this class in order to get notified when the state has * actually changed. * * @param status the PresenceStatus as returned by getRequestableStatusSet * @param statusMessage the message that should be set as the reason to * enter that status * @throws IllegalArgumentException if the status requested is not a valid * PresenceStatus supported by this provider. * @throws java.lang.IllegalStateException if the provider is not currently * registered. * @throws OperationFailedException with code NETWORK_FAILURE if publishing * the status fails due to a network error. */ public void publishPresenceStatus(PresenceStatus status, String statusMessage) throws IllegalArgumentException, IllegalStateException, OperationFailedException; /** * Returns the set of PresenceStatus objects that a user of this service may * request the provider to enter. Note that the provider would most probably * enter more states than those returned by this method as they only depict * instances that users may request to enter. (e.g. a user may not request a * "Connecting..." state - it is a temporary state that the provider enters * while trying to enter the "Connected" state). * * @return Iterator a PresenceStatus array containing "enterable" status * instances. */ public Iterator getSupportedStatusSet(); /** * Get the PresenceStatus for a particular contact. This method is not meant * to be used by the user interface (which would simply register as a * presence listener and always follow contact status) but rather by other * plugins that may for some reason need to know the status of a particular * contact. * <p> * * @param contactIdentifier the identifier of the contact whose status we're * interested in. * @return PresenceStatus the <tt>PresenceStatus</tt> of the specified * <tt>contact</tt> * * @throws OperationFailedException with code NETWORK_FAILURE if retrieving * the status fails due to errors experienced during network * communication * @throws IllegalArgumentException if <tt>contact</tt> is not a contact * known to the underlying protocol provider * @throws IllegalStateException if the underlying protocol provider is not * registered/signed on a public service. */ public PresenceStatus queryContactStatus(String contactIdentifier) throws IllegalArgumentException, IllegalStateException, OperationFailedException; /** * Adds a subscription for the presence status of the contact corresponding * to the specified contactIdentifier. Note that apart from an exception in * the case of an immediate failure, the method won't return any indication * of success or failure. That would happen later on through a * SubscriptionEvent generated by one of the methods of the * SubscriptionListener. * <p> * This subscription is not going to be persistent (as opposed to * subscriptions added from the OperationSetPersistentPresence.subscribe() * method) * * @param contactIdentifier the identifier of the contact whose status * updates we are subscribing for. * <p> * @throws OperationFailedException with code NETWORK_FAILURE if subscribing * fails due to errors experienced during network communication * @throws IllegalArgumentException if <tt>contact</tt> is not a contact * known to the underlying protocol provider * @throws IllegalStateException if the underlying protocol provider is not * registered/signed on a public service. */ public void subscribe(String contactIdentifier) throws IllegalArgumentException, IllegalStateException, OperationFailedException; /** * Removes a subscription for the presence status of the specified contact. * * @param contact the contact whose status updates we are unsubscribing * from. * * @throws OperationFailedException with code NETWORK_FAILURE if * unsubscribing fails due to errors experienced during network * communication * @throws IllegalArgumentException if <tt>contact</tt> is not a contact * known to the underlying protocol provider * @throws IllegalStateException if the underlying protocol provider is not * registered/signed on a public service. */ public void unsubscribe(Contact contact) throws IllegalArgumentException, IllegalStateException, OperationFailedException; /** * Returns a reference to the contact with the specified ID in case we have * a subscription for it and null otherwise/ * * @param contactID a String identifier of the contact which we're seeking a * reference of. * @return a reference to the Contact with the specified <tt>contactID</tt> * or null if we don't have a subscription for the that identifier. */ public Contact findContactByID(String contactID); /** * Handler for incoming authorization requests. An authorization request * notifies the user that someone is trying to add her to their contact list * and requires her to approve or reject authorization for that action. * * @param handler an instance of an AuthorizationHandler for authorization * requests coming from other users requesting permission add us * to their contact list. */ public void setAuthorizationHandler(AuthorizationHandler handler); /** * Adds a listener that would receive events upon changes of the provider * presence status. * * @param listener the listener to register for changes in our * PresenceStatus. */ public void addProviderPresenceStatusListener( ProviderPresenceStatusListener listener); /** * Unregisters the specified listener so that it does not receive further * events upon changes in local presence status. * * @param listener ProviderPresenceStatusListener */ public void removeProviderPresenceStatusListener( ProviderPresenceStatusListener listener); /** * Registers a listener that would receive a presence status change event * every time a contact, whose status we're subscribed for, changes her * status. Note that, for reasons of simplicity and ease of implementation, * there is only a means of registering such "global" listeners that would * receive updates for status changes for any contact and it is not * currently possible to register such contacts for a single contact or a * subset of contacts. * * @param listener the listener that would received presence status updates * for contacts. */ public void addContactPresenceStatusListener( ContactPresenceStatusListener listener); /** * Removes the specified listener so that it won't receive any further * updates on contact presence status changes * * @param listener the listener to remove. */ public void removeContactPresenceStatusListener( ContactPresenceStatusListener listener); /** * Registers a listener that would get notifications any time a new * subscription was successfully added, has failed or was removed. * * @param listener the SubscriptionListener to register */ public void addSubscriptionListener(SubscriptionListener listener); /** * Removes the specified subscription listener. * * @param listener the listener to remove. */ public void removeSubscriptionListener(SubscriptionListener listener); /** * Returns the status message that was confirmed by the server * * @return the last status message that we have requested and the aim server * has confirmed. */ public String getCurrentStatusMessage(); /** * Creates and returns a unresolved contact from the specified * <tt>address</tt> and <tt>persistentData</tt>. The method will not try to * establish a network connection and resolve the newly created Contact * against the server. The protocol provider may will later try and resolve * the contact. When this happens the corresponding event would notify * interested subscription listeners. * * @param address an identifier of the contact that we'll be creating. * @param persistentData a String returned Contact's getPersistentData() * method during a previous run and that has been persistently * stored locally. * * @return the unresolved <tt>Contact</tt> created from the specified * <tt>address</tt> and <tt>persistentData</tt> */ public Contact createUnresolvedContact(String address, String persistentData); }