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

📄 sendmessageshell.java

📁 类似于MSN
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	public Shell getShell() {
		return shell;
	}

	/* (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_IM_SUCCESS:
				processSendIMSuccess(e);
				break;
			case QQEvent.QQ_ACCEPT_SEND_FILE:
				processAcceptSendFile(e);
				break;
			case QQEvent.QQ_REJECT_SEND_FILE:
				processRejectSendFile(e);
				break;
			case QQEvent.QQ_CANCEL_SEND_FILE:
				processCancelSendFile(e);
				break;
			case QQEvent.QQ_NOTIFY_FILE_TRANSFER_ARGS:
			    processNotifyFileTransferArgs(e);
				break;
		    case QQEvent.QQ_REQUEST_ME_CONNECT:
		        processRequestMeConnect(e);
		        break;
			case QQEvent.QQ_OPERATION_TIMEOUT:
				if(e.operation == QQ.QQ_CMD_SEND_IM)
					processSendIMFail(e);
				break;			
		}		
	}
	
    /**
     * 处理0x003F,对方请求我首先连接他,这种情况发生在我处于内网,而对方处于外网时
     * @param e
     */
    private void processRequestMeConnect(QQEvent e) {
        ReceiveIMPacket p = (ReceiveIMPacket)e.getSource();
        FileWatcher watcher = (FileWatcher)watchers.get(new Integer(p.normalHeader.sequence));
        if(watcher instanceof FileReceiver) {
            FileReceiver receiver = (FileReceiver)watcher;
            if(receiver.getCondition() == QQ.QQ_I_AM_BEHIND_FIREWALL)
                receiver.notifyNATPort();
        }
    }

    /**
     * 处理0x003B,好像是通知实际IP的意思
     * @param e
     */
    private void processNotifyFileTransferArgs(QQEvent e) {
        ReceiveIMPacket p = (ReceiveIMPacket)e.getSource();
        FileReceiver receiver = (FileReceiver)watchers.get(new Integer(p.normalHeader.sequence));
        if(receiver != null) {
	        receiver.setHisMinorPort(p.fileArgs.localPort);
	        receiver.setHisLocalIp(p.fileArgs.localIp);
	        receiver.startMinorPort();
	        receiver.start();
	        receiver.selectPort();            
        }
    }

	/**
	 * 处理文件传输取消事件
	 * @param e
	 */
	private void processCancelSendFile(QQEvent e) {
		ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		if(packet.normalHeader.sender == qq) {
		    final Integer sessionId = new Integer(packet.normalHeader.sequence);
		    final FileWatcher watcher = (FileWatcher)watchers.get(sessionId);
			// 设置watcher状态
		    if(watcher != null) {
			    watcher.abort();
				// 显示提示信息
				main.display.syncExec(
					new Runnable() {
						public void run() {
						    removeFileSession(sessionId);
						    removeFileItem(sessionId);
						    setOutputMessage("\n\n");
							setOutputMessage(LumaQQ.getResourceString("text.cancel.transfer.file", new Object[] { watcher.getFileName() }));
						}
					}
				);		        
		    }
		}
	}

	/**
	 * 处理拒绝接收文件事件
	 * @param e
	 */
	private void processRejectSendFile(QQEvent e) {
		ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		if(packet.normalHeader.sender == qq) {
		    final Integer sessionId = new Integer(packet.normalHeader.sequence);
		    final FileWatcher watcher = (FileWatcher)watchers.get(sessionId);
			// 设置watcher状态
		    if(watcher != null) {
		        watcher.abort();
			    // 显示提示信息
				main.display.syncExec(
					new Runnable() {
						public void run() {
						    removeFileSession(sessionId);
						    removeFileItem(sessionId);
						    setOutputMessage("\n\n");
							setOutputMessage(LumaQQ.getResourceString("text.reject.send.file", new Object[] { watcher.getFileName() }));					
						}
					}
				);		        
		    }
		}
	}

	/**
	 * 处理接受传送文件事件
	 * @param e
	 */
	private void processAcceptSendFile(QQEvent e) {
		ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		if(packet.normalHeader.sender == qq) {
		    FileWatcher watcher = (FileWatcher)watchers.get(new Integer(packet.normalHeader.sequence));
			// 设置watcher状态
		    if(watcher != null && watcher instanceof FileSender) {
		        final FileSender sender = (FileSender)watcher;
				// 显示提示信息
				main.display.syncExec(
					new Runnable() {
						public void run() {
						    setOutputMessage("\n\n");
							setOutputMessage(LumaQQ.getResourceString("text.accept.send.file", new Object[] { sender.getFileName() }));					
						}
					}
				);
				// 设置守望者参数
				sender.setHisInternetIp(packet.fileArgs.internetIp);
				sender.setHisInternetPort(packet.fileArgs.internetPort);
				sender.setHisMajorPort(packet.fileArgs.directPort);
				sender.setHisFileSessionKey(packet.normalHeader.fileSessionKey);	
				// 通知端口信息
				main.client.notifyFilePort(sender.getHisQQ(), sender.getMyMajorPort(), sender.getMyLocalIp(), sender.getMyMinorPort(), sender.getSessionSequence());
				// 发送测试信息
				sender.sendInitConnectionToDirect();
		    }
		}		
	}

	/**
	 * 处理发送消息超时事件
	 * @param e
	 */
	private void processSendIMFail(QQEvent e) {
		SendIMPacket packet = (SendIMPacket)e.getSource();
		if(packet.getReceiver() == qq) {
			display.syncExec(
				new Runnable() {
					public void run() {
						stopAnimate();
						setMinimized(false);
						setActive();
						MessageBox box = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
						box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
						box.setMessage(LumaQQ.getResourceString("message.box.send.message.timeout"));
						box.open();
					}						
				}
			);	
		}
	}	

	/**
	 * 处理消息发送成功事件,主要是查找出是哪个窗口发送的这个消息,关闭之
	 * @param e
	 */
	private void processSendIMSuccess(QQEvent e) {
		SendIMPacket packet = (SendIMPacket)e.getSource();
		if(packet.getReceiver() == qq && !talkMode) {
			display.asyncExec(
				new Runnable() {
					public void run() {
						stopAnimate();
						close();														
					}						
				}
			);
		}
	}
	
	/**
	 * @param f The f to set.
	 */
	public void setFriendModel(FriendModel f) {
		this.f = f;
		this.face = f.getFaceId();
		this.qq = f.getQQ();
		setTalkMode(f.isTalkMode());
		viewer.setQQ(qq);
		viewer.setExporter(new FriendMessageExporter(main.myModel, f));
		viewer.setFormatter(new FriendMessageFormatter(main.myModel, f));
		lblNick.setText(LumaQQ.getResourceString("send.message.label.nick", new Object[] { f.getProperty("name") }));
		shell.setText(LumaQQ.getResourceString("send.message.title", new Object[] { f.getProperty("name") }));
		lblQQ.setText(LumaQQ.getResourceString("send.message.label.qq", new Object[] { String.valueOf(qq) }));
		if("offline".equals(f.getProperty("status")) || "hidden".equals(f.getProperty("status")))
			btnFriend.setImage(icons.getFace(face + 1));
		else
			btnFriend.setImage(icons.getFace(face));
		generateAnimateFrames();
	}
	
	/**
	 * @return Returns the talkMode.
	 */
	public boolean isTalkMode() {
		return talkMode;
	}
	
	/**
	 * @param packet The requestPacket to set.
	 */
	public void setRequestPacket(ReceiveIMPacket packet) {
	    // 创建一个新的文件接收守望者
	    FileReceiver receiver = new FileReceiver(main.client);
	    receiver.addFileListener(this);
		// 设置提示信息
	    String fileSizeStr = getFileSizeString(packet.fileInfo.fileSize);
	    setOutputMessage("\n\n");
		setOutputMessage(LumaQQ.getResourceString("text.receive.file", new Object[] { f.getProperty("name"), packet.fileInfo.fileName, fileSizeStr }));
		// 设置参数
		receiver.setHisQQ(qq);
		receiver.setSessionSequence(packet.normalHeader.sequence);
		receiver.setHisMajorPort(packet.fileArgs.directPort);
		receiver.setHisInternetIp(packet.fileArgs.internetIp);
		receiver.setHisInternetPort(packet.fileArgs.internetPort);
		receiver.setHisFileSessionKey(packet.normalHeader.fileSessionKey);
	    receiver.setFileName(packet.fileInfo.fileName);
	    receiver.setFileTransferStatus(FileWatcher.FT_NEGOTIATING);
	    // 添加到哈希表中,并设置为当前file session
	    currentFileSessionId = new Integer(receiver.getSessionSequence());
	    watchers.put(currentFileSessionId, receiver);
	    addFileItem(false, receiver.getFileName(), fileSizeStr, currentFileSessionId);
	    setCurrentFileSession(currentFileSessionId);
	    // 设置工具条按钮状态
		tiYes.setEnabled(true);
		tiNo.setEnabled(true);
	}
	
    /**
     * 开始闪烁图标
     */
    public void startBlinkImage() {
        if(!blinkRunnable.isStop()) return;
        blinkRunnable.setStop(false);
        display.timerExec(0, blinkRunnable);
    }
    
    /**
     * 停止闪烁
     */
    public void stopBlinkImage() {
        blinkRunnable.setStop(true);
    }
    
    /**
     * @return true表示当前窗口为active
     */
    public boolean isActive() {
        return active;
    }
    
    /**
     * @return true表示窗口处于最小化状态
     */
    public boolean isMinimized() {
        return shell.getMinimized();
    }
    
    /**
     * @return true表示当前有文件操作正在进行,协商阶段也算作是文件操作
     */
    public boolean hasFileOperating() {
        return !watchers.isEmpty();
    }
    
    /**
     * @return true表示窗口已经disposed
     */
    public boolean isDisposed() {
        return shell.isDisposed();
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.FileListener#fileAborted(edu.tsinghua.lumaqq.qq.events.FileEvent)
     */
    public void fileAborted(FileEvent e) {
        final FileWatcher watcher = (FileWatcher)e.getSource();
        display.syncExec(new Runnable() {
            public void run() {
                removeFileSession(watcher.getSessionSequence());
                removeFileItem(watcher.getSessionSequence());
                setOutputMessage("\n\n");
                setOutputMessage(LumaQQ.getResourceString("text.cancel.transfer.file", new Object[] { watcher.getFileName() }));
            }
        });
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.FileListener#fileFinished(edu.tsinghua.lumaqq.qq.events.FileEvent)
     */
    public void fileFinished(FileEvent e) {
        final FileWatcher watcher = (FileWatcher)e.getSource();
        if(watcher instanceof FileSender) {
            display.syncExec(new Runnable() {
                public void run() {
			        removeFileSession(watcher.getSessionSequence());
			        removeFileItem(watcher.getSessionSequence());
			        setOutputMessage("\n\n");
    		        setOutputMessage(LumaQQ.getResourceString("text.send.file.finished", new Object[] { watcher.getFileName() }));
                }
            });
        } else {
            display.syncExec(new Runnable() {
                public void run() {
			        removeFileSession(watcher.getSessionSequence());
			        removeFileItem(watcher.getSessionSequence());
		            boolean b = Utils.checkFileMD5(watcher.getLocalFileName(), watcher.getFileMD5());
		            setOutputMessage("\n\n");
		            setOutputMessage(LumaQQ.getResourceString(b ? "text.file.md5.correct" : "text.file.md5.incorrect"));
                }
            });
        }
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.FileListener#fileInProgress(edu.tsinghua.lumaqq.qq.events.FileEvent)
     */
    public void fileInProgress(FileEvent e) {
        final FileWatcher watcher = (FileWatcher)e.getSource();
        SlideWindow window = watcher.getSlideWindow();
        if(window.isFinished()) {
            // 如果接收完毕,则显示一些提示信息,如果这个会话是当前显示的会话,还要更新其进度状态
            display.syncExec(new Runnable() {
                public void run() {
                    if(currentFileSessionId.intValue() == watcher.getSessionSequence()) {
			    	    lblStatus.setText(LumaQQ.getResourceString("send.message.label.finished"));
			    	    bar.setSelection(bar.getMaximum());		
			    	    lblPercent.setText("100%");
		    	    }
                }
            });
        } else {
            // 如果还没有接收完,则只更新进度状态
            if(currentFileSessionId.intValue() == watcher.getSessionSequence()) {
                refreshRunnable.max = watcher.getFragments();
                refreshRunnable.selection = window.getMaxPassed();
                int percent = refreshRunnable.selection * 100 / refreshRunnable.max;
                refreshRunnable.text = String.valueOf(percent) + '%';
                display.syncExec(refreshRunnable);
            }
        }
    }

    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.events.FileListener#fileConnected(edu.tsinghua.lumaqq.qq.events.FileEvent)
     */
    public void fileConnected(FileEvent e) {
        final FileWatcher watcher = (FileWatcher)e.getSource();
        if(watcher.isUseUdp()) {
            display.syncExec(new Runnable() {
                public void run() {
                    setOutputMessage(LumaQQ.getResourceString("text.udp.connected"));
                }
            });
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
     */
    public void controlMoved(ControlEvent e) {
		// 保存自己的位置,以便下次打开窗口时在同样的位置
		Point loc = shell.getLocation();
		f.addProperty("locationX", new Integer(loc.x));
		f.addProperty("locationY", new Integer(loc.y));
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
     */
    public void controlResized(ControlEvent e) {
        // 没什么要做的
    }

	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.events.AcceleratorListener#acceleratorPressed(org.eclipse.swt.events.KeyEvent)
	 */
	public void acceleratorPressed(KeyEvent e) {
		// 按下了enter键
		if(e.keyCode == SWT.CR) {
			boolean b = talkMode?options.isUseEnterInTalkMode():options.isUseEnterInMessageMode();
			if((e.stateMask & SWT.CTRL) != 0) { // ctrl也按下了
				if(!b) 
					sendMessage(inputBox.getMessage());
			} else {
				if(b)						
					sendMessage(inputBox.getMessage());
			}
		} else if(e.stateMask == SWT.ALT) {
			log.trace("Alt Accelerator");
		    if(e.character == 's' || e.character == 'S')
		        sendMessage(inputBox.getMessage());
		    else if(e.character == 'h' || e.character == 'H')
		        showRecord();
		    else if(e.character == 't' || e.character == 'T')
		        setTalkMode(!talkMode);
		    else if(e.character == 'c' || e.character == 'C')
		        close();
		}
	}
}

⌨️ 快捷键说明

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