Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (c) 1994, 2002, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 package sun.net;
     27 
     28 import java.lang.StringIndexOutOfBoundsException;
     29 import java.io.*;
     30 import java.util.Vector;
     31 import sun.net.NetworkClient;
     32 
     33 /**
     34  * This class implements that basic intefaces of transfer protocols.
     35  * It is used by subclasses implementing specific protocols.
     36  *
     37  * @author      Jonathan Payne
     38  * @see         sun.net.ftp.FtpClient
     39  * @see         sun.net.nntp.NntpClient
     40  */
     41 
     42 public class TransferProtocolClient extends NetworkClient {
     43     static final boolean debug = false;
     44 
     45     /** Array of strings (usually 1 entry) for the last reply
     46         from the server. */
     47     protected Vector    serverResponse = new Vector(1);
     48 
     49     /** code for last reply */
     50     protected int       lastReplyCode;
     51 
     52 
     53     /**
     54      * Pulls the response from the server and returns the code as a
     55      * number. Returns -1 on failure.
     56      */
     57     public int readServerResponse() throws IOException {
     58         StringBuffer    replyBuf = new StringBuffer(32);
     59         int             c;
     60         int             continuingCode = -1;
     61         int             code;
     62         String          response;
     63 
     64         serverResponse.setSize(0);
     65         while (true) {
     66             while ((c = serverInput.read()) != -1) {
     67                 if (c == '\r') {
     68                     if ((c = serverInput.read()) != '\n')
     69                         replyBuf.append('\r');
     70                 }
     71                 replyBuf.append((char)c);
     72                 if (c == '\n')
     73                     break;
     74             }
     75             response = replyBuf.toString();
     76             replyBuf.setLength(0);
     77             if (debug) {
     78                 System.out.print(response);
     79             }
     80 
     81             if (response.length() == 0) {
     82                 code = -1;
     83             } else {
     84                 try {
     85                     code = Integer.parseInt(response.substring(0, 3));
     86                 } catch (NumberFormatException e) {
     87                     code = -1;
     88                 } catch (StringIndexOutOfBoundsException e) {
     89                     /* this line doesn't contain a response code, so
     90                        we just completely ignore it */
     91                     continue;
     92                 }
     93             }
     94             serverResponse.addElement(response);
     95             if (continuingCode != -1) {
     96                 /* we've seen a XXX- sequence */
     97                 if (code != continuingCode ||
     98                     (response.length() >= 4 && response.charAt(3) == '-')) {
     99                     continue;
    100                 } else {
    101                     /* seen the end of code sequence */
    102                     continuingCode = -1;
    103                     break;
    104                 }
    105             } else if (response.length() >= 4 && response.charAt(3) == '-') {
    106                 continuingCode = code;
    107                 continue;
    108             } else {
    109                 break;
    110             }
    111         }
    112 
    113         return lastReplyCode = code;
    114     }
    115 
    116     /** Sends command <i>cmd</i> to the server. */
    117     public void sendServer(String cmd) {
    118         serverOutput.print(cmd);
    119         if (debug) {
    120             System.out.print("Sending: " + cmd);
    121         }
    122     }
    123 
    124     /** converts the server response into a string. */
    125     public String getResponseString() {
    126         return (String) serverResponse.elementAt(0);
    127     }
    128 
    129     /** Returns all server response strings. */
    130     public Vector getResponseStrings() {
    131         return serverResponse;
    132     }
    133 
    134     /** standard constructor to host <i>host</i>, port <i>port</i>. */
    135     public TransferProtocolClient(String host, int port) throws IOException {
    136         super(host, port);
    137     }
    138 
    139     /** creates an uninitialized instance of this class. */
    140     public TransferProtocolClient() {}
    141 }
    142