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      public void close()
58           throws IOException
59      {
60          if (inPart)
61              out.write(__CRLF);
62          out.write(__DASHDASH);
63          out.write(boundary);
64          out.write(__DASHDASH);
65          out.write(__CRLF);
66          inPart=false;
67          super.close();
68      }
69      
70      /* ------------------------------------------------------------ */
71      public String getBoundary()
72      {
73          return boundary;
74      }
75      
76      /* ------------------------------------------------------------ */
77      /** Start creation of the next Content.
78       */
79      public void startPart(String contentType)
80           throws IOException
81      {
82          if (inPart)
83              out.write(__CRLF);
84          out.write(__DASHDASH);
85          out.write(boundary);
86          out.write(__CRLF);
87          out.write("Content-Type: ");
88          out.write(contentType);
89          out.write(__CRLF);
90          out.write(__CRLF);
91          inPart=true;
92      }
93      
94      /* ------------------------------------------------------------ */
95      /** end creation of the next Content.
96       */
97      public void endPart()
98           throws IOException
99      {
100         if (inPart)
101             out.write(__CRLF);
102         inPart=false;
103     }
104         
105     /* ------------------------------------------------------------ */
106     /** Start creation of the next Content.
107      */
108     public void startPart(String contentType, String[] headers)
109          throws IOException
110     {
111         if (inPart)
112             out.write(__CRLF);
113         out.write(__DASHDASH);
114         out.write(boundary);
115         out.write(__CRLF);
116         out.write("Content-Type: ");
117         out.write(contentType);
118         out.write(__CRLF);
119         for (int i=0;headers!=null && i<headers.length;i++)
120         {
121             out.write(headers[i]);
122             out.write(__CRLF);
123         }
124         out.write(__CRLF);
125         inPart=true;
126     }
127     
128 }
129 
130 
131 
132