2 * XdccDownloader - DccReceiver.java - Copyright © 2013 David Roden
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.pterodactylus.irc;
20 import java.io.IOException;
21 import java.io.InputStream;
22 import java.io.OutputStream;
23 import java.net.InetAddress;
24 import java.net.Socket;
25 import java.util.logging.Level;
26 import java.util.logging.Logger;
28 import net.pterodactylus.irc.event.DccSendReceived;
30 import com.google.common.util.concurrent.AbstractExecutionThreadService;
33 * Service that receives a file offered by a {@link DccSendReceived}.
35 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
37 public class DccReceiver extends AbstractExecutionThreadService {
40 private static final Logger logger = Logger.getLogger(DccReceiver.class.getName());
42 /** The address to connect to. */
43 private final InetAddress inetAddress;
45 /** The port number to connect to. */
46 private final int port;
48 /** The name of the file being offered. */
49 private final String filename;
51 /** The size of the file being offered. */
52 private final long size;
54 /** The output stream to write the file to. */
55 private final OutputStream outputStream;
57 /** The number of bytes already written. */
58 private long progress;
61 * Creates a new DCC receiver.
64 * The address to connect to
66 * The port number to connect to
68 * The name of the file being downloaded
70 * The size of the file being downloaded, or {@code -1} if the size is not
73 * The output stream to write the file to
75 public DccReceiver(InetAddress inetAddress, int port, String filename, long size, OutputStream outputStream) {
76 this.inetAddress = inetAddress;
78 this.filename = filename;
80 this.outputStream = outputStream;
88 * Returns the name of the file being downloaded. The name is not used by the
89 * DCC receiver, it only serves as a kind of identifier.
91 * @return The name of the file being downloaded
93 public String filename() {
98 * Returns the size of the file being downloaded. If the size of the file is
99 * not known, {@code -1} is returned.
101 * @return The size of the file being downloaded, or {@code -1} if the size is
109 * Returns the number of bytes that have already been downloaded.
111 * @return The number of bytes that have already been downloaded
113 public long progress() {
118 // ABSTRACTEXECUTIONTHREADSERVICE METHODS
122 protected void run() throws Exception {
123 Socket socket = null;
125 socket = new Socket(inetAddress, port);
126 InputStream socketInputStream = socket.getInputStream();
127 byte[] buffer = new byte[65536];
129 int r = socketInputStream.read(buffer);
134 outputStream.write(buffer, 0, r);
137 } catch (IOException ioe1) {
138 logger.log(Level.WARNING, "I/O error while receiving DCC!", ioe1);