📄 bsgroupchatbean.java
字号:
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 + -