文章关键字 ‘QQ’

为OpenFire和Spark增加QQTransport–Openfire篇(二)

2008年01月4日,星期五

由于Saprk 和 OpenFire的代码与实际发布的版本中不一致,增加了不少东西,因此直接添加替换文件存在一些问题,所以在此只贴出代码作为记录,不提供打包好的jar文件。如需相关jar,可在此留言,我再打包支持Spark版本2.5.8和OpenFire 3.4.3的相关jar,放到服务器供下载,最重要的QQSession代码如下(目前只实现了基本的普通聊天消息):

[code]

package org.jivesoftware..gateway.protocols.;

import org.apache.log4j.Logger;
import org.jivesoftware.util.Log;
import org.jivesoftware.openfire.gateway.registration.Registration;
import org.jivesoftware.openfire.gateway.roster.TransportBuddy;
import org.jivesoftware.openfire.gateway.session.TransportSession;
import org.jivesoftware.openfire.gateway.type.ChatStateType;
import org.jivesoftware.openfire.gateway.type.PresenceType;
import org.jivesoftware.openfire.gateway.type.TransportLoginStatus;
import org.jivesoftware.openfire.roster.Roster;
import org.jivesoftware.openfire.roster.RosterItem;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.Base64;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.NotFoundException;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Presence;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import edu.tsinghua.lumaqq.qq.QQ;
import edu.tsinghua.lumaqq.qq.QQClient;
import edu.tsinghua.lumaqq.qq.beans.QQUser;
import edu.tsinghua.lumaqq.qq.beans.QQFriend;
import edu.tsinghua.lumaqq.qq.beans.ClusterIM;
import edu.tsinghua.lumaqq.qq.net.PortGateFactory;
import edu.tsinghua.lumaqq.qq.events.IQQListener;
import edu.tsinghua.lumaqq.qq.events.QQEvent;
import java.util.Date;
import edu.tsinghua.lumaqq.qq.packets.in.GetFriendListReplyPacket;
import edu.tsinghua.lumaqq.qq.packets.in.DownloadGroupFriendReplyPacket;
import edu.tsinghua.lumaqq.qq.beans.DownloadFriendEntry;
import edu.tsinghua.lumaqq.qq.beans.ClusterInfo;
import edu.tsinghua.lumaqq.qq.packets.in.ClusterCommandReplyPacket;
import java.util.HashMap;
import edu.tsinghua.lumaqq.qq.packets.in.ReceiveIMPacket;
import java.text.SimpleDateFormat;
import edu.tsinghua.lumaqq.qq.beans.NormalIM;
import edu.tsinghua.lumaqq.qq.packets.in.GetOnlineOpReplyPacket;
import edu.tsinghua.lumaqq.qq.beans.FriendOnlineEntry;
import edu.tsinghua.lumaqq.qq.packets.in.FriendChangeStatusPacket;
/**
*
* <p>Title: QQSession</p>
*
* <p>Description: 感谢Luma</p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author lizongbo
* @version 1.0
*/
public class QQSession extends TransportSession implements IQQListener {
private QQClient qqclient;
private QQUser qquser;

private final String udpServerList[] = {"219.133.60.36",
"219.133.49.171",
"sz2.tencent.com", // 61.144.238.146
"sz3.tencent.com", // 202.104.129.251
"sz4.tencent.com", // 202.104.129.254
"sz5.tencent.com", // 61.141.194.203
"sz6.tencent.com", // 202.104.129.252
"sz7.tencent.com", // 202.104.129.253
};
public QQSession(Registration registration, JID jid,
QQTransport transport, Integer priority) {
super(registration, jid, transport, priority);
Log.debug("Creating QQ session for " + registration.getUsername());
qquser = new QQUser(Integer.parseInt(registration.getUsername()),
registration.getPassword());
qquser.setStatus(QQ.QQ_LOGIN_MODE_NORMAL);
qquser.setUdp(true);
qquser.setShowFakeCam(false);
qqclient = new QQClient();
qqclient.setUser(qquser);
qqclient.setConnectionPoolFactory(new PortGateFactory());

}

public void updateStatus(PresenceType presenceType, String string) {
if (isLoggedIn()) {
try {
qquser.setStatus(((QQTransport) getTransport()).
convertJabStatusToQQ(presenceType));
//qqclient.sendPacket(null);
} catch (IllegalStateException e) {
}
}

}

public void addContact(JID jID, String string, ArrayList arrayList) {

System.out.println(jID + "  " + string + "  " + arrayList);

}

public void removeContact(TransportBuddy transportBuddy) {
System.out.println("removeContact");
}

public void updateContact(TransportBuddy transportBuddy) {
System.out.println("transportBuddy");
}

public void sendMessage(JID jID, String message) {
System.out.println("发送消息到:" + jID + " 内容为:" + message);
int qqNum = Integer.parseInt(getTransport().convertJIDToID(jID));
qqclient.sendIM(qqNum, message.getBytes());

}

public void sendChatState(JID jID, ChatStateType chatStateType) {
System.out.println("sendChatState" + jID + " " + chatStateType);
}

public void sendBuzzNotification(JID jID, String string) {
System.out.println("sendBuzzNotification" + jID + " " + string);
}

public void logIn(PresenceType presenceType, String string) {
if (!this.isLoggedIn()) {
try {
Log.debug("Logging in to QQ session for " + qquser.getQQ());
setLoginStatus(TransportLoginStatus.LOGGING_IN);
qqclient.addQQListener(this); //注册事件监听器
//                String qqserver = "219.133.60.36";
String qqserver = udpServerList[(int) Math.round(Math.random() *
udpServerList.length)];
qqclient.setLoginServer(qqserver);
// qqclient.setLoginServer("sz4.tencent.com");
System.out.println("开始登陆 " + qqclient.getUser().getQQ() + " 到 " +
qqserver);
qqclient.login();

} catch (Exception e) {
Log.error("QQ user is not able to log in: " + qquser.getQQ(), e);
}
}
}

public void logOut() {
System.out.println("退出");
setLoginStatus(TransportLoginStatus.LOGGING_OUT);
qqclient.logout();
Presence p = new Presence(Presence.Type.unavailable);
p.setTo(getJID()); //qq图标显示为离线状态
p.setFrom(getTransport().getJID());
getTransport().sendPacket(p);
setLoginStatus(TransportLoginStatus.LOGGED_OUT);

}

public void cleanUp() {
}

public void updateLegacyAvatar(String string, byte[] byteArray) {
}

public QQClient getQqclient() {
return qqclient;
}

public QQUser getQquser() {
return qquser;
}

public void qqEvent(QQEvent e) {
System.out.println(" qq事件: " + e.type + " " + e.getSource());
switch (e.type) {
case QQEvent.QQ_LOGIN_SUCCESS:
System.out.println("登陆成功, 等待状态改变.");
getRegistration().setLastLogin(new Date());
setLoginStatus(TransportLoginStatus.LOGGED_IN);
break;
case QQEvent.QQ_LOGIN_FAIL:
setLoginStatus(TransportLoginStatus.LOGGING_OUT);
case QQEvent.QQ_LOGIN_REDIRECT_NULL:
case QQEvent.QQ_LOGIN_UNKNOWN_ERROR:
System.out.println(qqclient.getUser().getQQ() +
"登陆失败,退出.");
qqclient.logout();
break;
case QQEvent.QQ_CHANGE_STATUS_SUCCESS:
System.out.println("改变状态完成.");
Presence p = new Presence();
p.setTo(getJID());
p.setFrom(getTransport().getJID());
p.setStatus("空闲"); //将Spark里的qq图标显示为在线状态
getTransport().sendPacket(p);
qqclient.downloadGroup();
qqclient.getFriendList();
qqclient.downloadFriend(0);
break;
case QQEvent.QQ_CHANGE_STATUS_FAIL:
System.out.println("改变状态失败.");
break;
case QQEvent.QQ_GET_FRIEND_LIST_SUCCESS:
processFriendList(e);
break;
case QQEvent.QQ_DOWNLOAD_GROUP_FRIEND_SUCCESS:
processGroupFriend(e);
break;
case QQEvent.QQ_DOWNLOAD_GROUP_FRIEND_FAIL:
System.out.println("下载好友分组失败, 注销!");
qqclient.logout();
break;
case QQEvent.QQ_GET_CLUSTER_INFO_SUCCESS:
processClusterInfo(e);
break;
case QQEvent.QQ_GET_CLUSTER_INFO_FAIL:
System.out.println("得到群信息错误. 注销!");
qqclient.logout();
break;
case QQEvent.QQ_GET_MEMBER_INFO_SUCCESS:
processMemberInfo(e);
break;
case QQEvent.QQ_GET_MEMBER_INFO_FAIL:
System.out.println("得到成员信息错误. 注销!");
qqclient.logout();
break;
case QQEvent.QQ_RECEIVE_CLUSTER_IM:
processClusterIM(e);
break;
case QQEvent.QQ_RECEIVE_NORMAL_IM:
processNormalIM(e);
break;
case QQEvent.QQ_CONNECTION_BROKEN:
System.out.println("连接被打断, 重新连接...");
try {
qqclient.login();
} catch (Exception ex) {
ex.printStackTrace();
}
break
;
case QQEvent.QQ_CONNECTION_LOST:
System.out.println("连接被丢失, 重新连接...");
try {
qqclient.login();
} catch (Exception ex) {
ex.printStackTrace();
}
break
;
case QQEvent.QQ_OPERATION_TIMEOUT:
qqclient.logout();
break;
case QQEvent.QQ_GET_FRIEND_ONLINE_SUCCESS:
processFriendOnline(e);
break;
case QQEvent.QQ_FRIEND_CHANGE_STATUS:
processFriendChangeStatus(e);
break;
case QQEvent.QQ_GET_USER_INFO_SUCCESS:
break;
case QQEvent.QQ_GET_WEATHER_SUCCESS:
break;
case QQEvent.QQ_GET_WEATHER_FAIL:

//回复包里面没有有用信息,所以不处理了
break;
case QQEvent.QQ_GET_SIGNATURE_SUCCESS:
break;
case QQEvent.QQ_GET_SIGNATURE_FAIL:
break;
case QQEvent.QQ_RECEIVE_SYS_MESSAGE:
System.out.println("QQ系统广播,不理它");
break;
default:
System.out.println("未知消息" + e.type + ",不理睬");
}

}

//处理好友名单
private void processFriendList(QQEvent e) {
try {
GetFriendListReplyPacket p =
(GetFriendListReplyPacket) e.getSource();
this.getBuddyManager().activate();
List<TransportBuddy> legacyusers = new ArrayList<TransportBuddy>();
for (QQFriend f : p.friends) {
System.out.println("处理好友名单 processFriendList " + f.qqNum + " " +
f.nick);
TransportBuddy tb = new TransportBuddy(getBuddyManager(),
f.qqNum + "", f.nick, null);
legacyusers.add(tb);
this.getBuddyManager().storeBuddy(tb);
}
if (p.position != 0xFFFF) {
getQqclient().getFriendList(p.position);
} else {
//                getTransport().syncLegacyRoster(getJID(),
//                                                legacyusers);
System.out.println("获取好友列表完成.");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processGroupFriend(QQEvent e) {
try {
DownloadGroupFriendReplyPacket p =
(DownloadGroupFriendReplyPacket) e.getSource();
for (DownloadFriendEntry entry : p.friends) {
if (entry.isCluster()) {
getQqclient().getClusterInfo(entry.qqNum);
}
}
if (p.beginFrom != 0) {
getQqclient().downloadFriend(p.beginFrom);
} else {
System.out.println("下载好友分组完成.");
//下载好友分组完成,继续下载在线好友列表
getQqclient().getFriendOnline();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processClusterInfo(QQEvent e) {
try {
ClusterCommandReplyPacket p = (ClusterCommandReplyPacket) e.
getSource();
ClusterInfo info = p.info;
//p.description,p.notice两个字段用在info中
// 如果是固定群,externalId表示外部ID,如果是临时群,这个表示父群ID
//clusters.put(info.externalId, info.name);
//保存外部ID到内部ID的索引
//clustersIn.put(info.externalId, info.clusterId);
//p.members字段为群成员列表,元素类型为Integer,包含了成员的QQ号
getQqclient().getClusterMemberInfo(info.clusterId,
p.members);
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processMemberInfo(QQEvent e) {
try {
ClusterCommandReplyPacket p = (ClusterCommandReplyPacket) e.
getSource();
HashMap<Integer, String> temp = new HashMap<Integer, String>();
List<TransportBuddy> legacyusers = new ArrayList<TransportBuddy>();
for (Object obj : p.memberInfos) {
QQFriend m = (QQFriend) obj;
//群信息全部保存到一个临时hash表
System.out.println("获取好友信息 processMemberInfo " + m.qqNum + " " +
m.nick);
legacyusers.add(new TransportBuddy(getBuddyManager(),
m.qqNum + "", m.nick, null));
TransportBuddy tb = new TransportBuddy(getBuddyManager(),
m.qqNum + "", m.nick, null);
this.getBuddyManager().storeBuddy(tb);

// temp.put(m.qqNum, m.nick);
//保存一个全部群成员的hash表
//membersAll.put(m.qqNum,m.nick);
}
//            getTransport().syncLegacyRoster(getJID(),
//                                            legacyusers);

//                if(membersIndex.containsKey(p.clusterId)){
//                    //如果外表中已经含有同样的群号键值,则先取出来,放到上面的temp表中
//                    for (Map.Entry<Integer, String> entry
//                        : membersIndex.get(p.clusterId).entrySet()){
//                        temp.put(entry.getKey(),entry.getValue());
//                    }
//                    //然后再把temp表保存到外表中
//                    membersIndex.put(p.clusterId,temp);
//                }else{
//                    //没有键值就直接往里面压
//                    membersIndex.put(p.clusterId,temp);
//                }
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processClusterIM(QQEvent e) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
ReceiveIMPacket p = (ReceiveIMPacket) e.getSource();
ClusterIM im = p.clusterIM;
String sDate = sdf.format(new Date(im.sendTime));
} catch (Exception ex) {
ex.printStackTrace();
}
}

//处理普通消息
private void processNormalIM(QQEvent e) {
try {
ReceiveIMPacket p = (ReceiveIMPacket) e.getSource();
NormalIM im = p.normalIM;
Message m = new Message();
m.setType(Message.Type.chat);
m.setTo(getJIDWithHighestPriority());
m.setFrom(getTransport().convertIDToJID("" +
p.normalHeader.sender));
String b = " ";
try {
b = new String(im.messageBytes);
} catch (Exception ex) {
ex.printStackTrace();
}
m.setBody(b);
// System.out.println("消息为:" + m);
getTransport().sendPacket(m);
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processFriendOnline(QQEvent e) {
try {
GetOnlineOpReplyPacket p =
(GetOnlineOpReplyPacket) e.getSource();
for (FriendOnlineEntry f : p.onlineFriends) {
System.out.println("下载在线好友 " + f.status.qqNum);
System.out.println("发送" + f.status.qqNum + " 的在线状态");
Presence pp = new Presence();
pp.setFrom(this.getTransport().convertIDToJID("" +
f.status.qqNum));
pp.setTo(this.getJID());
pp.setShow(Presence.Show.chat);
System.out.println(pp.toXML());
this.getTransport().sendPacket(pp);
}
if (!p.finished) {
getQqclient().getFriendOnline(p.position);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

private void processFriendChangeStatus(QQEvent e) {
try {
FriendChangeStatusPacket p =
(FriendChangeStatusPacket) e.getSource();
System.out.print(p.friendQQ + " 改变状态为" + p.status + ">");
Presence pp = new Presence();
pp.setFrom(this.getTransport().convertIDToJID("" + p.friendQQ));
pp.setTo(this.getJID());
((QQTransport)this.getTransport()).setUpPresencePacket(pp, p.status);
System.out.println(pp.toXML());
this.getTransport().sendPacket(pp);

} catch (Exception ex) {
ex.printStackTrace();
}
}
}
[/code]

Tags: , ,

为 OpenFire和Spark增加QQTransport–Openfire篇(一)

2008年01月3日,星期四

在OpenFire中增加QQSession和QQTransport。使用lumaQQ作为底层lib。

1.首先在org.jivesoftware..gateway.type.TransportType.java中增加一项 .

/**
* A gateway to other QQ servers.
*/
qq

2.

D:\Java\openfire\plugins\gateway\i18n\gateway_i18n.properties
增加内容:

# qq Transport
gateway.qq.shortservice=qq
gateway.qq.service=qq Messenger
gateway.qq.name=qq Transport
gateway.qq.username=QQ No
gateway.qq.password=Password
gateway.qq.registration=Please enter your qq No address and password.
gateway.qq.passwordincorrect=The password you registered with is incorrect.  Please re-register with the correct password.
gateway.qq.sendmsgfailed=Unable to send qq message.  Reason:
gateway.qq.illegalaccount=You are registered with the qq transport with an illegal account name.\nThe account name should look like an email address.\nYou registered as:
gateway.qq.disconnect=You were disconnected from the qq service.
gateway.qq.wink=You have received an qq wink.
gateway.qq.nudge=You have received an qq nudge.
gateway.qq.otherloggedin=You were disconnected from qq because your account signed in at another location.
gateway.qq.mail=You have received a new e-mail message from {0} < {1}>.\nSubject: {2}

3.修改org.jivesoftware.openfire.gateway.GatewayPlugin.java的initializePlugin方法
增加下面的代码:
[code]
/* Set up qq transport. */
transports.put("qq",
new TransportInstance(TransportType.qq,
LocaleUtils.
getLocalizedString(
"gateway.qq.name",
"gateway"),
"org.jivesoftware.openfire.gateway.protocols.qq.QQTransport",
componentManager, sessionRouter));

transports.get("qq").enable();
maybeStartService("qq");
[/code]

4.QQTransport.java的代码为:
[code]
package org.jivesoftware.openfire.gateway.protocols.qq;

import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.openfire.gateway.*;
import org.jivesoftware.openfire.gateway.type.PresenceType;
import org.jivesoftware.openfire.gateway.type.TransportLoginStatus;
import org.jivesoftware.openfire.gateway.registration.Registration;
import org.jivesoftware.openfire.gateway.session.TransportSession;
import org.xmpp.packet.JID;
import org.xmpp.packet.Presence;
import edu.tsinghua.lumaqq.qq.QQ;

public class QQTransport extends BaseTransport {
/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#getTerminologyUsername()
*/
public String getTerminologyUsername() {
return LocaleUtils.getLocalizedString("gateway.qq.username", "gateway");
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#getTerminologyPassword()
*/
public String getTerminologyPassword() {
return LocaleUtils.getLocalizedString("gateway.qq.password", "gateway");
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#getTerminologyNickname()
*/
public String getTerminologyNickname() {
return null;
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#getTerminologyRegistration()
*/
public String getTerminologyRegistration() {
return LocaleUtils.getLocalizedString("gateway.qq.registration",
"gateway");
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#isPasswordRequired()
*/
public Boolean isPasswordRequired() {
return true;
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#isNicknameRequired()
*/
public Boolean isNicknameRequired() {
return false;
}

/**
* @see org.jivesoftware.openfire.gateway.BaseTransport#isUsernameValid(String)
*/
public Boolean isUsernameValid(String username) {
try {
Integer.parseInt(username);
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}

/**
* Handles creating a QQ session and triggering a login.
*
* @param registration Registration information to be used to log in.
* @param jid JID that is logged into the transport.
* @param presenceType Type of presence.
* @param verboseStatus Longer status description.
*/
public TransportSession registrationLoggedIn(Registration registration,
JID jid,
PresenceType presenceType,
String verboseStatus,
Integer priority) {
TransportSession session = new QQSession(registration, jid, this,
priority);
session.setLoginStatus(TransportLoginStatus.LOGGING_IN);
session.logIn(presenceType, verboseStatus);
return session;
}

/**
* Handles logging out of a QQ session.
*
* @param session The session to be disconnected.
*/
public void registrationLoggedOut(TransportSession session) {
session.setLoginStatus(TransportLoginStatus.LOGGING_OUT);
session.logOut();
session.setLoginStatus(TransportLoginStatus.LOGGED_OUT);
}

/**
* Converts a jabber status to an QQ status.
*
* @param jabStatus Jabber presence type.
* @return QQ user status id.
*/
public byte convertJabStatusToQQ(PresenceType jabStatus) {
if (jabStatus == PresenceType.available) {
return QQ.QQ_STATUS_ONLINE;
} else if (jabStatus == PresenceType.away) {
return QQ.QQ_STATUS_AWAY;
} else if (jabStatus == PresenceType.xa) {
return QQ.QQ_STATUS_AWAY;
} else if (jabStatus == PresenceType.dnd) {
return QQ.QQ_STATUS_AWAY;
} else if (jabStatus == PresenceType.chat) {
return QQ.QQ_STATUS_ONLINE;
} else if (jabStatus == PresenceType.unavailable) {
return QQ.QQ_STATUS_OFFLINE;
} else {
return QQ.QQ_STATUS_ONLINE;
}
}

/**
* Sets up a presence packet according to QQ status.
*
* @param QQStatus QQ ContactStatus constant.
* @param packet Presence packet to set up.
*/
public void setUpPresencePacket(Presence packet, byte qqStatus) {
switch (qqStatus) {
case QQ.QQ_STATUS_AWAY:
packet.setShow(Presence.Show.chat);
break;
case QQ.QQ_STATUS_HIDDEN:
packet.setShow(Presence.Show.xa);
break;
case QQ.QQ_STATUS_OFFLINE:
packet.setType(Presence.Type.unavailable);
break;
case QQ.QQ_STATUS_ONLINE:
packet.setShow(Presence.Show.chat);
break;
default:
packet.setShow(Presence.Show.chat);
break;
}
}

}

[/code]
新修改的代码是在Openfire 3.4.3的源代码上写的,老的代码可参考: http://lizongbo.googlepages.com/qq_src

Tags: , ,

为 OpenFire和Spark增加QQTransport–Spark篇

2008年01月2日,星期三

假期温习了一下openfire和以前写的QQTransport,

又调用lumaQQ写了点代码,在spark和openfire中实现支持qq的gateway,经过测试可用。

首先,下载了OpenFire和Spark的源代码:

http://www.igniterealtime.org/downloadServlet?filename=openfire/_src_3_4_3.zip

svn方式下载:
Openfire:
svn co http://svn.igniterealtime.org/svn/repos/openfire/trunk openfire
:
svn co http://svn.igniterealtime.org/svn/repos/spark/trunk spark
Smack:
svn co http://svn.igniterealtime.org/svn/repos/smack/trunk smack
Asterisk-IM:
svn co http://svn.igniterealtime.org/svn/repos/asterisk-im/trunk asterisk-im

svn客户端:

http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe

a.Saprk中,需要修改的地方有:

1.首先找到qq在线和离线的图标:

在线: http://is.qq.com/webpresence/help/help_clip_image007.gif
离线:http://is.qq.com/webpresence/help/help_clip_image008.gif

图标来源:http://is.qq.com/webpresence/help/help.shtml

2.定义资源信息常量和相关字符串信息,
尽量不改动原有代码,因此把扩展的代码写的比较丑。

3.修改org.jivesoftware.sparkimpl.plugin.gateways.GatewayPlugin.java里的

populateTransports方法。

增加:

import com.lizongbo.spark.plugin.gateways.transports.QQTransport;

else if (entityName.endsWith(“.”)) {
QQTransport qqTransport = new QQTransport(item.getEntityID());
TransportUtils.addTransport(item.getEntityID(), qqTransport);
}

4.QQTransport的代码:

[code]

package com.lizongbo.spark.plugin.gateways.transports;

import java.net.URL;
import org.jivesoftware.resource.Res;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.jivesoftware.sparkimpl.plugin.gateways.transports.*;

public class QQTransport implements Transport {
//   public static final String QQ_TRANSPORT_ACTIVE_IMAGE =
//           "QQ_TRANSPORT_ACTIVE_IMAGE";
//   public static final String QQ_TRANSPORT_INACTIVE_IMAGE =
//           "QQ_TRANSPORT_INACTIVE_IMAGE";

org.jivesoftware.sparkimpl.plugin.gateways.GatewayPlugin gg;
org.jivesoftware.spark.SparkManager gga;
private String serviceName;

public QQTransport(String serviceName) {
this.serviceName = serviceName;
System.out.println(this.getIcon()); ;
System.out.println(this.getInactiveIcon());

}

public String getTitle() {
return "QQ 账户凭证";
//  return Res.getString("title.qq.registration");
}

public String getInstructions() {
return "请输入你的QQ号码和密码。";
// return Res.getString("message.enter.qq");
}

public Icon getIcon() {
final String iconURI = "/images/qq_online.gif";
try {
final URL imageURL = //getClass().getClassLoader().
//getSystemClassLoader().getResource(
getClass().getResource(iconURI);
return new ImageIcon(imageURL);
} catch (Exception ex) {
System.out.println(iconURI + " not found.");
}
return null;
//return SparkRes.getImageIcon(QQ_TRANSPORT_ACTIVE_IMAGE);
}

public Icon getInactiveIcon() {
final String iconURI = "/images/qq_offline.gif";
try {
final URL imageURL = //Thread.class.getClassLoader().
// getSystemClassLoader()
getClass().getResource(
iconURI);
return new ImageIcon(imageURL);
} catch (Exception ex) {
System.out.println(iconURI + " not found.");
}
return null;
//return SparkRes.getImageIcon(QQ_TRANSPORT_INACTIVE_IMAGE);
}

public String getServiceName() {
return serviceName;
}

public String getName() {
return "QQ";
}

public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}

public Boolean requiresUsername() {
return true;
}

public Boolean requiresPassword() {
return true;
}

public Boolean requiresNickname() {
return false;
}

}
[/code]

4.打包文件。

将新增文件打包到qqransport.jar,
替换修改后的GatewayPlugin.class

Tags: , ,