📄 filesender.java
字号:
/* * Copyright (c) 2001 Sun Microsystems, Inc. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Sun Microsystems, Inc. for Project JXTA." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", * nor may "JXTA" appear in their name, without prior written * permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of Project JXTA. For more * information on Project JXTA, please see * <http://www.jxta.org/>. * * This license is based on the BSD license adopted by the Apache Foundation. * * $Id: FileSender.java,v 1.18 2004/05/01 20:05:13 bondolo Exp $ */package net.jxta.impl.shell.bin.xfer;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.PrintWriter;import java.io.StringWriter;import java.io.IOException;import java.lang.reflect.UndeclaredThrowableException;import net.jxta.discovery.DiscoveryService;import net.jxta.document.MimeMediaType;import net.jxta.endpoint.ByteArrayMessageElement;import net.jxta.endpoint.Message;import net.jxta.endpoint.MessageElement;import net.jxta.endpoint.Messenger;import net.jxta.endpoint.MessengerEvent;import net.jxta.endpoint.MessengerEventListener;import net.jxta.endpoint.OutgoingMessageEvent;import net.jxta.endpoint.OutgoingMessageEventListener;import net.jxta.endpoint.StringMessageElement;import net.jxta.peergroup.PeerGroup;import net.jxta.pipe.OutputPipe;import net.jxta.pipe.OutputPipeEvent;import net.jxta.pipe.OutputPipeListener;import net.jxta.protocol.PipeAdvertisement;import net.jxta.impl.shell.ShellApp;/** * send a file from one peer to another. destination may be an endpoint address * or a pipe. * **/class FileSender implements MessengerEventListener, OutputPipeListener { PeerGroup group; OutputPipe console; XferDaemon src; File f; int blockSize; boolean async; volatile boolean resolved = false; private class PendingMessageCounter implements OutgoingMessageEventListener { int pending = 0; int successes = 0; int failures = 0; boolean lastSuccess = false; OutgoingMessageEvent lastevent = null; /** * {@inheritDoc} **/ public synchronized void messageSendFailed( OutgoingMessageEvent event ) { lastSuccess = false; lastevent = event; pending--; failures++; notifyAll(); } /** * {@inheritDoc} **/ public synchronized void messageSendSucceeded( OutgoingMessageEvent event ) { lastSuccess = true; lastevent = event; pending--; successes++; notifyAll(); } public synchronized void addPending( ) { pending++; } public boolean stillPending( ) { return ( 0 != numPending( ) ); } public synchronized int numPending( ) { return pending; } public boolean getLastResult( ) { return lastSuccess; } public OutgoingMessageEvent getLastEvent( ) { return lastevent; } } /** * Constructs a file sender object. The sender will be activated by a call * back to either {@link #messengerReady(MessengerEvent)} or * {@link #outputPipeEvent(OutputPipeEvent)}. **/ FileSender( PeerGroup group, OutputPipe console, XferDaemon src, int blockSize, boolean async, File f ) { this.group = group; this.console = console; this.src = src; this.blockSize = blockSize; this.async = async; this.f = f; } /** * {@inheritDoc} **/ public boolean messengerReady( MessengerEvent event ) { synchronized( this ) { resolved = true; notifyAll(); } if( null != event.getMessenger() ) { send( event.getMessenger(), null ); } return true; } /** * {@inheritDoc} **/ public void outputPipeEvent( OutputPipeEvent event ) { boolean newResolve = !resolved; synchronized( this ) { group.getPipeService().removeOutputPipeListener( event.getPipeID(), this ); resolved = true; notifyAll(); } if( newResolve ) { send( null, event.getOutputPipe() ); } } // Private implementations private void print( String line ) { ShellApp.pipePrint( console, line ); } private void println( String line ) { print( line + "\n" ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -