⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsgroupchatbean.java

📁 一款即时通讯软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package edu.ou.kmi.buddyspace.plugins.groupchat.core;

/*
 * BSGroupchatBean.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2004
 *
 *
 * Created on 5 March 2004, 14:39
 */

import java.util.*;
import javax.swing.*;

import org.jabber.jabberbeans.*;
import org.jabber.jabberbeans.util.*;
import org.jabber.jabberbeans.Extension.*;

import edu.ou.kmi.buddyspace.core.*;
import edu.ou.kmi.buddyspace.plugins.conference.*;
import edu.ou.kmi.buddyspace.plugins.conference.core.*;

/**
 * <code>BSGroupchatBean</code> provides groupchat handling.
 * It relies on <code>BSConnectionBean</code>, which must be set after each
 * reconnection.
 *
 * @author  Jiri Komzak, Knowledge Media Institute, Open University, United Kingdom
 */
public class BSGroupchatBean implements BSConfBeanInterface, PacketListener, BSPresenceListener {
    protected MessengerBean msgBean = null;
    protected BSMessengerBean bsMsgBean = null;
    //protected IQBean iqBean = null;
    protected BSPresenceBean presenceBean = null;
    protected String name = "Groupchat";
    protected Hashtable rooms = null;
    protected Vector confListeners = null;
    protected BSConsumerList confConsumers = null;

    /**
     * Constructor
     */
    public BSGroupchatBean() {
        rooms = new Hashtable();
        confListeners = new Vector();
        confConsumers = new BSConsumerList(1);
    }

    /**
     * Sets existing and connected <code>IQBean</code>.
     * Then this is registered as listener for IQ packets.
     */
    public void setIQBean(IQBean iqBean) {
        /*if (this.iqBean != null)
            this.iqBean.delPacketListener(this);
        this.iqBean = iqBean;
        if (iqBean != null)
            iqBean.addPacketListener(this);*/
    }

    /**
     * Sets existing and connected <code>MessengerBean</code>.
     * Then this is registered as listener for message packets.
     */
    public void setMessengerBean(BSMessengerBean bsMsgBean) {
        this.bsMsgBean = bsMsgBean;
        if (this.msgBean != null)
            this.msgBean.delPacketListener(this);
        if (bsMsgBean != null)
            msgBean = bsMsgBean.getMessengerBean();
        else
            msgBean = null;
        if (msgBean != null)
            msgBean.addPacketListener(this);
    }

    /**
     * Sets existing and connected <code>BSPresenceBean</code>.
     * Then this is registered as listener for presence events.
     */
    public void setPresenceBean(BSPresenceBean presenceBean) {
        if (this.presenceBean != null)
            this.presenceBean.removePresenceListener(this);
        this.presenceBean = presenceBean;
        if (presenceBean != null)
            presenceBean.addPresenceListener(this);
    }

    /**
     * Returns currently used <code>IQBean</code>.
     */
    public IQBean getIQBean() {
        //return iqBean;
        return null;
    }

    /**
     * Returns currently used <code>MessengerBean</code>.
     */
    public MessengerBean getMessengerBean() {
        return msgBean;
    }

    /**
     * Returns currently used <code>BSPresenceBean</code>.
     */
    public BSPresenceBean getPresenceBean() {
        return presenceBean;
    }

    /**
     * Called when disconneted.
     */
    public void disconnected() {
        if (rooms != null)
            rooms.clear();
    }

    /**
     * Frees all object bindings to allow object destroy
     */
    public void prepareToDestroy() {
        removeAllConfListeners();
        msgBean = null;
        //iqBean = null;
        if (presenceBean != null) {
            presenceBean.removePresenceListener(this);
            presenceBean = null;
        }
    }

    /**
     * Creates or joins a conference room.
     */
    public boolean createRoom(String roomName, String server, String nick) {
        JID roomJID = new JID(roomName, server, null);

        if (presenceBean == null) {
            fireError(roomJID, "", "Presence bean not set");
            BSCore.logEvent(name, "error: presence bean not set");
            return false;
        }

        BSPresenceInfo pi = new BSPresenceInfo(null, true, null, null);

        // creates room info
        BSConfRoomInfo ri = new BSConfRoomInfo(roomJID);
        //String str = BSPresenceBean.getJIDHashString(roomJID, false);
        JID key = roomJID.getSimpleJID();
        //if (rooms.get(str.toLowerCase()) != null) {
        if (rooms.get(key) != null) {
            fireError(roomJID, "", "already in room");
            BSCore.logEvent(name, "warning: already in room - cancelling");
            return false;
        }
        //rooms.put(str.toLowerCase(), ri);
        rooms.put(key, ri);

        JID myChatJID = new JID(roomJID.getUsername(), roomJID.getServer(), nick);
        // sends first presence into the room
        sendPresence(pi, myChatJID);
        // sets my presence in room
        ri.setMyPresence(pi.isOnline(), pi.getShow(), pi.getStatus());

        // blocks messages in messengerBean - everything will be handled in here
        if (bsMsgBean != null) {
            //bsMsgBean.startBlocking(roomJID);
            bsMsgBean.startBlockingGroupChat();
        }

        ri.setRoomName(roomName);
        ri.setMyJID(myChatJID);
        fireSetMyJID(roomJID, myChatJID);

        return true;
    }

