View Javadoc

1   // ========================================================================
2   // Copyright (c) 1996-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  
14  package org.eclipse.jetty.util;
15  
16  import java.io.FilterWriter;
17  import java.io.IOException;
18  import java.io.Writer;
19  
20  
21  /* ================================================================ */
22  /** Handle a multipart MIME response.
23   *
24   * 
25   * 
26  */
27  public class MultiPartWriter extends FilterWriter
28  {
29      /* ------------------------------------------------------------ */
30      private final static String __CRLF="\015\012";
31      private final static String __DASHDASH="--";
32      
33      public static String MULTIPART_MIXED=MultiPartOutputStream.MULTIPART_MIXED;
34      public static String MULTIPART_X_MIXED_REPLACE=MultiPartOutputStream.MULTIPART_X_MIXED_REPLACE;
35      
36      /* ------------------------------------------------------------ */
37      private String boundary;
38  
39      /* ------------------------------------------------------------ */
40      private boolean inPart=false;    
41      
42      /* ------------------------------------------------------------ */
43      public MultiPartWriter(Writer out)
44           throws IOException
45      {
46          super(out);
47          boundary = "jetty"+System.identityHashCode(this)+
48          Long.toString(System.currentTimeMillis(),36);
49          
50          inPart=false;
51      }
52  
53      /* ------------------------------------------------------------ */
54      /** End the current part.
55       * @exception IOException IOException
56       */
57      @Override
58      public void close()
59           throws IOException
60      {
61          if (inPart)
62              out.write(__CRLF);
63          out.write(__DASHDASH);
64          out.write(boundary);
65          out.write(__DASHDASH);
66          out.write(__CRLF);
67          inPart=false;
68          super.close();
69      }
70      
71      /* ------------------------------------------------------------ */
72      public String getBoundary()
73      {
74          return boundary;
75      }
76      
77      /* ------------------------------------------------------------ */
78      /** Start creation of the next Content.
79       */
80      public void startPart(String contentType)
81           throws IOException
82      {
83          if (inPart)
84              out.write(__CRLF);
85          out.write(__DASHDASH);
86          out.write(boundary);
87          out.write(__CRLF);
88          out.write("Content-Type: ");
89          out.write(contentType);
90          out.write(__CRLF);
91          out.write(__CRLF);
92          inPart=true;
93      }
94      
95      /* ------------------------------------------------------------ */
96      /** end creation of the next Content.
97       */
98      public void endPart()
99           throws IOException
100     {
101         if (inPart)
102             out.write(__CRLF);
103         inPart=false;
104     }
105         
106     /* ------------------------------------------------------------ */
107     /** Start creation of the next Content.
108      */
109     public void startPart(String contentType, String[] headers)
110          throws IOException
111     {
112         if (inPart)
113             out.write(__CRLF);
114         out.write(__DASHDASH);
115         out.write(boundary);
116         out.write(__CRLF);
117         out.write("Content-Type: ");
118         out.write(contentType);
119         out.write(__CRLF);
120         for (int i=0;headers!=null && i<headers.length;i++)
121         {
122             out.write(headers[i]);
123             out.write(__CRLF);
124         }
125         out.write(__CRLF);
126         inPart=true;
127     }
128     
129 }
130 
131 
132 
133