diff --git a/src/net/java/sip/communicator/impl/protocol/gibberish/OperationSetTypingNotificationsGibberishImpl.java b/src/net/java/sip/communicator/impl/protocol/gibberish/OperationSetTypingNotificationsGibberishImpl.java
index 1df1208a3..27577dc51 100644
--- a/src/net/java/sip/communicator/impl/protocol/gibberish/OperationSetTypingNotificationsGibberishImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/gibberish/OperationSetTypingNotificationsGibberishImpl.java
@@ -34,7 +34,13 @@ public class OperationSetTypingNotificationsGibberishImpl
/**
* The provider that created us.
*/
- private ProtocolProviderServiceGibberishImpl gibberishProvider = null;
+ private ProtocolProviderServiceGibberishImpl parentProvider = null;
+
+ /**
+ * The currently valid persistent presence operation set..
+ */
+ private OperationSetPersistentPresenceGibberishImpl opSetPersPresence = null;
+
/**
* Creates a new instance of this operation set and keeps the parent
@@ -43,11 +49,15 @@ public class OperationSetTypingNotificationsGibberishImpl
* @param provider a ref to the ProtocolProviderServiceImpl
* that created us and that we'll use for retrieving the underlying aim
* connection.
+ * @param opSetPersPresence the currently valid
+ * OperationSetPersistentPresenceGibberishImpl instance.
*/
OperationSetTypingNotificationsGibberishImpl(
- ProtocolProviderServiceGibberishImpl provider)
+ ProtocolProviderServiceGibberishImpl provider,
+ OperationSetPersistentPresenceGibberishImpl opSetPersPresence)
{
- this.gibberishProvider = provider;
+ this.parentProvider = provider;
+ this.opSetPersPresence = opSetPersPresence;
}
/**
@@ -129,6 +139,49 @@ private void fireTypingNotificationsEvent(Contact sourceContact
public void sendTypingNotification(Contact notifiedContact, int typingState)
throws IllegalStateException, IllegalArgumentException
{
- this.fireTypingNotificationsEvent(notifiedContact, typingState);
+ String userID = notifiedContact.getAddress();
+
+ //if the user id is owr own id, then this message is being routed to us
+ //from another instance of the gibberish provider.
+ if (userID.equals(this.parentProvider.getAccountID().getUserID()))
+ {
+ //check who is the provider sending the message
+ String sourceUserID = notifiedContact.getProtocolProvider()
+ .getAccountID().getUserID();
+
+ //check whether they are in our contact list
+ Contact from = opSetPersPresence.findContactByID(sourceUserID);
+
+ //and if not - add them there as volatile.
+ if (from == null)
+ {
+ from = opSetPersPresence.createVolatileContact(sourceUserID);
+ }
+
+ //and now fire the message received event.
+ fireTypingNotificationsEvent(from, typingState);
+ }
+ else
+ {
+ //if userID is not our own, try a check whether another provider
+ //has that id and if yes - deliver the message to them.
+ ProtocolProviderServiceGibberishImpl gibberishProvider
+ = this.opSetPersPresence.findProviderForGibberishUserID(userID);
+ if (gibberishProvider != null)
+ {
+ OperationSetTypingNotificationsGibberishImpl opSetTN
+ = (OperationSetTypingNotificationsGibberishImpl)
+ gibberishProvider.getOperationSet(
+ OperationSetTypingNotifications.class);
+ opSetTN.sendTypingNotification(notifiedContact, typingState);
+ }
+ else
+ {
+ //if we got here then "to" is simply someone in our contact
+ //list so let's just echo the message.
+ fireTypingNotificationsEvent(notifiedContact, typingState);
+ }
+ }
}
+
}