/*
* Jicofo, the Jitsi Conference Focus.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jitsi.impl.protocol.xmpp;
import net.java.sip.communicator.impl.protocol.jabber.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.globalstatus.*;
import org.jitsi.protocol.xmpp.*;
import org.jitsi.util.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smackx.muc.*;
import org.jivesoftware.smackx.packet.*;
/**
* Stripped Smack implementation of {@link ChatRoomMember}.
*
* @author Pawel Domas
*/
public class ChatMemberImpl
implements XmppChatMember
{
/**
* The logger.
*/
private final static Logger logger = Logger.getLogger(ChatMemberImpl.class);
/**
* The MUC nickname used by this member.
*/
private final String nickname;
private final ChatRoomImpl chatRoom;
/**
* Full MUC address:
* room_name@muc.server.net/nickname
*/
private final String address;
/**
* Connection Jabber ID used to connect to the service. It is sent in
* MUC presence as jid attribute of item element:
*
* <x xmlns='http://jabber.org/protocol/muc#user'>
* <item affiliation='none'
* jid='hag66@shakespeare.lit/pda'
* role='participant'/>
* </x>
*
* In this example 'hag66@shakespeare.lit/pda' is the jabber ID.
* Note that by default only moderators are allowed to see it for
* all participants(see room configuration form and muc#roomconfig_whois
* for more details).
*/
private String jabberId;
private ChatRoomMemberRole role;
public ChatMemberImpl(String participant, ChatRoomImpl chatRoom)
{
this.address = participant;
this.nickname = participant.substring(participant.lastIndexOf("/")+1);
this.chatRoom = chatRoom;
}
@Override
public ChatRoom getChatRoom()
{
return chatRoom;
}
@Override
public ProtocolProviderService getProtocolProvider()
{
return chatRoom.getParentProvider();
}
@Override
public String getContactAddress()
{
return address;
}
@Override
public String getName()
{
return nickname;
}
@Override
public byte[] getAvatar()
{
return new byte[0];
}
@Override
public Contact getContact()
{
return null;
}
@Override
public ChatRoomMemberRole getRole()
{
if(this.role == null)
{
Occupant o = chatRoom.getOccupant(this);
if(o == null)
return ChatRoomMemberRole.GUEST;
else
this.role = ChatRoomJabberImpl
.smackRoleToScRole(o.getRole(), o.getAffiliation());
}
return this.role;
}
/**
* Reset cached user role so that it will be refreshed when {@link
* #getRole()} is called.
*/
void resetCachedRole()
{
this.role = null;
}
void processPresence(Presence presence)
{
MUCUser mucUser
= (MUCUser) presence.getExtension(
"x", "http://jabber.org/protocol/muc#user");
String jid = mucUser.getItem().getJid();
if (StringUtils.isNullOrEmpty(jabberId))
{
logger.info(Thread.currentThread()+
"JID: " + jid + " received for: " + getContactAddress());
jabberId = mucUser.getItem().getJid();
}
else if(!jid.equals(jabberId))
{
logger.warn(
"Different jid received in presence: " + presence.toXML());
}
}
@Override
public void setRole(ChatRoomMemberRole role)
{
throw new RuntimeException("Not implemented yet.");
}
@Override
public PresenceStatus getPresenceStatus()
{
return GlobalStatusEnum.ONLINE;
}
@Override
public String getJabberID()
{
return jabberId;
}
}