Source for gnu.inet.comsat.ComsatClient

   1: /*
   2:  * ComsatClient.java
   3:  * Copyright (C) 2004 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.comsat;
  40: 
  41: import java.io.IOException;
  42: import java.net.DatagramPacket;
  43: import java.net.DatagramSocket;
  44: import java.util.StringTokenizer;
  45: 
  46: /**
  47:  * Simple comsat client.
  48:  *
  49:  * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
  50:  */
  51: public class ComsatClient
  52: {
  53: 
  54:   /**
  55:    * The default comsat port.
  56:    */
  57:   public static final int DEFAULT_PORT = 512;
  58: 
  59:   protected DatagramSocket socket;
  60: 
  61:   public ComsatClient()
  62:     throws IOException
  63:   {
  64:     this(DEFAULT_PORT, 0);
  65:   }
  66:   
  67:   public ComsatClient(int port, int timeout)
  68:     throws IOException
  69:   {
  70:     if (port < 0)
  71:       {
  72:         port = DEFAULT_PORT;
  73:       }
  74:     
  75:     socket = new DatagramSocket(port);
  76:     if (timeout > 0)
  77:       {
  78:         socket.setSoTimeout(timeout);
  79:       }
  80:     socket.setReceiveBufferSize(1024);
  81:   }
  82: 
  83:   public void close()
  84:     throws IOException
  85:   {
  86:     socket.close();
  87:   }
  88: 
  89:   public ComsatInfo read()
  90:     throws IOException
  91:   {
  92:     byte[] buf = new byte[socket.getReceiveBufferSize()];
  93:     int len = buf.length;
  94:     DatagramPacket packet = new DatagramPacket(buf, len);
  95:     socket.receive(packet);
  96:     buf = packet.getData();
  97:     len = packet.getLength();
  98:     String data = new String(buf, 0, len, "ISO-8859-1");
  99: 
 100:     ComsatInfo info = new ComsatInfo();
 101:     StringTokenizer st = new StringTokenizer(data, "\n");
 102:     String mailbox = st.nextToken();
 103:     info.setMailbox(mailbox);
 104:     boolean inBody = false;
 105:     String lastHeader = null;
 106:     while (st.hasMoreTokens())
 107:       {
 108:         String line = st.nextToken();
 109:         if (inBody)
 110:           {
 111:             String body = info.getBody();
 112:             if (body == null)
 113:               {
 114:                 body = line;
 115:               }
 116:             else
 117:               {
 118:                 body += "\n" + line;
 119:               }
 120:             info.setBody(body);
 121:           }
 122:         else
 123:           {
 124:             if (line.length() == 0)
 125:               {
 126:                 inBody = true;
 127:               }
 128:             else
 129:               {
 130:                 int ci = line.indexOf(':');
 131:                 if (ci != -1)
 132:                   {
 133:                     lastHeader = line.substring(0, ci);
 134:                     info.setHeader(lastHeader,
 135:                                    line.substring(ci + 1).trim());
 136:                   }
 137:                 else
 138:                   {
 139:                     String val = info.getHeader(lastHeader);
 140:                     val += "\n" + line;
 141:                     info.setHeader(lastHeader, val);
 142:                   }
 143:               }
 144:           }
 145:       }
 146:     return info;
 147:   }
 148: 
 149: }