    /** Sends presence to the jid (room) */
    public void sendPresence(BSPresenceInfo pi, JID roomAddress) {
        if (presenceBean != null) {
            presenceBean.sendPresence(pi, roomAddress);
        }
    }


    /** Leaves the room */
    public void leaveRoom(JID roomJID) {
        //String str = BSPresenceBean.getJIDHashString(roomJID, false);
        JID key = roomJID.getSimpleJID();
        //BSConfRoomInfo ri = (BSConfRoomInfo) rooms.remove(str.toLowerCase());
        BSConfRoomInfo ri = (BSConfRoomInfo) rooms.remove(key);
        if (ri != null) {
            //if (ri.state == BSConfRoomInfo.LOGGED ||
            //    ri.state == BSConfRoomInfo.LOGGING2) {
                sendPresence(new BSPresenceInfo(null, false, null, null), roomJID);
            //}
            return;
        }
        if (bsMsgBean != null) {
            //bsMsgBean.stopBlocking(roomJID);
            bsMsgBean.stopBlockingGroupChat();
        }
    }

    /**
     * Sends message to the room.
     * @param roomAddress is JID of room
     * @param body is body of message
     */
    public boolean sendMessage(JID roomAddress, String body) {
        if (msgBean == null || roomAddress == null) {
            fireError(roomAddress, "", "cannot send message");
            return false;
        }

        MessageBuilder msgBuilder = new MessageBuilder();
        if (body != null)
            msgBuilder.setBody(body);
        msgBuilder.setToAddress(roomAddress);
        msgBuilder.setType("groupchat");
        try {
            //msgBean.send((Message)msgBuilder.build());
            msgBean.getConnection().send(msgBuilder.build());
        } catch (InstantiationException e) {
            BSCore.logEvent(name, "error: message builder failed");
            fireError(roomAddress, "", "message builder failed");
            return false;
        }
        return true;
    }


    /**
     * Sends message with URL into the room.
     * @param roomAddress is JID of room
     * @param body is body of message
     * @param url is URL
     * @param urlDesc is description of URL
     */
    public Message sendURLMessage(JID roomAddress, String body, String url, String urlDesc) {
        if (msgBean == null || roomAddress == null) {
            fireError(roomAddress, "", "cannot send message");
            return null;
        }

        MessageBuilder msgBuilder = new MessageBuilder();
        if (body != null)
            msgBuilder.setBody(body);
        msgBuilder.setToAddress(roomAddress);
        msgBuilder.setType("groupchat");

        OOBBuilder oobBuilder = new OOBBuilder();
        oobBuilder.setURL(url);
        oobBuilder.setDescription(urlDesc);
        oobBuilder.setIQ(false);

        msgBuilder.addExtension(oobBuilder.build());

        Message msg;
        try {
            msg = (Message) msgBuilder.build();
            //msgBean.send((Message)msgBuilder.build());
            msgBean.getConnection().send(msg);
        } catch (InstantiationException e) {
            BSCore.logEvent(name, "error: message builder failed");
            fireError(roomAddress, "", "message builder failed");
            return null;
        }
        return msg;
    }


    /**
     * Invoked when a message or iq packet is received.
     */
    public void receivedPacket(PacketEvent pe) {

        if (pe.getPacket() instanceof Message) {
            Message msg = (Message) pe.getPacket();
            handleMessage(msg);
            return;
        }

        else if (pe.getPacket() instanceof InfoQuery) {
            InfoQuery iq = (InfoQuery) pe.getPacket();
            //handleInfoQuery(iq);
            return;
        }

        else {
            //BSCore.logEvent(name, "warning: non-map packet received");
            return;
        }
    }


