oscarsession.java
来自「基于Jabber协议的即时消息服务器」· Java 代码 · 共 493 行 · 第 1/2 页
JAVA
493 行
// Syncing takes care of all of the dirty work.
syncContactGroupsAndNickname(legacyId, nickname, item.getGroups());
}
/**
* @see org.jivesoftware.wildfire.gateway.TransportSession#sendMessage(org.xmpp.packet.JID, String)
*/
public void sendMessage(JID jid, String message) {
request(new SendImIcbm(getTransport().convertJIDToID(jid), message));
}
/**
* @see org.jivesoftware.wildfire.gateway.TransportSession#sendServerMessage(String)
*/
public void sendServerMessage(String message) {
// We don't care.
}
/**
* Opens/creates a new BOS connection to a specific server and port, given a cookie.
*
* @param server Server to connect to.
* @param port Port to connect to.
* @param cookie Auth cookie.
*/
void startBosConn(String server, int port, ByteBlock cookie) {
bosConn = new BOSConnection(new ConnDescriptor(server, port), this, cookie);
bosConn.connect();
}
/**
* Registers the set of SNAC families that the given connection supports.
*
* @param conn FLAP connection to be registered.
*/
void registerSnacFamilies(BasicFlapConnection conn) {
snacMgr.register(conn);
}
protected SnacManager snacMgr = new SnacManager(new PendingSnacListener() {
public void dequeueSnacs(List<SnacRequest> pending) {
for (SnacRequest request : pending) {
handleRequest(request);
}
}
});
synchronized void handleRequest(SnacRequest request) {
int family = request.getCommand().getFamily();
if (snacMgr.isPending(family)) {
snacMgr.addRequest(request);
return;
}
BasicFlapConnection conn = snacMgr.getConn(family);
if (conn != null) {
conn.sendRequest(request);
}
else {
// it's time to request a service
if (!(request.getCommand() instanceof ServiceRequest)) {
snacMgr.setPending(family, true);
snacMgr.addRequest(request);
request(new ServiceRequest(family));
} else {
// TODO: Why does this occur a lot and yet not cause problems?
// Log.error("eep! can't find a service redirector server.");
}
}
}
SnacRequest request(SnacCommand cmd) {
return request(cmd, null);
}
private SnacRequest request(SnacCommand cmd, SnacRequestListener listener) {
SnacRequest req = new SnacRequest(cmd, listener);
handleRequest(req);
return req;
}
void connectToService(int snacFamily, String host, ByteBlock cookie) {
ServiceConnection conn = new ServiceConnection(new ConnDescriptor(host, 5190), this,
cookie, snacFamily);
conn.connect();
}
void serviceFailed(ServiceConnection conn) {
Log.debug("OSCAR service failed: "+conn.toString());
}
void serviceConnected(ServiceConnection conn) {
Log.debug("OSCAR service connected: "+conn.toString());
services.add(conn);
}
public boolean isServiceConnected(ServiceConnection conn) {
return services.contains(conn);
}
public Set<ServiceConnection> getServiceConnections() {
return services;
}
void serviceReady(ServiceConnection conn) {
Log.debug("OSCAR service ready: "+conn.toString());
snacMgr.dequeueSnacs(conn);
}
void serviceDied(ServiceConnection conn) {
Log.debug("OSCAR service died: "+conn.toString());
services.remove(conn);
snacMgr.unregister(conn);
}
void bosDisconnected() {
Message m = new Message();
m.setType(Message.Type.error);
m.setError(PacketError.Condition.internal_server_error);
m.setTo(getJID());
m.setFrom(getTransport().getJID());
m.setBody("You have been disconnected automatically by the server.");
getTransport().sendPacket(m);
logOut();
}
/**
* We've been told about a buddy that exists on the buddy list.
*
* @param buddy The buddy we've been told about.
*/
void gotBuddy(BuddyItem buddy) {
Log.debug("Found buddy item: " + buddy.toString() + " at id " + buddy.getId());
buddies.put(""+buddy.getGroupId()+"."+buddy.getId(), buddy);
if (!highestBuddyIdPerGroup.containsKey(buddy.getGroupId())) {
highestBuddyIdPerGroup.put(buddy.getGroupId(), 0);
}
if (buddy.getId() > highestBuddyIdPerGroup.get(buddy.getGroupId())) {
highestBuddyIdPerGroup.put(buddy.getGroupId(), buddy.getId());
}
}
/**
* We've been told about a group that exists on the buddy list.
*
* @param group The group we've been told about.
*/
void gotGroup(GroupItem group) {
Log.debug("Found group item: " + group.toString() + " at id " + group.getId());
groups.put(group.getId(), group);
if (!highestBuddyIdPerGroup.containsKey(group.getId())) {
highestBuddyIdPerGroup.put(group.getId(), 0);
}
if (group.getId() > highestGroupId) {
highestGroupId = group.getId();
}
}
/**
* Apparantly we now have the entire list, lets sync.
*/
void gotCompleteSSI() {
getRegistration().setLastLogin(new Date());
List<TransportBuddy> legacyusers = new ArrayList<TransportBuddy>();
for (BuddyItem buddy : buddies.values()) {
//Log.debug("CompleteSSI: adding "+buddy.getScreenname());
String nickname = buddy.getAlias();
if (nickname == null) {
nickname = buddy.getScreenname();
}
int groupid = buddy.getGroupId();
String groupname = "Transport Buddies";
if (groups.containsKey(groupid)) {
groupname = groups.get(groupid).getGroupName();
if (groupname.length() < 1) {
groupname = "Transport Buddies";
}
}
legacyusers.add(new TransportBuddy(buddy.getScreenname(), nickname, groupname));
}
try {
getTransport().syncLegacyRoster(getJID(), legacyusers);
}
catch (UserNotFoundException e) {
Log.error("Unable to sync oscar contact list for " + getJID(), e);
}
updateStatus(this.presenceType, this.verboseStatus);
}
/**
* @see org.jivesoftware.wildfire.gateway.TransportSession#retrieveContactStatus(org.xmpp.packet.JID)
*/
public void retrieveContactStatus(JID jid) {
if (bosConn != null) {
bosConn.getAndSendStatus(getTransport().convertJIDToID(jid));
}
}
private static final List<CapabilityBlock> MY_CAPS = Arrays.asList(new CapabilityBlock[] {
CapabilityBlock.BLOCK_ICQCOMPATIBLE,
});
/**
* @see org.jivesoftware.wildfire.gateway.TransportSession#updateStatus(org.jivesoftware.wildfire.gateway.PresenceType, String)
*/
public void updateStatus(PresenceType presenceType, String verboseStatus) {
if (presenceType != PresenceType.available && presenceType != PresenceType.chat) {
String awayMsg = "Away";
if (verboseStatus != null) {
awayMsg = verboseStatus;
}
request(new SetInfoCmd(new InfoData(awayMsg, null, MY_CAPS, null)));
Presence p = new Presence();
p.setShow(Presence.Show.away);
p.setTo(getJID());
p.setFrom(getTransport().getJID());
getTransport().sendPacket(p);
}
else {
request(new SetInfoCmd(new InfoData(InfoData.NOT_AWAY, null, MY_CAPS, null)));
Presence p = new Presence();
p.setTo(getJID());
p.setFrom(getTransport().getJID());
getTransport().sendPacket(p);
}
this.presenceType = presenceType;
this.verboseStatus = verboseStatus;
}
/**
* @see org.jivesoftware.wildfire.gateway.TransportSession#resendContactStatuses(org.xmpp.packet.JID)
*/
public void resendContactStatuses(JID jid) {
if (bosConn != null) {
bosConn.getAndSendAllStatuses(jid);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?