001: /**
002: *
003: * Java FTP client library.
004: *
005: * Copyright (C) 2000-2003 Enterprise Distributed Technologies Ltd
006: *
007: * www.enterprisedt.com
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022: *
023: * Bug fixes, suggestions and comments should be sent to bruce@enterprisedt.com
024: *
025: * Change Log:
026: *
027: * $Log: FTPDataSocket.java,v $
028: * Revision 1.1.1.1 2005/06/23 15:22:58 smontoro
029: * hipergate backend
030: *
031: * Revision 1.1 2004/02/07 03:15:20 hipergate
032: * v2.0 pre-alpha
033: *
034: * Revision 1.3 2003/05/31 14:53:44 bruceb
035: * 1.2.2 changes
036: *
037: * Revision 1.2 2002/11/19 22:01:25 bruceb
038: * changes for 1.2
039: *
040: * Revision 1.1 2001/10/09 20:53:46 bruceb
041: * Active mode changes
042: *
043: * Revision 1.1 2001/10/05 14:42:03 bruceb
044: * moved from old project
045: *
046: */package com.enterprisedt.net.ftp;
047:
048: import java.io.IOException;
049: import java.io.InputStream;
050: import java.io.OutputStream;
051:
052: import java.net.Socket;
053: import java.net.ServerSocket;
054:
055: /**
056: * Supports client-side FTP DataSocket in Passive and Active Mode.
057: * Wrapper for Socket and ServerSocket. Methods are package access
058: * only - not for public use.
059: *
060: * @author Vladyslav Skarzhevsky
061: * @version $Revision: 1.1.1.1 $
062: */
063:
064: public class FTPDataSocket {
065:
066: /**
067: * Revision control id
068: */
069: private static String cvsId = "@(#)$Id: FTPDataSocket.java,v 1.1.1.1 2005/06/23 15:22:58 smontoro Exp $";
070:
071: /**
072: * The underlying socket for Active connection.
073: */
074: private ServerSocket activeSocket = null;
075:
076: /**
077: * The underlying socket for PASV connection or Socket accepted from server.
078: */
079: private Socket passiveSocket = null;
080:
081: /**
082: * Create socket wrapper for Active connection.
083: */
084: FTPDataSocket(ServerSocket s) {
085: activeSocket = s;
086: }
087:
088: /**
089: * Create socket wrapper for PASV connection.
090: */
091: FTPDataSocket(Socket s) {
092: passiveSocket = s;
093: }
094:
095: /**
096: * Set the TCP timeout on the underlying control socket.
097: *
098: * If a timeout is set, then any operation which
099: * takes longer than the timeout value will be
100: * killed with a java.io.InterruptedException.
101: *
102: * @param millis The length of the timeout, in milliseconds
103: */
104: void setTimeout(int millis) throws IOException {
105:
106: if (passiveSocket != null)
107: passiveSocket.setSoTimeout(millis);
108: else if (activeSocket != null)
109: activeSocket.setSoTimeout(millis);
110: }
111:
112: /**
113: * If active mode, accepts the FTP server's connection - in PASV,
114: * we are already connected. Then gets the output stream of
115: * the connection
116: *
117: * @return output stream for underlying socket.
118: */
119: OutputStream getOutputStream() throws IOException {
120:
121: if (passiveSocket != null) {
122: return passiveSocket.getOutputStream();
123: } else {
124: // accept socket from server, in Active mode
125: passiveSocket = activeSocket.accept();
126: // get and return its OutputStream
127: return passiveSocket.getOutputStream();
128: }
129: }
130:
131: /**
132: * If active mode, accepts the FTP server's connection - in PASV,
133: * we are already connected. Then gets the input stream of
134: * the connection
135: *
136: * @return input stream for underlying socket.
137: */
138: InputStream getInputStream() throws IOException {
139:
140: if (passiveSocket != null) {
141: return passiveSocket.getInputStream();
142: } else {
143: // accept socket from server, in Active mode
144: passiveSocket = activeSocket.accept();
145: // get and return it's InputStream
146: return passiveSocket.getInputStream();
147: }
148: }
149:
150: /**
151: * Closes underlying sockets.
152: */
153: void close() throws IOException {
154:
155: if (passiveSocket != null)
156: passiveSocket.close();
157: if (activeSocket != null)
158: activeSocket.close();
159: }
160: }
|