/**
   * Read string until newline or end of stream
   *
   * @param in
   * @throws java.io.IOException
   */
  private String readln(DSpaceTokenStream in) throws IOException {

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    int b = in.read();

    while ((b != -1) && (b != '\r')) {
      bos.write(b);
      b = in.read();
    }

    if (b == '\r') {
      in.read(); // read '\n'
    }

    return new String(bos.toByteArray(), this.characterEncoding);
  }
  /**
   * Parse an inline part
   *
   * @param in
   * @param headers
   * @throws java.io.IOException
   */
  private void parseInlinePart(DSpaceTokenStream in, Hashtable headers) throws IOException {

    // Buffer incoming bytes for proper string decoding (there can be multibyte chars)
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    while (in.getState() == DSpaceTokenStream.STATE_READING) {
      int c = in.read();
      if (c != -1) bos.write(c);
    }

    String field = (String) headers.get("name");
    Vector v = (Vector) this.parts.get(field);

    if (v == null) {
      v = new Vector();
      this.parts.put(field, v);
    }

    v.add(new String(bos.toByteArray(), this.characterEncoding));
  }