📄 clusterimdelegate.java
字号:
case QQEvent.QQ_05_OPERATION_TIMEOUT:
switch(e.operation) {
case QQ.QQ_05_CMD_REQUEST_AGENT:
case QQ.QQ_05_CMD_REQUEST_BEGIN:
case QQ.QQ_05_CMD_TRANSFER:
timeout();
break;
}
break;
}
}
/**
* 处理连接被远端关闭事件
*
* @param e
*/
private void processConnectionBroken(QQEvent e) {
ErrorPacket packet = (ErrorPacket)e.getSource();
if(port != null && packet.connectionId.equals(port.getId()))
dispose();
}
/**
* 初始请求中转服务器失败事件
*
* @param e
*/
private void processRequestAgentFail(QQEvent e) {
RequestAgentReplyPacket packet = (RequestAgentReplyPacket)e.getSource();
if(expectedSequence == packet.getSequence())
fail(packet.message);
}
/**
* 处理发送表情成功事件
*
* @param e
*/
private void processTransferFaceSuccess(QQEvent e) {
TransferReplyPacket packet = (TransferReplyPacket)e.getSource();
if(expectedSequence == packet.getSequence()) {
switch(status) {
case BEFORE_SENDING:
startSendFace();
break;
case JUST_FINISH:
sendNextFace();
status = BEFORE_SENDING;
break;
case SENDING_ONE:
sendFaceFragment();
break;
}
}
}
/**
* 发送表情分片
*/
private void sendFaceFragment() {
boolean needDelay = (segmentCount - nextSegment) > 5;
for(int i = 0; nextSegment < segmentCount && i < 10; nextSegment++, i++) {
// 这里为什么要delay呢,也是没有办法的办法。对于一些比较大的表情,QQ好像需要一次
// 发送10个包,然后再等待服务器的回复,再发10个包...
// 这个回复还非等不可,不然接收方接收的图片会乱掉,想了半天,这大概是目前能想到的
// "最好"的办法了
if(needDelay) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
expectedSequence = client.transferFaceData(sessionId, segmentor.getFragment(nextSegment), nextSegment == segmentCount - 1, port.getId());
}
if(nextSegment >= segmentCount) {
segmentor.close();
segmentor = null;
status = JUST_FINISH;
} else
status = SENDING_ONE;
}
/**
* 发送下一个表情,如果没有了,则开始发送消息
*/
private void sendNextFace() {
currentIndex++;
while(currentIndex < count && tool.isReferred(currentIndex))
currentIndex++;
if(currentIndex < count)
sendRequestAgent();
else {
// 把自定义表情的内容替换成可发送的内容
message = tool.toProtocolFormat(sessionIdArray, agentAddress, client.getUser().getFileAgentKey());
initialFragmentStatus();
// 开始正式发送消息
sendNextFragment();
}
return;
}
/**
* 开始发送第currentIndex个表情
*/
private void startSendFace() {
int id = tool.getId(currentIndex);
FaceRegistry util = FaceRegistry.getInstance();
String path = util.getFacePath(id);
if(path == null) {
fail("File isn't exist");
return;
}
segmentor = new FileSegmentor(path, 1024);
if(!segmentor.isLoadSuccess()) {
fail("Can't open face file");
return;
}
segmentCount = segmentor.getTotalFragments();
nextSegment = 0;
sendFaceFragment();
}
/**
* 初始请求开始会话成功事件
*
* @param e
*/
private void processRequestBeginSuccess(QQEvent e) {
RequestBeginReplyPacket packet = (RequestBeginReplyPacket)e.getSource();
if(packet.sessionId != sessionId)
return;
int id = tool.getId(currentIndex);
FaceRegistry util = FaceRegistry.getInstance();
Face face = util.getFace(id);
byte[] md5 = Util.convertHexStringToByteNoSpace(face.getMd5());
int imageLength = util.getFaceLength(face.getMd5());
expectedSequence = client.transferFaceInfo(sessionId, imageLength, face.getFilename(), md5, port.getId());
}
/**
* 处理请求服务器成功事件
*
* @param e
*/
private void processRequestAgentOK(QQEvent e) {
RequestAgentReplyPacket packet = (RequestAgentReplyPacket)e.getSource();
if(packet.getSequence() != expectedSequence)
return;
// 得到会话id
sessionId = packet.sessionId;
sessionIdArray[currentIndex] = sessionId;
// 请求开始发送
int id = tool.getId(currentIndex);
FaceRegistry util = FaceRegistry.getInstance();
Face face = util.getFace(id);
byte[] md5 = Util.convertHexStringToByteNoSpace(face.getMd5());
// 非第一个表情不需要request begin包
if(currentIndex > 0) {
int imageLength = util.getFaceLength(face.getMd5());
expectedSequence = client.transferFaceInfo(sessionId, imageLength, face.getFilename(), md5, port.getId());
} else
client.requestSendBegin(sessionId, md5, port.getId());
}
/**
* 处理重定向事件
*
* @param e
*/
private void processRequestAgentRedirect(QQEvent e) {
RequestAgentReplyPacket packet = (RequestAgentReplyPacket)e.getSource();
if(packet.getSequence() != expectedSequence)
return;
// 关闭原来的连接,创建一个到重定向服务器的连接
dispose();
agentAddress = new InetSocketAddress(Util.convertIpToString(packet.redirectIp), packet.redirectPort);
createPort();
sendRequestAgent();
}
/**
* 处理超时事件
*/
private void processSendIMTimeOut(QQEvent e) {
ClusterCommandPacket packet = (ClusterCommandPacket)e.getSource();
if(packet.getClusterId() == sender.getSenderId()) {
switch(packet.getSubCommand()) {
case QQ.QQ_CLUSTER_CMD_SEND_IM_EX:
case QQ.QQ_CLUSTER_CMD_SEND_TEMP_IM:
timeout();
break;
default:
break;
}
}
}
/**
* 处理消息发送失败事件
*
* @param e
*/
private void processSendIMFail(QQEvent e) {
ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
if(packet.clusterId == sender.getSenderId())
fail(packet.errorMessage);
}
/**
* 处理消息发送成功事件
*/
public void processSendIMSuccess(QQEvent e) {
ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
if(packet.clusterId == sender.getSenderId()) {
if(!sendNextFragment())
over();
}
}
/**
* 初始化一些变量
*/
private void initialFragmentStatus() {
// 计算分片数
totalFragments = (message.length() - 1) / QQ.QQ_MAX_SEND_IM + 1;
// 初始化其他变量
currentFragment = -1;
messageId = MessageIDGenerator.getNext();
}
/**
* 对原始消息做预处理,主要是检查是否有自定义表情
*/
private void preprocess() {
tool.parseOutMessage(originalMessage);
if(!tool.hasCustomFace()) {
message = originalMessage;
// 初始化变量
initialFragmentStatus();
} else
initialCustomFaceStatus();
}
/**
* 初始化自定义表情相关变量
*/
private void initialCustomFaceStatus() {
currentIndex = 0;
count = tool.getFaceCount();
status = BEFORE_SENDING;
if(sessionIdArray == null || count > sessionIdArray.length)
sessionIdArray = new int[count];
}
/**
* @param originalMessage The originalMessage to set.
*/
public void setOriginalMessage(String originalMessage) {
this.originalMessage = originalMessage;
}
/**
* @param sender The sender to set.
*/
public void setSender(IIMSender sender) {
this.sender = sender;
}
/**
* @return Returns the currentFragment.
*/
public int getCurrentFragment() {
return currentFragment;
}
/**
* @return Returns the messageId.
*/
public char getMessageId() {
return messageId;
}
/**
* @return Returns the totalFragments.
*/
public int getTotalFragments() {
return totalFragments;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -