Source for gnu.inet.gopher.GopherConnection

   1: /*
   2:  * GopherConnection.java
   3:  * Copyright (C) 2003 The Free Software Foundation
   4:  * 
   5:  * This file is part of GNU inetlib, a library.
   6:  * 
   7:  * GNU inetlib is free software; you can redistribute it and/or modify
   8:  * it under the terms of the GNU General Public License as published by
   9:  * the Free Software Foundation; either version 2 of the License, or
  10:  * (at your option) any later version.
  11:  * 
  12:  * GNU inetlib is distributed in the hope that it will be useful,
  13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15:  * GNU General Public License for more details.
  16:  * 
  17:  * You should have received a copy of the GNU General Public License
  18:  * along with this library; if not, write to the Free Software
  19:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20:  *
  21:  * Linking this library statically or dynamically with other modules is
  22:  * making a combined work based on this library.  Thus, the terms and
  23:  * conditions of the GNU General Public License cover the whole
  24:  * combination.
  25:  *
  26:  * As a special exception, the copyright holders of this library give you
  27:  * permission to link this library with independent modules to produce an
  28:  * executable, regardless of the license terms of these independent
  29:  * modules, and to copy and distribute the resulting executable under
  30:  * terms of your choice, provided that you also meet, for each linked
  31:  * independent module, the terms and conditions of the license of that
  32:  * module.  An independent module is a module which is not derived from
  33:  * or based on this library.  If you modify this library, you may extend
  34:  * this exception to your version of the library, but you are not
  35:  * obliged to do so.  If you do not wish to do so, delete this
  36:  * exception statement from your version.
  37:  */
  38: 
  39: package gnu.inet.gopher;
  40: 
  41: import java.io.InputStream;
  42: import java.io.IOException;
  43: import java.io.OutputStream;
  44: import java.net.Socket;
  45: 
  46: import gnu.inet.util.CRLFInputStream;
  47: import gnu.inet.util.MessageInputStream;
  48: 
  49: /**
  50:  * A gopher client.
  51:  *
  52:  * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
  53:  */
  54: public class GopherConnection
  55: {
  56: 
  57:   /**
  58:    * The default gopher port.
  59:    */
  60:   public static final int DEFAULT_PORT = 80;
  61: 
  62:   protected Socket socket;
  63:   protected InputStream in;
  64:   protected OutputStream out;
  65: 
  66:   /**
  67:    * Creates a new connection to the gopher server at the specified
  68:    * hostname.
  69:    * @param hostname the hostname
  70:    */
  71:   public GopherConnection(String host)
  72:     throws IOException
  73:   {
  74:     this(host, DEFAULT_PORT);
  75:   }
  76:   
  77:   /**
  78:    * Creates a new connection to the gopher server at the specified
  79:    * hostname with the specified non-standard port.
  80:    * @param hostname the hostname
  81:    * @param port the non-standard port to use
  82:    */
  83:   public GopherConnection(String host, int port)
  84:     throws IOException
  85:   {
  86:     if (port <= 0)
  87:       {
  88:         port = DEFAULT_PORT;
  89:       }
  90:     
  91:     socket = new Socket(host, port);
  92:     in = socket.getInputStream();
  93:     out = socket.getOutputStream();
  94:   }
  95:   
  96:   /**
  97:    * Returns the directory listing for this gopher server.
  98:    * When all entries have been read from the listing, the connection will
  99:    * be closed.
 100:    */
 101:   public DirectoryListing list()
 102:     throws IOException
 103:   {
 104:     byte[] CRLF = { 0x0d, 0x0a };
 105:     out.write(CRLF);
 106:     out.flush();
 107:     InputStream listStream = new CRLFInputStream(in);
 108:     listStream = new MessageInputStream(listStream);
 109:     return new DirectoryListing(listStream);
 110:   }
 111:   
 112:   /**
 113:    * Returns the resource identified by the specified selector.
 114:    * If the resource is text-based, it will need to be wrapped in a
 115:    * CRLFInputStream.
 116:    */
 117:   public InputStream get(String selector)
 118:     throws IOException
 119:   {
 120:     byte[] chars = selector.getBytes("US-ASCII");
 121:     byte[] line = new byte[chars.length + 2];
 122:     System.arraycopy(chars, 0, line, 0, chars.length);
 123:     line[chars.length] = 0x0d;
 124:     line[chars.length + 1] = 0x0a;
 125:     out.write(line);
 126:     out.flush();
 127:     return in;
 128:   }
 129: 
 130: }