/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.impl.protocol.gibberish;
import net.java.sip.communicator.service.protocol.*;
/**
* Implements typing notifications for the Gibberish protocol. The operation
* set would simply mirror all outgoing typing notifications and make them
* appear as incoming events generated by the contact that we are currently
* writing a message to.
*
* @author Emil Ivov
*/
public class OperationSetTypingNotificationsGibberishImpl
extends AbstractOperationSetTypingNotifications<ProtocolProviderServiceGibberishImpl>
{
/**
* The currently valid persistent presence operation set..
*/
private OperationSetPersistentPresenceGibberishImpl opSetPersPresence = null;
/**
* Creates a new instance of this operation set and keeps the parent
* provider as a reference.
*
* @param provider a ref to the <tt>ProtocolProviderServiceImpl</tt>
* that created us and that we'll use for retrieving the underlying aim
* connection.
* @param opSetPersPresence the currently valid
* <tt>OperationSetPersistentPresenceGibberishImpl</tt> instance.
*/
OperationSetTypingNotificationsGibberishImpl(
ProtocolProviderServiceGibberishImpl provider,
OperationSetPersistentPresenceGibberishImpl opSetPersPresence)
{
super(provider);
this.opSetPersPresence = opSetPersPresence;
}
/**
* Sends a notification to <tt>notifiedContatct</tt> that we have entered
* <tt>typingState</tt>.
*
* @param notifiedContact the <tt>Contact</tt> to notify
* @param typingState the typing state that we have entered.
*
* @throws java.lang.IllegalStateException if the underlying stack is
* not registered and initialized.
* @throws java.lang.IllegalArgumentException if <tt>notifiedContact</tt> is
* not an instance belonging to the underlying implementation.
*/
public void sendTypingNotification(Contact notifiedContact, int typingState)
throws IllegalStateException, IllegalArgumentException
{
if( !(notifiedContact instanceof ContactGibberishImpl) )
throw new IllegalArgumentException(
"The specified contact is not a Gibberish contact."
+ notifiedContact);
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);
}
}
}
}