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

📄 filetransferplugin.java

📁 mywork是rcp开发的很好的例子
💻 JAVA
字号:
package net.jxta.myjxta.plugins.filetransfer;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.AbstractAction;
import javax.swing.JFileChooser;

import net.jxta.document.AdvertisementFactory;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.myjxta.plugin.IPluginNotificationHandler;
import net.jxta.myjxta.plugin.ISelectableNode;
import net.jxta.myjxta.plugin.PluginBase;
import net.jxta.myjxta.plugin.PluginContainer;
import net.jxta.myjxta.util.Group;
import net.jxta.myjxta.util.GroupNode;
import net.jxta.myjxta.util.JxtaNode;
import net.jxta.myjxta.util.PeerNode;
import net.jxta.myjxta.util.Resources;
import net.jxta.peergroup.PeerGroup;
import net.jxta.pipe.PipeID;
import net.jxta.protocol.PipeAdvertisement;
import net.jxta.socket.JxtaServerSocket;
import net.sf.p2pim.BuddyListView;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

/**
 * @author levin
 * @since 2007-11-14 下午09:11:34
 * 将对话框从swing改为swt
 */
public class FileTransferPlugin extends PluginBase implements IPluginNotificationHandler, PluginContainer.IPopupProvider {

    HashMap<PeerGroup, JxtaServerSocket> groupsWithListeners = new HashMap<PeerGroup, JxtaServerSocket>();
    private static final String G_TRANSFER_ID = "TRANS";
    private ArrayList<Group> m_joinedGroups = new ArrayList<Group>();
    private HashMap<Group, FileReceiver> group2Receiver = new HashMap<Group, FileReceiver>();

    public FileTransferPlugin() throws NoSuchAlgorithmException {
        super();
        setName("File Transfer");
    }


    public void init(PluginContainer c) {
        super.init(c);    //To change body of overridden methods use File | Settings | File Templates.
        start();	//设置为自动启动
    }


    public void start() {
        super.start();

        //we want a simple test menu entry on the peer nodes
        m_container.registerPopupProvider(this);

        //start can be called multiple times.. maybe we already have some joined groups... start listeners for em
        for (Group group : m_joinedGroups) {
            startListener(group);
        }
    }

    public void stop() {
        m_container.removePopupProvider(this);
        for (Group group : m_joinedGroups) {
            stopListener(group);
        }
        super.stop();
    }

    public void destroy() {
        if (m_running) {
            stop();
        }
        super.destroy();
    }

    private void stopListener(Group p_group) {
        FileReceiver receiver = group2Receiver.get(p_group);
        receiver.shutdownListener();
    }

    private void startListener(Group p_group) {
        try {
            PipeAdvertisement pipeAdvertisement = getAdvertisment(p_group.getPeerGroup(), p_group.getOwnPeersCommandId() + G_TRANSFER_ID);
            try {
                FileReceiver listener = new FileReceiver(p_group.getPeerGroup(), (PipeID) pipeAdvertisement.getPipeID()) {
                    File file=null;
                    protected File getTargetFile(final String fileName, final long fileSize, final String sender) {
            			Display.getDefault().syncExec(new Runnable(){
            				public void run() {
		                		final FileDialog fd=new FileDialog(BuddyListView.getShell(),SWT.SAVE);
		                		fd.setText("收到来自 "+ sender +" 的文件,请选择保存位置");
		                		fd.setFileName(fileName);
		                		String openFile = fd.open();
		                		if(openFile != null)
		                			file=new File(openFile);
            				}
            			});
                        return file;
                    }
                };
                group2Receiver.put(p_group, listener);
                listener.start();
            } catch (PeerGroupException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }


    public static PipeAdvertisement getAdvertisment(PeerGroup pg, String generatorSeed) {
        PipeAdvertisement pa = (PipeAdvertisement) AdvertisementFactory.
                newAdvertisement(PipeAdvertisement.getAdvertisementType());

        try {
            pa.setPipeID(IDFactory.newPipeID(pg.getPeerGroupID(), createMD5(generatorSeed)));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            return null;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        pa.setName(generatorSeed);
        pa.setType(PipeAdvertisement.getAdvertisementType());
        return pa;
    }

    private static byte[] createMD5(String seed) throws UnsupportedEncodingException, NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.reset();
        md5.update(seed.getBytes("UTF-8"));
        return md5.digest();
    }

    public IPluginNotificationHandler getPluginNotificationHander() {
        return this;
    }

    public void groupJoined(Group p_group) {
        if (!p_group.isVisible())
            return;

        m_joinedGroups.add(p_group);

        if (isRunning()) {
            startListener(p_group);
        }
    }

    public void groupResigned(Group p_group) {
        if (!p_group.isVisible())
            return;

        m_joinedGroups.remove(p_group);
        if (isRunning()) {
            stopListener(p_group);
        }
    }


    public void groupStateChanged(Group p_group) {
    }


    public void popupRequested(PluginContainer.IPopupGenerator popupGenerator, ISelectableNode[] selectedNodes, MouseEvent triggerEvent) {
        if (selectedNodes != null && selectedNodes.length >= 1) {
            JxtaNode jxtaNode = selectedNodes[0].getJxtaNode();
            if (jxtaNode instanceof PeerNode) {
                PeerNode peerNode = (PeerNode) jxtaNode;
                PluginContainer.MenuPath peerPath = new PluginContainer.MenuPath(Resources.getStrings().getString("menu.peer"), KeyEvent.VK_P);
                PipeID p_targetCommandPipeID = (PipeID) peerNode.getPeer().getPipeAdvertisement().getID();
                PeerGroup pg = ((GroupNode) peerNode.getParent()).getGroup().getPeerGroup();
                PipeAdvertisement socketAdv = getAdvertisment(pg, p_targetCommandPipeID + G_TRANSFER_ID);
                popupGenerator.addPopup(new PluginContainer.MenuPath[]{peerPath}, 9, new BandwidthTestAction("Send File", pg, (PipeID) socketAdv.getPipeID()));
            }
        }
    }

    private class BandwidthTestAction extends AbstractAction implements PropertyChangeListener {
        private final PipeID targetPipeID;
        private PeerGroup peerGroup;

        public BandwidthTestAction(String name, PeerGroup pg, PipeID p_message) {
            super(name);
            peerGroup = pg;
            targetPipeID = p_message;
        }

        private File getFile() {
            JFileChooser chooser = new JFileChooser();
            chooser.showOpenDialog((Component) m_container.getMyJxta().getView());
            return chooser.getSelectedFile();
        }

        public void actionPerformed(ActionEvent e) {
            File file = getFile();
            if (file == null || !file.exists() || !file.canRead())
                return;

            FileSender tmp = null;
            try {
                tmp = new FileSender(peerGroup, targetPipeID, file);
                tmp.addPropertyChangeListener(this);
                tmp.start();
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }

        }

        public void propertyChange(PropertyChangeEvent evt) {
            System.out.println(evt.getPropertyName() + ":" + evt.getNewValue());
        }
    }

}

⌨️ 快捷键说明

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