1 import com.sun.star.uno.UnoRuntime;
2 import com.sun.star.lang.XMultiComponentFactory;
3 import com.sun.star.uno.XComponentContext;
4 import com.sun.star.script.framework.runtime.XScriptContext;
5 import com.sun.star.util.XStringSubstitution;
6 
7 import javax.mail.*;
8 import javax.activation.*;
9 
10 import java.io.*;
11 
12 
13 public class MimeConfiguration
14 {
15 
16 	// Office Installation path
17 	private static String instPath = "";
18 
19 
20 	public static boolean createFiles( XScriptContext xsc )
21 	{
22 		try
23 		{
24 			XComponentContext xcc = xsc.getComponentContext();
25 			XMultiComponentFactory xmf = xcc.getServiceManager();
26 
27 			Object pathSub = xmf.createInstanceWithContext( "com.sun.star.comp.framework.PathSubstitution", xcc );
28 			XStringSubstitution stringSub = ( XStringSubstitution ) UnoRuntime.queryInterface( XStringSubstitution.class, pathSub );
29 			instPath = stringSub.getSubstituteVariableValue( "$(inst)" );
30 
31 		}
32 		catch( com.sun.star.beans.UnknownPropertyException upe )
33 		{
34 			System.out.println( "com.sun.star.beans.UnknownPropertyException" );
35 			upe.printStackTrace();
36 		}
37 		catch( com.sun.star.uno.Exception e )
38 		{
39 			System.out.println( "com.sun.star.uno.Exception" );
40 			e.printStackTrace();
41 		}
42 
43 		writeMailCap();
44 		writeMimeTypes();
45 
46 		// ToDo: include status feedback to StatusWindow
47 		return true;
48 	}
49 
50 
51 
52 
53 	private static void writeMailCap()
54 	{
55 		String mailcapPath = getConfigDir() + System.getProperty( "file.separator" ) + "mailcap";
56 
57 		try
58 		{
59 	                if( ! new File( java.net.URLDecoder.decode( mailcapPath )  ).exists() )
60        	                {
61 				//System.out.println( "URLDecoder: " + java.net.URLDecoder.decode( mailcapPath ) );
62 				File mailcapFile = new File( mailcapPath );
63 				FileWriter out = new FileWriter( mailcapFile );
64 				String[] lines = getMailcapText();
65 				for( int i=0; i<lines.length; i++ )
66 				{
67 					out.write( lines[i], 0, lines[i].length() );
68 				}
69 				out.close();
70                 	}
71                 	else
72                 	{
73 				//System.out.println( "URLDecoder: " + java.net.URLDecoder.decode( mailcapPath ) );
74                 	}
75 
76 
77 
78 			// use prog dir, if not there then java.io to create/write new file
79 			MailcapCommandMap map = new MailcapCommandMap( mailcapPath );
80 			CommandMap.setDefaultCommandMap ( map );
81 		}
82 		catch( IOException ioe )
83 		{
84 			ioe.printStackTrace();
85 		}
86 		catch( Exception e )
87 		{
88 			e.printStackTrace();
89 		}
90 	}
91 
92 
93 	private static String[] getMailcapText()
94 	{
95 		String[] mailcapText = {
96 			"#\n",
97 			"# Default mailcap file for the JavaMail System.\n",
98 			"#\n",
99 			"# JavaMail content-handlers:\n",
100 			"#\n",
101 			"text/plain;;            x-java-content-handler=com.sun.mail.handlers.text_plain\n",
102 			"text/html;;             x-java-content-handler=com.sun.mail.handlers.text_html\n",
103 			"text/xml;;              x-java-content-handler=com.sun.mail.handlers.text_xml\n",
104 			"image/gif;;             x-java-content-handler=com.sun.mail.handlers.image_gif\n",
105 			"image/jpeg;;            x-java-content-handler=com.sun.mail.handlers.image_jpeg\n",
106 			"multipart/*;;           x-java-content-handler=com.sun.mail.handlers.multipart_mixed\n",
107 			"message/rfc822;;        x-java-content-handler=com.sun.mail.handlers.message_rfc822\n"
108 		};
109 
110 		return mailcapText;
111 	}
112 
113 
114 
115 	private static void writeMimeTypes()
116 	{
117 		String mimetypesPath = getConfigDir() + System.getProperty( "file.separator" ) + "mimetypes.default";
118 
119 		try
120 		{
121 	                if( ! new File( java.net.URLDecoder.decode( mimetypesPath )  ).exists() )
122        	                {
123 				//System.out.println( "URLDecoder: " + java.net.URLDecoder.decode( mimetypesPath ) );
124 				File mimetypesFile = new File( mimetypesPath );
125 				FileWriter out = new FileWriter( mimetypesFile );
126 				String[] lines = getMimeTypesText();
127 				for( int i=0; i<lines.length; i++ )
128 				{
129 					out.write( lines[i], 0, lines[i].length() );
130 				}
131 				out.close();
132                 	}
133                 	else
134                 	{
135 				//System.out.println( "URLDecoder: " + java.net.URLDecoder.decode( mimetypesPath ) );
136                 	}
137 
138 			MimetypesFileTypeMap mimeTypes = new MimetypesFileTypeMap( mimetypesPath );
139                     	FileTypeMap.setDefaultFileTypeMap( mimeTypes );
140 		}
141 		catch( IOException ioe )
142 		{
143 			ioe.printStackTrace();
144 		}
145 		catch( Exception e )
146 		{
147 			e.printStackTrace();
148 		}
149 	}
150 
151 
152 	private static String[] getMimeTypesText()
153 	{
154 		String[] mimesText = {
155 			"#\n",
156 			"# A simple, old format, mime.types file\n",
157 			"#\n",
158 			"text/html               html htm HTML HTM\n",
159 			"text/plain              txt text TXT TEXT\n",
160 			"image/gif               gif GIF\n",
161 			"image/ief               ief\n",
162 			"image/jpeg              jpeg jpg jpe JPG\n",
163 			"image/tiff              tiff tif\n",
164 			"image/x-xwindowdump     xwd\n",
165 			"application/postscript  ai eps ps\n",
166 			"application/rtf         rtf\n",
167 			"application/x-tex       tex\n",
168 			"application/x-texinfo   texinfo texi\n",
169 			"application/x-troff     t tr roff\n",
170 			"audio/basic             au\n",
171 			"audio/midi              midi mid\n",
172 			"audio/x-aifc            aifc\n",
173 			"audio/x-aiff            aif aiff\n",
174 			"audio/x-mpeg            mpeg mpg\n",
175 			"audio/x-wav             wav\n",
176 			"video/mpeg              mpeg mpg mpe\n",
177 			"video/quicktime         qt mov\n",
178 			"video/x-msvideo         avi\n"
179 		};
180 
181 		return mimesText;
182 	}
183 
184 
185 	private static String getConfigDir()
186 	{
187 		// mailcap file must be written to the Office user/config  directory
188 
189                 // instPath is a URL, needs to be converted to a system pathname
190                 String config = instPath + "/user/config";
191                 String configNonURL = "";
192 
193                 if( System.getProperty( "os.name" ).indexOf( "Windows" ) != -1 )
194                 {
195                         // Windows
196                         // removes "file:///"
197                         int start = 8;
198                         configNonURL = config.substring( start, config.length() );
199                         // Convert forward to back-slashes
200                         while( configNonURL.indexOf( "/" ) != -1 )
201                         {
202                                 int fSlash = configNonURL.indexOf( "/" );
203                                 String firstPart = configNonURL.substring( 0, fSlash );
204                                 String secondPart = configNonURL.substring( fSlash + 1, configNonURL.length() );
205                                 configNonURL = firstPart + "\\" + secondPart;
206                         }
207                 }
208                 else
209                 {
210                         // Unix/Linux
211                         // removes "file://"
212                         int start = 7;
213                         configNonURL = config.substring( start, config.length() );
214                 }
215 
216 		return configNonURL;
217 	}
218 
219 }
220