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

📄 sendsmsshell.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        // 发送期间,把发送按钮禁止
        btnSend.setEnabled(false);
        
        // 清空回复
        reply.clear();
        
        // 根据发送内容类型的不同调用不同的方法
        if(contentType == QQ.QQ_SMS_CONTENT_NORMAL) {
            createMessageBytes();
            messageSequence = 0;
            sendNextSplit(messageSequence);                    
        } else {
            if(sendToMobile) {
                nextAck = main.getClient().sendSMS(
                        receiver,
                        textSenderName.getText(),
                        contentType,
                        contentId,
                        chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);
            } else {
                // 得到接收者QQ号 
    	        int qq = Util.getInt(receiver, 0);
    	        if(qq == 0)
    	            return;
    	        
	            nextAck = main.getClient().sendSMS(
	                    qq,
	                    textSenderName.getText(),
	                    contentType,
	                    contentId,
	                    chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);                
            }
        }
    }

    /**
     * 根据用户输入的内容创建消息字节数组
     * @return
     */
    protected void createMessageBytes() {
        // 对消息进行格式化
        StringBuffer sb = new StringBuffer(textInput.getText());
        StyleRange[] range = textInput.getStyleRanges();
        for(int i = range.length - 1; i >= 0; i--) {
            sb.insert(range[i].start, (char)BLINK);
            sb.insert(range[i].start + range[i].length + 1, (char)BLINK);
        }
        
        // 检查是分片发送还是只发送一条
        if(chkSplit.getSelection()) {
            /* 如果是分片发送,还要再处理一下,加上一个头 */
            // 首先得到每个分片的大小,因为消息和发送者名称合起来不能超过58,同时还要减去头部4个字符
            int fragSize = 58 - textSenderName.getText().length() - 4;
            // 得到分片总数
            int frags = (sb.length() + 1) / fragSize; 
            // 插入头部
            for(int i = (frags - 1) * fragSize, j = 0x30 + frags; i >= 0; i -= fragSize, j--) {
                sb.insert(i, (char)0x0A)
                	.insert(i, (char)(0x30 + frags))
                	.insert(i, (char)0x2F)
                	.insert(i, (char)j);
            }
            
            // 得到每个分片的字节数组,注意fragSize加了4,因为头部已经填充了
            fragSize += 4;
            message = new byte[frags][];
            for(int i = 0; i < frags; i++) {
                if(i < frags - 1)
                    message[i] = Util.getBytes(sb.substring(i * fragSize, (i + 1) * fragSize));
                else
                    message[i] = Util.getBytes(sb.substring(i * fragSize));
            }
        } else {
            message = new byte[1][];
            message[0] = Util.getBytes(sb.toString());
        }
    }

    /**
     * 初始化变量
     */
    private void initVariable() {
		buttonColor = new Color(display, 0xEF, 0xEF, 0xF7);
		toolbarBackground = new Color(display, 0x5A, 0x82, 0xD6);
		available = MAX_ONE;
		contentType = QQ.QQ_SMS_CONTENT_NORMAL;
		reply = new ArrayList();
		sendToMobile = false;
		nextAck = 0;
		createFriendSelectShell();
    }
    
	/**
     * 创建好友选择窗口
     */
    private void createFriendSelectShell() {
		fss = new FriendSelectShell(shell, true);
		fss.setModel(main.getModel());
		fss.setMobileModel(main.getMobileModel());
		fss.addFriendSelectionListener(this);
    }

    /**
	 * 打开shell
	 */
	public void open()	{
		// 设置窗口位置
	    Rectangle rect = display.getClientArea();
	    Point size = shell.getSize();
	    shell.setLocation((rect.width - size.x) / 2, (rect.height - size.y) / 2);
		// 打开shell
		shell.layout();
		shell.open();
		font = new Font(display, display.getSystemFont().getFontData()[0].getName(), 12, SWT.NORMAL);
		textInput.setFont(font);
		textInput.setFocus();
		// 添加自己为QQListener
		main.getClient().addQQListener(this);
	}	

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
     */
    public void widgetDisposed(DisposeEvent e) {
        buttonColor.dispose();
        toolbarBackground.dispose();
        font.dispose();
    }
    
    /**
	 * 是当前窗口激活
	 */
	public void setActive() {
		shell.setActive();
	}	
	
	/**
	 * 代理方法,设置窗口的最小化状态
	 * @param b
	 */
	public void setMinimized(boolean b) {
		shell.setMinimized(b);
	}
	
	/**
	 * 使chatbox获得焦点
	 */
	public void setFocus() {
		textInput.setFocus();
	}
    
    /**
     * 调整发送者名称的长度,因为发送者名称长度最大13个字节
     */
    private void shortenName() {        
        byte[] b = textSenderName.getText().getBytes();
        if(b.length > 13) {
            String name = Util.getString(b, 0, 13, QQ.QQ_CHARSET_DEFAULT);
            textSenderName.setText(name);
            textSenderName.setSelection(name.length());
        }
    }
    
    /**
     * 调整消息长度
     */
    private void shortenMessage() {
        if(available < 0) {
            String text = textInput.getText();
            text = text.substring(0, text.length() + available / 2);
            textInput.setText(text);
            available = 0;
            textInput.setSelection(text.length());
        }
    }
    
    /**
     * 设置提示信息
     * @param remain
     */
    private void setHint() {
        lblHint.setText(LumaQQ.getString("send.sms.label.hint", new Object[] { String.valueOf(available) }));
    }
    
    /**
     * 计算还能输入多少字符,我们要扣除发送者名称,要扣除闪烁效果,要扣除已经输入的消息
     */
    private void calcAvailable() {
        if(chkSplit.getSelection())
            available = MAX_THREE - textSenderName.getText().length() * 6 - textInput.getText().length() * 2 - textInput.getStyleRanges().length * 4;
        else
            available = MAX_ONE - (textSenderName.getText().length() + textInput.getText().length()) * 2 - textInput.getStyleRanges().length * 4;            
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ShellAdapter#shellClosed(org.eclipse.swt.events.ShellEvent)
     */
    public void shellClosed(ShellEvent e) {
        main.getClient().removeQQListener(this);
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.QQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
     */
    public void qqEvent(QQEvent e) {
        switch(e.type) {
            case QQEvent.QQ_SEND_SMS_SUCCESS:
                processSendSMSSuccess(e);
                break;
            case QQEvent.QQ_SEND_SMS_FAIL:
                processSendSMSFail(e);
                break;
            case QQEvent.QQ_OPERATION_TIMEOUT:
                if(e.operation == QQ.QQ_CMD_SEND_SMS)
                    processSendSMSTimeout(e);
                break;
            default:
                break;
        }
    }

    /**
     * 发送下一个分片
     * @param seq
     * 			分片号,从0开始
     */
    private void sendNextSplit(char seq) {
        if(sendToMobile) {
            /* 发送到手机好友 */
	        nextAck = main.getClient().sendSMS(
	                receiver,
	                textSenderName.getText(), 
	                message[seq], 
	                seq, 
	                chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);            
        } else {
            /* 发送到普通好友 */            
            // 得到接收者QQ号 
	        int qq = Util.getInt(receiver, 0);
	        if(qq == 0)
	            return;
	        
	        // 保存短信内容到聊天记录
	        main.getMessageManager().saveMessage(qq, qq, main.getMyModel().getQQ(), Util.getString(message[seq]), (int)(System.currentTimeMillis() / 1000));
	        // 发送
	        nextAck = main.getClient().sendSMS(
	                qq, 
	                textSenderName.getText(), 
	                message[seq], 
	                seq, 
	                chkHandfree.getSelection() ? QQ.QQ_SMS_HAND_FREE : QQ.QQ_SMS_NORMAL);            
        }
    }
    
    /**
     * 处理发送短消息成功事件
     * 
     * @param e
     */
    private void processSendSMSSuccess(QQEvent e) {
        SendSMSReplyPacket packet = (SendSMSReplyPacket)e.getSource();
        reply.add(packet);
        if(nextAck == packet.getSequence()) {
            if(message.length - 1 > messageSequence) {
		        /* 如果还有消息没发完,则继续发 */
                display.asyncExec(new Runnable() {
                    public void run() {
		                sendNextSplit(++messageSequence);
                    }
                });
            } else {
                display.asyncExec(new Runnable() {
                    public void run() {
		                showResult();
                    }
                });
            }                
        }
    }
    
    /**
     * 显示发送的结果
     */
    private void showResult() {
        /* 如果已经发完了,弹出状态报告 */
        new SMSResultDialog(shell, reply).open();
        btnSend.setEnabled(true);
    }

    /**
     * 处理发送短消息失败事件
     * 
     * @param e
     */
    private void processSendSMSFail(QQEvent e) {
        SendSMSReplyPacket packet = (SendSMSReplyPacket)e.getSource();
        reply.add(packet);
        if(nextAck == packet.getSequence()) {
            if(message.length - 1 > messageSequence) {
		        /* 如果还有消息没发完,则继续发 */
                display.asyncExec(new Runnable() {
                    public void run() {
		                sendNextSplit(++messageSequence);
                    }
                });
            } else {  
                display.asyncExec(new Runnable() {
                    public void run() {
		                showResult();
                    }
                });
            }
        }
    }

    /**
     * 处理发送短消息超时事件
     * 
     * @param e
     */
    private void processSendSMSTimeout(QQEvent e) {
        SendSMSPacket packet = (SendSMSPacket)e.getSource();
        if(nextAck == packet.getSequence()) {
            display.asyncExec(new Runnable() {
                public void run() {
                    btnSend.setEnabled(true);
                    MessageDialog.openError(shell, LumaQQ.getString("message.box.common.fail.title"), LumaQQ.getString("message.box.send.sms.timeout"));
                }
            });
        }
    }
    
    /**
     * 设置接收者
     * 
     * @param f
     */
    public void setReceiver(FriendModel f) {
        model = f;
        receiver = String.valueOf(f.getQQ());
        textReceiver.setText(receiver);
        setSendToMobile(false);
    }
    
    /**
     * 设置接收者
     * 
     * @param m
     */
    public void setReceiver(MobileModel m) {
        model = m;
        receiver = m.getMobile();
        textReceiver.setText(receiver);
        setSendToMobile(true);
    }
    
    /**
     * 设置接收者
     * 
     * @param model
     */
    public void setReceiver(Object model) {
        if(model instanceof FriendModel)
            setReceiver((FriendModel)model);
        else if(model instanceof MobileModel)
            setReceiver((MobileModel)model);
    }
    
    /**
     * @return
     * 		true表示接收者号码是个手机号码
     */
    public boolean isSendToMobile() {
        return sendToMobile;
    }
    
    /**
     * 设置接收者号码类型
     * 
     * @param sendToMobile
     * 		true表示接收者号码是个手机号码
     */
    public void setSendToMobile(boolean sendToMobile) {
        this.sendToMobile = sendToMobile;
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendSelected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
     */
    public void friendSelected(FriendSelectionEvent e) {
        setReceiver(((List)e.getSource()).get(0));
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.events.FriendSelectionListener#friendDeselected(edu.tsinghua.lumaqq.events.FriendSelectionEvent)
     */
    public void friendDeselected(FriendSelectionEvent e) {
        model = null;
        receiver = null;
        textReceiver.setText("");
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -