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

📄 clusterimdelegate.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			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 + -