Source for gnu.inet.finger.FingerConnection

   1: /*
   2:  * FingerConnection.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.finger;
  40: 
  41: import java.io.BufferedOutputStream;
  42: import java.io.ByteArrayOutputStream;
  43: import java.io.InputStream;
  44: import java.io.IOException;
  45: import java.io.OutputStream;
  46: import java.net.Socket;
  47: 
  48: /**
  49:  * A client for the finger protocol described in RFC 1288.
  50:  *
  51:  * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
  52:  */
  53: public class FingerConnection
  54: {
  55: 
  56:   /**
  57:    * The default finger port.
  58:    */
  59:   public static final int DEFAULT_PORT = 79;
  60: 
  61:   /*
  62:    * The US-ASCII encoding.
  63:    */
  64:   private static final String US_ASCII = "US-ASCII";
  65: 
  66:   /**
  67:    * The underlying socket used for communications.
  68:    */
  69:   protected Socket socket;
  70: 
  71:   /**
  72:    * If we want a verbose response.
  73:    */
  74:   protected boolean verbose;
  75: 
  76:   /**
  77:    * Creates a new finger connection.
  78:    * @param host the name of the internet host to connect to
  79:    */
  80:   public FingerConnection(String host)
  81:     throws IOException
  82:   {
  83:     this(host, DEFAULT_PORT);
  84:   }
  85: 
  86:   /**
  87:    * Creates a new finger connection.
  88:    * @param host the name of the internet host to connect to
  89:    * @param port the port to connect to
  90:    */
  91:   public FingerConnection(String host, int port)
  92:     throws IOException
  93:   {
  94:     socket = new Socket(host, port);
  95:   }
  96: 
  97:   /**
  98:    * Retrieves the verbose flag.
  99:    * If true, the server should provide more output.
 100:    */
 101:   public boolean isVerbose()
 102:   {
 103:     return verbose;
 104:   }
 105: 
 106:   /**
 107:    * Sets the verbose flag.
 108:    * If true, the server should provide more output.
 109:    * @param verbose true for more verbose, false otherwise
 110:    */
 111:   public void setVerbose(boolean verbose)
 112:   {
 113:     this.verbose = verbose;
 114:   }
 115: 
 116:   /**
 117:    * Lists the available users.
 118:    */
 119:   public String list()
 120:     throws IOException
 121:   {
 122:     return finger(null, null);
 123:   }
 124: 
 125:   /**
 126:    * Fingers the specified user.
 127:    * @param username the user to finger
 128:    * @return information about all matching users
 129:    */
 130:   public String finger(String username)
 131:     throws IOException
 132:   {
 133:     return finger(username, null);
 134:   }
 135: 
 136:   /**
 137:    * Fingers the specified user at the specified host.
 138:    * @param username the user to finger (null for any user)
 139:    * @param hostname the domain of the user (null for any domain)
 140:    * @return information about all matching users
 141:    */
 142:   public String finger(String username, String hostname)
 143:     throws IOException
 144:   {
 145:     // Send the command
 146:     OutputStream out = socket.getOutputStream();
 147:     out = new BufferedOutputStream(out);
 148:     if (verbose)
 149:       {
 150:         out.write('/');
 151:         out.write('W');
 152:         if (username != null || hostname != null)
 153:           {
 154:             out.write(' ');
 155:           }
 156:       }
 157:     if (username != null)
 158:       {
 159:         out.write(username.getBytes(US_ASCII));
 160:       }
 161:     if (hostname != null)
 162:       {
 163:         out.write('@');
 164:         out.write(hostname.getBytes(US_ASCII));
 165:       }
 166:     out.write('\r');
 167:     out.write('\n');
 168:     out.flush();
 169:       
 170:     // Read the response
 171:     InputStream in = socket.getInputStream();
 172:     ByteArrayOutputStream acc = new ByteArrayOutputStream();
 173:     byte[] buf = new byte[4096];
 174:     for (int len = in.read(buf); len != -1; len = in.read(buf))
 175:       {
 176:         acc.write(buf, 0, len);
 177:       }
 178:     return acc.toString(US_ASCII);
 179:   }
 180: 
 181: }