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

📄 bsconfbean.java

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

/*
 * BSConfBean.java
 *
 * Project: BuddySpace
 * (C) Copyright Knowledge Media Institute 2002
 *
 *
 * Created on 12 September 2002, 10:40
 */

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.xml.*;

/**
 * <code>BSConfBean</code> provides conferencing 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 BSConfBean implements BSConfBeanInterface, PacketListener, BSPresenceListener {
    protected MessengerBean msgBean = null;
    protected BSMessengerBean bsMsgBean = null;
    protected IQBean iqBean = null;
    protected BSPresenceBean presenceBean = null;
    protected String name = "Conference";
    protected Hashtable rooms = null;
    protected Vector confListeners = null;
    protected BSConsumerList confConsumers = null;

    /**
     * Constructor
     */
    public BSConfBean() {
        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;
    }

    /**
     * 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 (iqBean == null || presenceBean == null) {
            fireError(roomJID, "", "IQ or presence bean not set");
            BSCore.logEvent(name, "error: IQ or 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);

        // sends first presence into the room
        sendPresence(pi, roomJID);
        // sets my presence in room
        ri.setMyPresence(pi.isOnline(), pi.getShow(), pi.getStatus());

        // sends initial IQ into room
        if (!iqSetupRoom(roomName, roomJID, nick, ri))
            return false;

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

        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;
    }


    /**
     * Sends the initial IQ-set to the room.
     */
    private boolean iqSetupRoom(String roomName, JID roomAddress, String nick,
                             BSConfRoomInfo roomInfo) {

        if (iqBean == null) return false;

        roomInfo.servedID = new String("conf_" + BSCore.getNextID());

        InfoQueryBuilder iqBuilder = new InfoQueryBuilder();
        IQConfBuilder iqConfBuilder = new IQConfBuilder();
        iqConfBuilder.addNick(nick);
        iqConfBuilder.setRoomName(roomName);
        iqConfBuilder.setPrivacy(false);

        try {
            iqBuilder.addExtension(iqConfBuilder.build());
            iqBuilder.setType("set");
            iqBuilder.setIdentifier(roomInfo.servedID);
            iqBuilder.setToAddress(roomAddress);
            //iqBean.send((InfoQuery)iqBuilder.build());

⌨️ 快捷键说明

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