sparktransfermanager.java.svn-base
来自「开源项目openfire的完整源程序」· SVN-BASE 代码 · 共 706 行 · 第 1/2 页
SVN-BASE
706 行
/**
* $Revision: $
* $Date: $
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Lesser Public License (LGPL),
* a copy of which is included in this distribution.
*/
package org.jivesoftware.spark.filetransfer;
import org.jivesoftware.MainWindow;
import org.jivesoftware.Spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.FromContainsFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.filetransfer.FileTransferManager;
import org.jivesoftware.smackx.filetransfer.FileTransferRequest;
import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;
import org.jivesoftware.spark.ChatManager;
import org.jivesoftware.spark.PresenceManager;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.component.RolloverButton;
import org.jivesoftware.spark.filetransfer.preferences.FileTransferPreference;
import org.jivesoftware.spark.preference.PreferenceManager;
import org.jivesoftware.spark.ui.ChatFrame;
import org.jivesoftware.spark.ui.ChatRoom;
import org.jivesoftware.spark.ui.ChatRoomButton;
import org.jivesoftware.spark.ui.ChatRoomClosingListener;
import org.jivesoftware.spark.ui.ChatRoomListenerAdapter;
import org.jivesoftware.spark.ui.ContactItem;
import org.jivesoftware.spark.ui.ContactList;
import org.jivesoftware.spark.ui.FileDropListener;
import org.jivesoftware.spark.ui.ImageSelectionPanel;
import org.jivesoftware.spark.ui.TranscriptWindow;
import org.jivesoftware.spark.ui.rooms.ChatRoomImpl;
import org.jivesoftware.spark.ui.status.StatusBar;
import org.jivesoftware.spark.util.ResourceUtils;
import org.jivesoftware.spark.util.SwingWorker;
import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.Downloads;
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui.ReceiveMessage;
import org.jivesoftware.sparkimpl.plugin.filetransfer.transfer.ui.SendMessage;
import org.jivesoftware.sparkimpl.plugin.manager.Enterprise;
import java.awt.AWTException;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
/**
* Responsible for the handling of File Transfer within Spark. You would use the SparkManager
* for sending of images, files, multiple files and adding your own transfer listeners for plugin work.
*
* @author Derek DeMoro
*/
public class SparkTransferManager {
private List<FileTransferListener> listeners = new ArrayList<FileTransferListener>();
private File defaultDirectory;
private static SparkTransferManager singleton;
private static final Object LOCK = new Object();
private FileTransferManager transferManager;
private Map waitMap = new HashMap();
private BufferedImage bufferedImage;
private ImageSelectionPanel selectionPanel;
private Robot robot;
/**
* Returns the singleton instance of <CODE>SparkTransferManager</CODE>,
* creating it if necessary.
* <p/>
*
* @return the singleton instance of <Code>SparkTransferManager</CODE>
*/
public static SparkTransferManager getInstance() {
// Synchronize on LOCK to ensure that we don't end up creating
// two singletons.
synchronized (LOCK) {
if (null == singleton) {
SparkTransferManager controller = new SparkTransferManager();
singleton = controller;
return controller;
}
}
return singleton;
}
private SparkTransferManager() {
boolean enabled = Enterprise.containsFeature(Enterprise.FILE_TRANSFER_FEATURE);
if (!enabled) {
return;
}
SparkManager.getConnection().addConnectionListener(new ConnectionListener() {
public void connectionClosed() {
}
public void connectionClosedOnError(Exception e) {
}
public void reconnectingIn(int seconds) {
}
public void reconnectionSuccessful() {
// Re-create transfer manager.
transferManager = new FileTransferManager(SparkManager.getConnection());
}
public void reconnectionFailed(Exception e) {
}
});
try {
robot = new Robot();
selectionPanel = new ImageSelectionPanel();
}
catch (AWTException e) {
Log.error(e);
}
// Register Preferences
PreferenceManager prefManager = SparkManager.getPreferenceManager();
prefManager.addPreference(new FileTransferPreference());
final JMenu actionsMenu = SparkManager.getMainWindow().getMenuByName(Res.getString("menuitem.actions"));
JMenuItem downloadsMenu = new JMenuItem("", SparkRes.getImageIcon(SparkRes.DOWNLOAD_16x16));
ResourceUtils.resButton(downloadsMenu, Res.getString("menuitem.view.downloads"));
actionsMenu.add(downloadsMenu);
downloadsMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Downloads downloads = Downloads.getInstance();
downloads.showDownloadsDirectory();
}
});
// Create the file transfer manager
transferManager = new FileTransferManager(SparkManager.getConnection());
final ContactList contactList = SparkManager.getWorkspace().getContactList();
// Create the listener
transferManager.addFileTransferListener(new org.jivesoftware.smackx.filetransfer.FileTransferListener() {
public void fileTransferRequest(final FileTransferRequest request) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
handleTransferRequest(request, contactList);
}
});
}
});
// Add Send File to Chat Room
addSendFileButton();
contactList.addFileDropListener(new FileDropListener() {
public void filesDropped(Collection files, Component component) {
if (component instanceof ContactItem) {
ContactItem item = (ContactItem)component;
ChatRoom chatRoom = null;
Iterator iter = files.iterator();
while (iter.hasNext()) {
chatRoom = sendFile((File)iter.next(), item.getJID());
}
if (chatRoom != null) {
SparkManager.getChatManager().getChatContainer().activateChatRoom(chatRoom);
}
}
}
});
if (defaultDirectory == null) {
defaultDirectory = new File(System.getProperty("user.home"));
}
addPresenceListener();
// Add View Downloads to Command Panel
StatusBar statusBar = SparkManager.getWorkspace().getStatusBar();
final JPanel commandPanel = SparkManager.getWorkspace().getCommandPanel();
RolloverButton viewDownloads = new RolloverButton(SparkRes.getImageIcon(SparkRes.DOWNLOAD_16x16));
viewDownloads.setToolTipText(Res.getString("menuitem.view.downloads"));
commandPanel.add(viewDownloads);
viewDownloads.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Downloads downloads = Downloads.getInstance();
downloads.showDownloadsDirectory();
}
});
}
private void handleTransferRequest(FileTransferRequest request, ContactList contactList) {
// Check if a listener handled this request
if (fireTransferListeners(request)) {
return;
}
String requestor = request.getRequestor();
String bareJID = StringUtils.parseBareAddress(requestor);
ContactItem contactItem = contactList.getContactItemByJID(bareJID);
ChatRoom chatRoom;
if (contactItem != null) {
chatRoom = SparkManager.getChatManager().createChatRoom(bareJID, contactItem.getNickname(), contactItem.getNickname());
}
else {
chatRoom = SparkManager.getChatManager().createChatRoom(bareJID, bareJID, bareJID);
}
TranscriptWindow transcriptWindow = chatRoom.getTranscriptWindow();
StyledDocument doc = (StyledDocument)transcriptWindow.getDocument();
// The image must first be wrapped in a style
Style style = doc.addStyle("StyleName", null);
final ReceiveMessage receivingMessageUI = new ReceiveMessage();
receivingMessageUI.acceptFileTransfer(request);
chatRoom.addClosingListener(new ChatRoomClosingListener() {
public void closing() {
receivingMessageUI.cancelTransfer();
}
});
StyleConstants.setComponent(style, receivingMessageUI);
// Insert the image at the end of the text
try {
doc.insertString(doc.getLength(), "ignored text", style);
doc.insertString(doc.getLength(), "\n", null);
}
catch (BadLocationException e) {
Log.error(e);
}
chatRoom.increaseUnreadMessageCount();
chatRoom.scrollToBottom();
SparkManager.getChatManager().getChatContainer().fireNotifyOnMessage(chatRoom);
}
public void sendFileTo(ContactItem item) {
FileDialog fileChooser = getFileChooser(SparkManager.getMainWindow(), Res.getString("title.select.file.to.send"));
fileChooser.show();
if (fileChooser.getDirectory() == null || fileChooser.getFile() == null) {
return;
}
File file = new File(fileChooser.getDirectory(), fileChooser.getFile());
if (file.exists()) {
defaultDirectory = file.getParentFile();
sendFile(file, item.getJID());
}
}
private void addSendFileButton() {
final ChatManager chatManager = SparkManager.getChatManager();
chatManager.addChatRoomListener(new ChatRoomListenerAdapter() {
public void chatRoomOpened(final ChatRoom room) {
if (!(room instanceof ChatRoomImpl)) {
return;
}
// Otherwise,
new ChatRoomTransferDecorator(room);
}
public void chatRoomClosed(ChatRoom room) {
}
});
}
public void sendScreenshot(final ChatRoomButton button, final ChatRoom room) {
button.setEnabled(false);
final MainWindow mainWindow = SparkManager.getMainWindow();
final ChatFrame chatFrame = SparkManager.getChatManager().getChatContainer().getChatFrame();
final boolean mainWindowVisible = mainWindow.isVisible();
final boolean chatFrameVisible = chatFrame.isVisible();
if (mainWindowVisible) {
mainWindow.setVisible(false);
}
if (chatFrameVisible) {
chatFrame.setVisible(false);
}
final SwingWorker worker = new SwingWorker() {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?