/*
* Copyright (c) 2002-2003, The Joust Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - 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.
* - Neither the name of the Joust Project nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS 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 THE
* COPYRIGHT OWNER OR 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.
*
* File created by keith @ Apr 27, 2003
*
*/
package edu.tufts.vue.collab.im;
import net.kano.joscar.BinaryTools;
import net.kano.joscar.ByteBlock;
import net.kano.joscar.rv.RvSession;
import net.kano.joscar.rvcmd.SegmentedFilename;
import net.kano.joscar.rvproto.ft.FileTransferHeader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
public class SendFileThread extends Thread {
private RvSession rvSession;
private ServerSocket serverSocket;
public SendFileThread(RvSession rvSession, ServerSocket serverSocket) {
this.rvSession = rvSession;
this.serverSocket = serverSocket;
}
public void run() {
Timer timer = null;
try {
System.out.println("waiting for connection..");
Socket socket = serverSocket.accept();
System.out.println("got connection from " + socket.getInetAddress());
final OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// byte[] data = new byte[1024];
// int ct = in.read(data);
// System.out.println("ct=" + ct);
// System.out.println(ByteBlock.wrap(data));
FileTransferHeader fsh = new FileTransferHeader();
fsh.setDefaults();
fsh.setFileCount(1);
fsh.setFilesLeft(1);
fsh.setFilename(
SegmentedFilename.fromNativeFilename("wut up.gif"));
fsh.setFileSize(2000000);
fsh.setTotalFileSize(2000000);
fsh.setHeaderType(FileTransferHeader.HEADERTYPE_SENDHEADER);
fsh.setPartCount(1);
fsh.setPartsLeft(1);
fsh.setLastmod(System.currentTimeMillis() / 1000);
fsh.setChecksum(100);
System.out.println("writing: " + fsh);
fsh.write(out);
System.out.println("waiting for ack header..");
FileTransferHeader inFsh = FileTransferHeader.readHeader(in);
System.out.println("got ack:" + inFsh);
if (inFsh.getHeaderType() == FileTransferHeader.HEADERTYPE_RESUME) {
fsh.setHeaderType(FileTransferHeader.HEADERTYPE_RESUME_SENDHEADER);
fsh.write(out);
inFsh = FileTransferHeader.readHeader(in);
System.out.println("resumesendresponse: " + inFsh);
}
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try {
System.out.println("writing..");
out.write(new byte[100]);
} catch (IOException e) {
e.printStackTrace();
}
}
}, 10000, 2000);
for (;;) {
System.out.println("trying to read..");
int b = in.read();
if (b == -1) break;
System.out.println("got stuff: "
+ BinaryTools.describeData(ByteBlock.wrap(
new byte[] { (byte) b })));
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
if (timer != null) timer.cancel();
}
}
}