Package com.liuyix.xmpp

Source Code of com.liuyix.xmpp.PresenceManager

package com.liuyix.xmpp;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Type;


/*管理全局的所有的用户(包括自己)的Presence,
*功能:可以查询用户(including yourself)Presence
*    可以更新自己的状态信息
*
*
* */

public class PresenceManager implements PresenceListener{

  private Connection connection;
  private HashMap<String,Presence> contactPresences;
  public static final String[] PRESENCE = new String[]{
    "在线",
    "离开",
    "忙碌"
  };
  //存储着所有用户的Presence信息
  //这应该属于RosterManager实现的内容,因为Presence都是联系人发出的。
//  private Map<String,Presence> presences;
 
  public PresenceManager(Connection conn) {
    super();
    if (conn == null || conn.isAuthenticated() != true) {
      Util.printErrMsg("PresenceManager init ERROR:Connection ");
      if (conn == null)
        Util.showErrMsg("NULL");
      else
        Util.showErrMsg("NOT AUTH");
      return;
    }
    // Connection已通过验证
    this.connection = conn;
    //TODO 添加一个监听端口,用于监听所有的Presence消息!
    connection.addPacketListener(new AllPrensenceListener(), new PacketTypeFilter(Presence.class));
    initContactPresences(connection.getRoster().getEntries());
//    initPresences(connection.getRoster().getEntries());

  }


  private void initContactPresences(Collection<RosterEntry> collection) {
    for(RosterEntry entry : collection){
      updatePresence(null, entry.getName());
    }
   
  }


  @Override
  public void updatePresence(Presence presence, String username) {
    //TODO 需要更新
    if(contactPresences == null){
      contactPresences = new HashMap<String,Presence>();
    }
    contactPresences.put(username, presence);
  }
 
  //监听所有的presence信息
  private class AllPrensenceListener implements PacketListener {

    @Override
    public void processPacket(Packet packet) {
      Presence presence = (Presence)packet;
      Util.showPacketInfo("AllPresenceListener", packet);
      updatePresence(presence, Util.getUsername(packet.getFrom()));

    }

  }

  /**
   * 返回指定用户(username)的Presence
   * @param username 用户的username,而不是jid
   * @return 若参数为空,返回Null;否则返回presence
   * */
  public Presence getPresence(String username) {
    if(username == null)
      return null;
    else if(contactPresences.containsKey(username)){
      Presence presence = contactPresences.get(username);
      if(presence == null){
        //TODO 全面更新Presence,不再返回原始的Presence,新建一个新的表达方式
        return new Presence(Type.unavailable, null, -1, null);
      }
      else
        return presence;
    }else{
      //该username不在联系人列表中
      return null;
    }
  }
}
TOP

Related Classes of com.liuyix.xmpp.PresenceManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.