    /** Handles received IQ packet */
    /*private void handleInfoQuery(InfoQuery iq) {
        JID roomJID = iq.getFromAddress();
        String type = iq.getType();

        if (type == null) {
            fireError(roomJID, "", "IQ packet without type");
            BSCore.logEvent(name, "error: IQ packet without type");
            return;
        }

        // gets room info for given roomJID
        //String str = BSPresenceBean.getJIDHashString(roomJID, false);
        JID key = roomJID.getSimpleJID();
        //BSConfRoomInfo ri = (BSConfRoomInfo) rooms.get(str.toLowerCase());
        BSConfRoomInfo ri = (BSConfRoomInfo) rooms.get(key);

        if (ri == null) return;

        if (type.equals("result"))
            handleIQResult(iq, ri);
        else if (type.equals("set"))
            handleIQSet(iq, ri);
        else if (type.equals("error"))
            handleIQError(iq, ri);
        else if (type.equals("get"))
            ;//handleIQGet(iq, ri);
        else {
            fireError(roomJID, "", "IQ packet with unknown type");
            BSCore.logEvent(name, "error: IQ packet with unknown type");
        }
    }*/

    /** Handles IQ error */
    /*private void handleIQError(InfoQuery iq, BSConfRoomInfo ri) {
        if (ri.state == BSConfRoomInfo.LOGGING2)
            ri.setState(BSConfRoomInfo.NOT_LOGGED);

        fireError(ri.roomJID, iq.getErrorCode(), iq.getErrorText());
    }*/

    /** Handles received message */
    private void handleMessage(Message msg) {
        maybeHandleInvitation(msg);

        // gets room info for JID room
        JID jid = msg.getFromAddress();
        //String str = BSPresenceBean.getJIDHashString(jid, false);
        JID key = jid.getSimpleJID();
        //BSConfRoomInfo ri = (BSConfRoomInfo) rooms.get(str.toLowerCase());
        BSConfRoomInfo ri = (BSConfRoomInfo) rooms.get(key);

        if (ri == null) return;

        String type = msg.getType();
        if (type != null && type.equals("error")) {
            //fireError(ri.roomJID, msg.getErrorCode(), msg.getErrorText());
        }

        else {
            handleGroupchatMsg(msg, ri);
        }
    }

    // handles message to the room
    private void handleGroupchatMsg(Message msg, BSConfRoomInfo ri) {
        JID jid = msg.getFromAddress();
        //String str = BSPresenceBean.getJIDHashString(jid, true);
        //String nick = (String) ri.nicks.get(str);
        String nick = (String) ri.nicks.get(jid);
        if (nick == null) nick = jid.getResource();

        String type = msg.getType();
        // if message to the room
        if (type != null && type.equals("groupchat")) {
            if (nick != null)
                fireGroupMessage(jid, nick, msg.getBody());
            else
                fireRoomMessage(jid, msg.getBody());
        }
        else {
            if (type == null || type.equals(""))
                type = new String("msg");
            // if message from room
            if (nick != null)
                firePrivateMessage(jid, nick, msg.getBody());
            // else private message
            else
                firePrivateMessage(jid, "[room]", msg.getBody());
        }
    }

    /** Tries to handle message as invitation */
    private void maybeHandleInvitation(Message msg) {
        String type = msg.getType();
        if (type != null && !type.equals("")) return;

        Enumeration exts = msg.Extensions();
        while (exts.hasMoreElements()) {
            Extension e = (Extension) exts.nextElement();
            if (e instanceof XConference) {
                JID roomJID = ((XConference) e).getAddress();
                fireInvitation(msg.getFromAddress(), roomJID, msg.getSubject(), msg.getBody());
            }
        }
    }

    /** Handles IQ result */
    /*private void handleIQResult(InfoQuery iq, BSConfRoomInfo ri) {
        String id = iq.getIdentifier();

        if (ri.state == BSConfRoomInfo.LOGGING2 &&
            ri.servedID != null && ri.servedID.equals(id)) {
                setLogged(iq, ri);
        }
        else if (ri.state == BSConfRoomInfo.CHANGING_NICK &&
            ri.servedID != null && ri.servedID.equals(id)) {
                //setNickChanged(iq, ri);
        }
        else {
            //fireError(ri.roomJID, "", "unexpected IQ result");
            //BSCore.logEvent(name, "warning: unexpected IQ result");
        }
    }*/

    /** Handles IQ set */
    /*private void handleIQSet(InfoQuery iq, BSConfRoomInfo ri) {
        Enumeration exts = iq.Extensions();

        // for all extensions
        while (exts.hasMoreElements()) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -