001: /*
002: * @(#)TransferProtocolClient.java 1.38 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package sun.net;
029:
030: import java.lang.StringIndexOutOfBoundsException;
031: import java.io.*;
032: import java.util.Vector;
033: import sun.net.NetworkClient;
034:
035: /**
036: * This class implements that basic intefaces of transfer protocols.
037: * It is used by subclasses implementing specific protocols.
038: *
039: * @version 1.33, 08/19/02
040: * @author Jonathan Payne
041: * @see sun.net.ftp.FtpClient
042: * @see sun.net.nntp.NntpClient
043: */
044:
045: public class TransferProtocolClient extends NetworkClient {
046: static final boolean debug = false;
047: /** Array of strings (usually 1 entry) for the last reply
048: from the server. */
049: protected Vector serverResponse = new Vector(1);
050: /** code for last reply */
051: protected int lastReplyCode;
052:
053: /**
054: * Pulls the response from the server and returns the code as a
055: * number. Returns -1 on failure.
056: */
057: public int readServerResponse() throws IOException {
058: StringBuffer replyBuf = new StringBuffer(32);
059: int c;
060: int continuingCode = -1;
061: int code;
062: String response;
063: serverResponse.setSize(0);
064: while (true) {
065: while ((c = serverInput.read()) != -1) {
066: if (c == '\r') {
067: if ((c = serverInput.read()) != '\n')
068: replyBuf.append('\r');
069: }
070: replyBuf.append((char) c);
071: if (c == '\n')
072: break;
073: }
074: response = replyBuf.toString();
075: replyBuf.setLength(0);
076: if (debug) {
077: System.out.print(response);
078: }
079: try {
080: code = Integer.parseInt(response.substring(0, 3));
081: } catch (NumberFormatException e) {
082: code = -1;
083: } catch (StringIndexOutOfBoundsException e) {
084: /* this line doesn't contain a response code, so
085: we just completely ignore it */
086: continue;
087: }
088: serverResponse.addElement(response);
089: if (continuingCode != -1) {
090: /* we've seen a sequence */
091: if (code != continuingCode
092: || (response.length() >= 4 && response
093: .charAt(3) == '-')) {
094: continue;
095: } else {
096: /* seen the end of code sequence */
097: continuingCode = -1;
098: break;
099: }
100: } else if (response.length() >= 4
101: && response.charAt(3) == '-') {
102: continuingCode = code;
103: continue;
104: } else {
105: break;
106: }
107: }
108: return lastReplyCode = code;
109: }
110:
111: /** Sends command <i>cmd</i> to the server. */
112: public void sendServer(String cmd) {
113: serverOutput.print(cmd);
114: if (debug) {
115: System.out.print("Sending: " + cmd);
116: }
117: }
118:
119: /** converts the server response into a string. */
120: public String getResponseString() {
121: return (String) serverResponse.elementAt(0);
122: }
123:
124: /** Returns all server response strings. */
125: public Vector getResponseStrings() {
126: return serverResponse;
127: }
128:
129: /** standard constructor to host <i>host</i>, port <i>port</i>. */
130: public TransferProtocolClient(String host, int port)
131: throws IOException {
132: super (host, port);
133: }
134:
135: /** creates an uninitialized instance of this class. */
136: public TransferProtocolClient() {
137: }
138: }
|