Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <tools/wldcrd.hxx>
21 : #include <rtl/instance.hxx>
22 : #include <svl/inettype.hxx>
23 : #include <svl/svl.hrc>
24 :
25 : #include <boost/ptr_container/ptr_map.hpp>
26 :
27 : #include "getstringresource.hxx"
28 :
29 : namespace
30 : {
31 :
32 : struct MediaTypeEntry
33 : {
34 : sal_Char const * m_pTypeName;
35 : INetContentType m_eTypeID;
36 : sal_Char const * m_pExtension;
37 : };
38 :
39 0 : struct TypeIDMapEntry
40 : {
41 : OUString m_aTypeName;
42 : OUString m_aPresentation;
43 : OUString m_aSystemFileType;
44 : };
45 :
46 0 : struct TypeNameMapEntry
47 : {
48 : OUString m_aExtension;
49 : INetContentType m_eTypeID;
50 :
51 0 : TypeNameMapEntry():
52 0 : m_eTypeID(CONTENT_TYPE_UNKNOWN) {}
53 : };
54 :
55 : struct ExtensionMapEntry
56 : {
57 : INetContentType m_eTypeID;
58 :
59 0 : ExtensionMapEntry():
60 0 : m_eTypeID(CONTENT_TYPE_UNKNOWN) {}
61 : };
62 :
63 : class Registration
64 : {
65 : typedef boost::ptr_map<OUString, TypeNameMapEntry> TypeNameMap;
66 : typedef boost::ptr_map<OUString, ExtensionMapEntry> ExtensionMap;
67 : typedef std::map<INetContentType, TypeIDMapEntry*> TypeIDMap;
68 :
69 : TypeIDMap m_aTypeIDMap; // map ContentType to TypeID
70 : TypeNameMap m_aTypeNameMap; // map TypeName to TypeID, Extension
71 : ExtensionMap m_aExtensionMap; // map Extension to TypeID
72 : sal_uInt32 m_nNextDynamicID;
73 :
74 : public:
75 0 : Registration(): m_nNextDynamicID(CONTENT_TYPE_LAST + 1) {}
76 :
77 : ~Registration();
78 : public:
79 : static inline TypeIDMapEntry * getEntry(INetContentType eTypeID);
80 :
81 : static TypeNameMapEntry * getExtensionEntry(OUString const & rTypeName);
82 :
83 : static INetContentType RegisterContentType(OUString const & rTypeName,
84 : OUString const & rPresentation,
85 : OUString const * pExtension,
86 : OUString const * pSystemFileType);
87 :
88 : static INetContentType GetContentType(OUString const & rTypeName);
89 :
90 : static OUString GetContentType(INetContentType eTypeID);
91 :
92 : static OUString GetPresentation(INetContentType eTypeID);
93 :
94 : static INetContentType GetContentType4Extension(OUString const & rExtension);
95 :
96 : };
97 :
98 : namespace
99 : {
100 : struct theRegistration
101 : : public rtl::Static< Registration, theRegistration > {};
102 : }
103 :
104 : // static
105 0 : inline TypeIDMapEntry * Registration::getEntry(INetContentType eTypeID)
106 : {
107 0 : Registration &rRegistration = theRegistration::get();
108 :
109 0 : TypeIDMap::iterator it = rRegistration.m_aTypeIDMap.find( eTypeID );
110 0 : if( it != rRegistration.m_aTypeIDMap.end() )
111 0 : return it->second;
112 : else
113 0 : return NULL;
114 : }
115 :
116 : MediaTypeEntry const * seekEntry(OUString const & rTypeName,
117 : MediaTypeEntry const * pMap, sal_Size nSize);
118 :
119 : /** A mapping from type names to type ids and extensions. Sorted by type
120 : name.
121 : */
122 : MediaTypeEntry const aStaticTypeNameMap[CONTENT_TYPE_LAST + 1]
123 : = { { " ", CONTENT_TYPE_UNKNOWN, "" },
124 : { CONTENT_TYPE_STR_X_CNT_FSYSBOX, CONTENT_TYPE_X_CNT_FSYSBOX, "tmp" },
125 : { CONTENT_TYPE_STR_X_CNT_FSYSFOLDER, CONTENT_TYPE_X_CNT_FSYSFOLDER,
126 : "tmp" },
127 : { CONTENT_TYPE_STR_X_CNT_FSYSSPECIALFOLDER,
128 : CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER, "tmp" },
129 : { CONTENT_TYPE_STR_APP_OCTSTREAM, CONTENT_TYPE_APP_OCTSTREAM, "tmp" },
130 : { CONTENT_TYPE_STR_APP_PDF, CONTENT_TYPE_APP_PDF, "pdf" },
131 : { CONTENT_TYPE_STR_APP_RTF, CONTENT_TYPE_APP_RTF, "rtf" },
132 : { CONTENT_TYPE_STR_APP_VND_CALC, CONTENT_TYPE_APP_VND_CALC, "sdc" },
133 : { CONTENT_TYPE_STR_APP_VND_CHART, CONTENT_TYPE_APP_VND_CHART, "sds" },
134 : { CONTENT_TYPE_STR_APP_VND_DRAW, CONTENT_TYPE_APP_VND_DRAW, "sda" },
135 : { CONTENT_TYPE_STR_APP_VND_IMAGE, CONTENT_TYPE_APP_VND_IMAGE, "sim" },
136 : { CONTENT_TYPE_STR_APP_VND_IMPRESS, CONTENT_TYPE_APP_VND_IMPRESS,
137 : "sdd" },
138 : { CONTENT_TYPE_STR_APP_VND_IMPRESSPACKED,
139 : CONTENT_TYPE_APP_VND_IMPRESSPACKED, "sdp" },
140 : { CONTENT_TYPE_STR_APP_VND_MAIL, CONTENT_TYPE_APP_VND_MAIL, "sdm" },
141 : { CONTENT_TYPE_STR_APP_VND_MATH, CONTENT_TYPE_APP_VND_MATH, "smf" },
142 : { CONTENT_TYPE_STR_APP_VND_NEWS, CONTENT_TYPE_APP_VND_NEWS, "sdm" },
143 : { CONTENT_TYPE_STR_APP_VND_OUTTRAY, CONTENT_TYPE_APP_VND_OUTTRAY,
144 : "sdm" },
145 : { CONTENT_TYPE_STR_APP_VND_TEMPLATE, CONTENT_TYPE_APP_VND_TEMPLATE,
146 : "vor" },
147 : { CONTENT_TYPE_STR_APP_VND_WRITER, CONTENT_TYPE_APP_VND_WRITER,
148 : "sdw" },
149 : { CONTENT_TYPE_STR_APP_VND_WRITER_GLOBAL,
150 : CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "sgl" },
151 : { CONTENT_TYPE_STR_APP_VND_WRITER_WEB,
152 : CONTENT_TYPE_APP_VND_WRITER_WEB, "htm" },
153 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_CALC, CONTENT_TYPE_APP_VND_SUN_XML_CALC, "sxc" },
154 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_CHART, CONTENT_TYPE_APP_VND_SUN_XML_CHART, "sxs" },
155 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_DRAW, CONTENT_TYPE_APP_VND_SUN_XML_DRAW, "sxd" },
156 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_IMPRESS, CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS, "sxi" },
157 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_IMPRESSPACKED, CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED, "sxp" },
158 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_MATH, CONTENT_TYPE_APP_VND_SUN_XML_MATH, "sxm" },
159 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_WRITER, CONTENT_TYPE_APP_VND_SUN_XML_WRITER, "sxw" },
160 : { CONTENT_TYPE_STR_APP_VND_SUN_XML_WRITER_GLOBAL, CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL, "sxg" },
161 : { CONTENT_TYPE_STR_APP_FRAMESET, CONTENT_TYPE_APP_FRAMESET, "sfs" },
162 : { CONTENT_TYPE_STR_APP_GALLERY, CONTENT_TYPE_APP_GALLERY, "gal" },
163 : { CONTENT_TYPE_STR_APP_GALLERY_THEME, CONTENT_TYPE_APP_GALLERY_THEME,
164 : "thm" },
165 : { CONTENT_TYPE_STR_APP_JAR, CONTENT_TYPE_APP_JAR, "jar" },
166 : { CONTENT_TYPE_STR_APP_MACRO, CONTENT_TYPE_APP_MACRO, "tmp" },
167 : { CONTENT_TYPE_STR_APP_MSEXCEL, CONTENT_TYPE_APP_MSEXCEL, "xls" },
168 : { CONTENT_TYPE_STR_APP_MSEXCEL_TEMPL, CONTENT_TYPE_APP_MSEXCEL_TEMPL,
169 : "xlt" },
170 : { CONTENT_TYPE_STR_APP_MSPPOINT, CONTENT_TYPE_APP_MSPPOINT, "ppt" },
171 : { CONTENT_TYPE_STR_APP_MSPPOINT_TEMPL,
172 : CONTENT_TYPE_APP_MSPPOINT_TEMPL, "pot" },
173 : { CONTENT_TYPE_STR_APP_MSWORD, CONTENT_TYPE_APP_MSWORD, "doc" },
174 : { CONTENT_TYPE_STR_APP_MSWORD_TEMPL, CONTENT_TYPE_APP_MSWORD_TEMPL,
175 : "dot" },
176 : { CONTENT_TYPE_STR_APP_STARCALC, CONTENT_TYPE_APP_STARCALC, "sdc" },
177 : { CONTENT_TYPE_STR_APP_STARCHART, CONTENT_TYPE_APP_STARCHART, "sds" },
178 : { CONTENT_TYPE_STR_APP_STARDRAW, CONTENT_TYPE_APP_STARDRAW, "sda" },
179 : { CONTENT_TYPE_STR_APP_STARHELP, CONTENT_TYPE_APP_STARHELP, "svh" },
180 : { CONTENT_TYPE_STR_APP_STARIMAGE, CONTENT_TYPE_APP_STARIMAGE, "sim" },
181 : { CONTENT_TYPE_STR_APP_STARIMPRESS, CONTENT_TYPE_APP_STARIMPRESS,
182 : "sdd" },
183 : { CONTENT_TYPE_STR_APP_STARMAIL_SDM, CONTENT_TYPE_APP_STARMAIL_SDM,
184 : "sdm" },
185 : { CONTENT_TYPE_STR_APP_STARMAIL_SMD, CONTENT_TYPE_APP_STARMAIL_SMD,
186 : "smd" },
187 : { CONTENT_TYPE_STR_APP_STARMATH, CONTENT_TYPE_APP_STARMATH, "smf" },
188 : { CONTENT_TYPE_STR_APP_STARWRITER, CONTENT_TYPE_APP_STARWRITER,
189 : "sdw" },
190 : { CONTENT_TYPE_STR_APP_STARWRITER_GLOB,
191 : CONTENT_TYPE_APP_STARWRITER_GLOB, "sgl" },
192 : { CONTENT_TYPE_STR_APP_CDE_CALENDAR_APP,
193 : CONTENT_TYPE_APP_CDE_CALENDAR_APP, "appt" },
194 : { CONTENT_TYPE_STR_APP_ZIP, CONTENT_TYPE_APP_ZIP, "zip" },
195 : { CONTENT_TYPE_STR_AUDIO_AIFF, CONTENT_TYPE_AUDIO_AIFF, "aif" },
196 : { CONTENT_TYPE_STR_AUDIO_BASIC, CONTENT_TYPE_AUDIO_BASIC, "au" },
197 : { CONTENT_TYPE_STR_AUDIO_MIDI, CONTENT_TYPE_AUDIO_MIDI, "mid" },
198 : { CONTENT_TYPE_STR_AUDIO_VORBIS, CONTENT_TYPE_AUDIO_VORBIS, "ogg" },
199 : { CONTENT_TYPE_STR_AUDIO_WAV, CONTENT_TYPE_AUDIO_WAV, "wav" },
200 : { CONTENT_TYPE_STR_AUDIO_WEBM, CONTENT_TYPE_AUDIO_WEBM, "webm" },
201 : { CONTENT_TYPE_STR_IMAGE_GENERIC, CONTENT_TYPE_IMAGE_GENERIC, "tmp" },
202 : { CONTENT_TYPE_STR_IMAGE_GIF, CONTENT_TYPE_IMAGE_GIF, "gif" },
203 : { CONTENT_TYPE_STR_IMAGE_JPEG, CONTENT_TYPE_IMAGE_JPEG, "jpg" },
204 : { CONTENT_TYPE_STR_IMAGE_PCX, CONTENT_TYPE_IMAGE_PCX, "pcx" },
205 : { CONTENT_TYPE_STR_IMAGE_PNG, CONTENT_TYPE_IMAGE_PNG, "png" },
206 : { CONTENT_TYPE_STR_IMAGE_TIFF, CONTENT_TYPE_IMAGE_TIFF, "tif" },
207 : { CONTENT_TYPE_STR_IMAGE_BMP, CONTENT_TYPE_IMAGE_BMP, "bmp" },
208 : { CONTENT_TYPE_STR_INET_MSG_RFC822, CONTENT_TYPE_INET_MESSAGE_RFC822,
209 : "tmp" },
210 : { CONTENT_TYPE_STR_INET_MULTI_ALTERNATIVE,
211 : CONTENT_TYPE_INET_MULTIPART_ALTERNATIVE, "tmp" },
212 : { CONTENT_TYPE_STR_INET_MULTI_DIGEST,
213 : CONTENT_TYPE_INET_MULTIPART_DIGEST, "tmp" },
214 : { CONTENT_TYPE_STR_INET_MULTI_MIXED,
215 : CONTENT_TYPE_INET_MULTIPART_MIXED, "tmp" },
216 : { CONTENT_TYPE_STR_INET_MULTI_PARALLEL,
217 : CONTENT_TYPE_INET_MULTIPART_PARALLEL, "tmp" },
218 : { CONTENT_TYPE_STR_INET_MULTI_RELATED,
219 : CONTENT_TYPE_INET_MULTIPART_RELATED, "tmp" },
220 : { CONTENT_TYPE_STR_TEXT_ICALENDAR, CONTENT_TYPE_TEXT_ICALENDAR,
221 : "ics" },
222 : { CONTENT_TYPE_STR_TEXT_HTML, CONTENT_TYPE_TEXT_HTML, "htm" },
223 : { CONTENT_TYPE_STR_TEXT_PLAIN, CONTENT_TYPE_TEXT_PLAIN, "txt" },
224 : { CONTENT_TYPE_STR_TEXT_XMLICALENDAR, CONTENT_TYPE_TEXT_XMLICALENDAR,
225 : "xcs" },
226 : { CONTENT_TYPE_STR_TEXT_URL, CONTENT_TYPE_TEXT_URL, "url" },
227 : { CONTENT_TYPE_STR_TEXT_VCALENDAR, CONTENT_TYPE_TEXT_VCALENDAR,
228 : "vcs" },
229 : { CONTENT_TYPE_STR_TEXT_VCARD, CONTENT_TYPE_TEXT_VCARD, "vcf" },
230 : { CONTENT_TYPE_STR_VIDEO_MSVIDEO, CONTENT_TYPE_VIDEO_MSVIDEO, "avi" },
231 : { CONTENT_TYPE_STR_VIDEO_THEORA, CONTENT_TYPE_VIDEO_THEORA, "ogg" },
232 : { CONTENT_TYPE_STR_VIDEO_VDO, CONTENT_TYPE_VIDEO_VDO, "vdo" },
233 : { CONTENT_TYPE_STR_VIDEO_WEBM, CONTENT_TYPE_VIDEO_WEBM, "webm" },
234 : { CONTENT_TYPE_STR_X_STARMAIL, CONTENT_TYPE_X_STARMAIL, "smd" },
235 : { CONTENT_TYPE_STR_X_VRML, CONTENT_TYPE_X_VRML, "wrl" }
236 : };
237 :
238 : /** A mapping from type IDs to presentation resource IDs. Sorted by type ID.
239 : */
240 : sal_uInt16 const aStaticResourceIDMap[CONTENT_TYPE_LAST + 1]
241 : = { STR_SVT_MIMETYPE_APP_OCTSTREAM, // CONTENT_TYPE_UNKNOWN
242 : STR_SVT_MIMETYPE_APP_OCTSTREAM, // CONTENT_TYPE_APP_OCTSTREAM
243 : STR_SVT_MIMETYPE_APP_PDF, // CONTENT_TYPE_APP_PDF
244 : STR_SVT_MIMETYPE_APP_RTF, // CONTENT_TYPE_APP_RTF
245 : STR_SVT_MIMETYPE_APP_MSWORD, // CONTENT_TYPE_APP_MSWORD
246 : STR_SVT_MIMETYPE_APP_MSWORD, // CONTENT_TYPE_APP_MSWORD_TEMPL //@todo new presentation string?
247 : STR_SVT_MIMETYPE_APP_STARCALC, // CONTENT_TYPE_APP_STARCALC
248 : STR_SVT_MIMETYPE_APP_STARCHART, // CONTENT_TYPE_APP_STARCHART
249 : STR_SVT_MIMETYPE_APP_STARDRAW, // CONTENT_TYPE_APP_STARDRAW
250 : STR_SVT_MIMETYPE_APP_STARHELP, // CONTENT_TYPE_APP_STARHELP
251 : STR_SVT_MIMETYPE_APP_STARIMAGE, // CONTENT_TYPE_APP_STARIMAGE
252 : STR_SVT_MIMETYPE_APP_STARIMPRESS, // CONTENT_TYPE_APP_STARIMPRESS
253 : STR_SVT_MIMETYPE_APP_STARMATH, // CONTENT_TYPE_APP_STARMATH
254 : STR_SVT_MIMETYPE_APP_STARWRITER, // CONTENT_TYPE_APP_STARWRITER
255 : STR_SVT_MIMETYPE_APP_ZIP, // CONTENT_TYPE_APP_ZIP
256 : STR_SVT_MIMETYPE_AUDIO_AIFF, // CONTENT_TYPE_AUDIO_AIFF
257 : STR_SVT_MIMETYPE_AUDIO_BASIC, // CONTENT_TYPE_AUDIO_BASIC
258 : STR_SVT_MIMETYPE_AUDIO_MIDI, // CONTENT_TYPE_AUDIO_MIDI
259 : STR_SVT_MIMETYPE_AUDIO_VORBIS, // CONTENT_TYPE_AUDIO_VORBIS
260 : STR_SVT_MIMETYPE_AUDIO_WAV, // CONTENT_TYPE_AUDIO_WAV
261 : STR_SVT_MIMETYPE_AUDIO_WEBM, // CONTENT_TYPE_AUDIO_WEBM
262 : STR_SVT_MIMETYPE_IMAGE_GIF, // CONTENT_TYPE_IMAGE_GIF
263 : STR_SVT_MIMETYPE_IMAGE_JPEG, // CONTENT_TYPE_IMAGE_JPEG
264 : STR_SVT_MIMETYPE_IMAGE_PCX, // CONTENT_TYPE_IMAGE_PCX
265 : STR_SVT_MIMETYPE_IMAGE_PNG, // CONTENT_TYPE_IMAGE_PNG
266 : STR_SVT_MIMETYPE_IMAGE_TIFF, // CONTENT_TYPE_IMAGE_TIFF
267 : STR_SVT_MIMETYPE_IMAGE_BMP, // CONTENT_TYPE_IMAGE_BMP
268 : STR_SVT_MIMETYPE_TEXT_HTML, // CONTENT_TYPE_TEXT_HTML
269 : STR_SVT_MIMETYPE_TEXT_PLAIN, // CONTENT_TYPE_TEXT_PLAIN
270 : STR_SVT_MIMETYPE_TEXT_URL, // CONTENT_TYPE_TEXT_URL
271 : STR_SVT_MIMETYPE_TEXT_VCARD, // CONTENT_TYPE_TEXT_VCARD
272 : STR_SVT_MIMETYPE_VIDEO_MSVIDEO, // CONTENT_TYPE_VIDEO_MSVIDEO
273 : STR_SVT_MIMETYPE_VIDEO_THEORA, // CONTENT_TYPE_VIDEO_THEORA
274 : STR_SVT_MIMETYPE_VIDEO_VDO, // CONTENT_TYPE_VIDEO_VDO
275 : STR_SVT_MIMETYPE_VIDEO_WEBM, // CONTENT_TYPE_VIDEO_WEBM
276 : STR_SVT_MIMETYPE_CNT_FSYSBOX, // CONTENT_TYPE_X_CNT_FSYSBOX
277 : STR_SVT_MIMETYPE_CNT_FSYSFLD, // CONTENT_TYPE_X_CNT_FSYSFOLDER
278 : STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_X_STARMAIL
279 : STR_SVT_MIMETYPE_X_VRML, // CONTENT_TYPE_X_VRML
280 : STR_SVT_MIMETYPE_APP_GAL, // CONTENT_TYPE_APP_GALLERY
281 : STR_SVT_MIMETYPE_APP_GAL_THEME, // CONTENT_TYPE_APP_GALLERY_THEME
282 : STR_SVT_MIMETYPE_APP_STARW_GLOB, // CONTENT_TYPE_APP_STARWRITER_GLOB
283 : STR_SVT_MIMETYPE_APP_SDM, // CONTENT_TYPE_APP_STARMAIL_SDM
284 : STR_SVT_MIMETYPE_APP_SMD, // CONTENT_TYPE_APP_STARMAIL_SMD
285 : STR_SVT_MIMETYPE_APP_STARCALC, // CONTENT_TYPE_APP_VND_CALC
286 : STR_SVT_MIMETYPE_APP_STARCHART, // CONTENT_TYPE_APP_VND_CHART
287 : STR_SVT_MIMETYPE_APP_STARDRAW, // CONTENT_TYPE_APP_VND_DRAW
288 : STR_SVT_MIMETYPE_APP_STARIMAGE, // CONTENT_TYPE_APP_VND_IMAGE
289 : STR_SVT_MIMETYPE_APP_STARIMPRESS, // CONTENT_TYPE_APP_VND_IMPRESS
290 : STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_MAIL
291 : STR_SVT_MIMETYPE_APP_STARMATH, // CONTENT_TYPE_APP_VND_MATH
292 : STR_SVT_MIMETYPE_APP_STARWRITER, // CONTENT_TYPE_APP_VND_WRITER
293 : STR_SVT_MIMETYPE_APP_STARW_GLOB, // CONTENT_TYPE_APP_VND_WRITER_GLOBAL
294 : STR_SVT_MIMETYPE_APP_STARW_WEB, // CONTENT_TYPE_APP_VND_WRITER_WEB
295 : STR_SVT_MIMETYPE_FRAMESET, // CONTENT_TYPE_APP_FRAMESET
296 : STR_SVT_MIMETYPE_MACRO, // CONTENT_TYPE_APP_MACRO
297 : STR_SVT_MIMETYPE_CNT_SFSYSFOLDER,
298 : // CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER
299 : STR_SVT_MIMETYPE_APP_TEMPLATE, // CONTENT_TYPE_APP_VND_TEMPLATE
300 : STR_SVT_MIMETYPE_IMAGE_GENERIC, // CONTENT_TYPE_IMAGE_GENERIC
301 : STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_NEWS
302 : STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_OUTTRAY
303 : STR_SVT_MIMETYPE_APP_MSEXCEL, // CONTENT_TYPE_APP_MSEXCEL
304 : STR_SVT_MIMETYPE_APP_MSEXCEL_TEMPL, // CONTENT_TYPE_APP_MSEXCEL_TEMPL
305 : STR_SVT_MIMETYPE_APP_MSPPOINT, // CONTENT_TYPE_APP_MSPPOINT
306 : STR_SVT_MIMETYPE_APP_MSPPOINT, // CONTENT_TYPE_APP_MSPPOINT_TEMPL //@todo new presentation string?
307 : STR_SVT_MIMETYPE_TEXT_VCALENDAR, // CONTENT_TYPE_TEXT_VCALENDAR
308 : STR_SVT_MIMETYPE_TEXT_ICALENDAR, // CONTENT_TYPE_TEXT_ICALENDAR
309 : STR_SVT_MIMETYPE_TEXT_XMLICALENDAR, // CONTENT_TYPE_TEXT_XMLICALENDAR
310 : STR_SVT_MIMETYPE_TEXT_CDE_CALENDAR_APP,
311 : // CONTENT_TYPE_APP_CDE_CALENDAR_APP
312 : STR_SVT_MIMETYPE_INET_MSG_RFC822, // CONTENT_TYPE_INET_MESSAGE_RFC822
313 : STR_SVT_MIMETYPE_INET_MULTI_ALTERNATIVE,
314 : // CONTENT_TYPE_INET_MULTIPART_ALTERNATIVE
315 : STR_SVT_MIMETYPE_INET_MULTI_DIGEST,
316 : // CONTENT_TYPE_INET_MULTIPART_DIGEST
317 : STR_SVT_MIMETYPE_INET_MULTI_PARALLEL,
318 : // CONTENT_TYPE_INET_MULTIPART_PARALLEL
319 : STR_SVT_MIMETYPE_INET_MULTI_RELATED,
320 : // CONTENT_TYPE_INET_MULTIPART_RELATED
321 : STR_SVT_MIMETYPE_INET_MULTI_MIXED,
322 : // CONTENT_TYPE_INET_MULTIPART_MIXED
323 : STR_SVT_MIMETYPE_APP_IMPRESSPACKED,
324 : // CONTENT_TYPE_APP_VND_IMPRESSPACKED
325 : STR_SVT_MIMETYPE_APP_JAR, // CONTENT_TYPE_APP_JAR
326 : STR_SVT_MIMETYPE_APP_SXWRITER, // CONTENT_TYPE_APP_VND_SUN_XML_WRITER
327 : STR_SVT_MIMETYPE_APP_SXCALC, // CONTENT_TYPE_APP_VND_SUN_XML_CALC
328 : STR_SVT_MIMETYPE_APP_SXIMPRESS, // CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS
329 : STR_SVT_MIMETYPE_APP_SXDRAW, // CONTENT_TYPE_APP_VND_SUN_XML_DRAW
330 : STR_SVT_MIMETYPE_APP_SXCHART, // CONTENT_TYPE_APP_VND_SUN_XML_CHART
331 : STR_SVT_MIMETYPE_APP_SXMATH, // CONTENT_TYPE_APP_VND_SUN_XML_MATH
332 : STR_SVT_MIMETYPE_APP_SXGLOBAL, // CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL
333 : STR_SVT_MIMETYPE_APP_SXIPACKED, // CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED
334 : };
335 :
336 : /** A mapping from extensions to type IDs. Sorted by extension.
337 : */
338 : MediaTypeEntry const aStaticExtensionMap[]
339 : = { { "aif", CONTENT_TYPE_AUDIO_AIFF, "" },
340 : { "aiff", CONTENT_TYPE_AUDIO_AIFF, "" },
341 : { "appt", CONTENT_TYPE_APP_CDE_CALENDAR_APP, "" },
342 : { "au", CONTENT_TYPE_AUDIO_BASIC, "" },
343 : { "avi", CONTENT_TYPE_VIDEO_MSVIDEO, "" },
344 : { "bmp", CONTENT_TYPE_IMAGE_BMP, "" },
345 : { "cgm", CONTENT_TYPE_IMAGE_GENERIC, "" },
346 : { "doc", CONTENT_TYPE_APP_MSWORD, "" },
347 : { "dot", CONTENT_TYPE_APP_MSWORD_TEMPL, "" },
348 : { "dxf", CONTENT_TYPE_IMAGE_GENERIC, "" },
349 : { "eps", CONTENT_TYPE_IMAGE_GENERIC, "" },
350 : { "gal", CONTENT_TYPE_APP_GALLERY, "" },
351 : { "gif", CONTENT_TYPE_IMAGE_GIF, "" },
352 : { "htm", CONTENT_TYPE_TEXT_HTML, "" },
353 : { "html", CONTENT_TYPE_TEXT_HTML, "" },
354 : { "ics", CONTENT_TYPE_TEXT_ICALENDAR, "" },
355 : { "jar", CONTENT_TYPE_APP_JAR, "" },
356 : { "jpeg", CONTENT_TYPE_IMAGE_JPEG, "" },
357 : { "jpg", CONTENT_TYPE_IMAGE_JPEG, "" },
358 : { "met", CONTENT_TYPE_IMAGE_GENERIC, "" },
359 : { "mid", CONTENT_TYPE_AUDIO_MIDI, "" },
360 : { "midi", CONTENT_TYPE_AUDIO_MIDI, "" },
361 : { "ogg", CONTENT_TYPE_AUDIO_VORBIS, "" },
362 : { "pbm", CONTENT_TYPE_IMAGE_GENERIC, "" },
363 : { "pcd", CONTENT_TYPE_IMAGE_GENERIC, "" },
364 : { "pct", CONTENT_TYPE_IMAGE_GENERIC, "" },
365 : { "pcx", CONTENT_TYPE_IMAGE_PCX, "" },
366 : { "pdf", CONTENT_TYPE_APP_PDF, "" },
367 : { "pgm", CONTENT_TYPE_IMAGE_GENERIC, "" },
368 : { "png", CONTENT_TYPE_IMAGE_PNG, "" },
369 : { "pot", CONTENT_TYPE_APP_MSPPOINT_TEMPL, "" },
370 : { "ppm", CONTENT_TYPE_IMAGE_GENERIC, "" },
371 : { "ppt", CONTENT_TYPE_APP_MSPPOINT, "" },
372 : { "psd", CONTENT_TYPE_IMAGE_GENERIC, "" },
373 : { "ras", CONTENT_TYPE_IMAGE_GENERIC, "" },
374 : { "rtf", CONTENT_TYPE_APP_RTF, "" },
375 : { "sda", CONTENT_TYPE_APP_VND_DRAW, "" },
376 : { "sdc", CONTENT_TYPE_APP_VND_CALC, "" },
377 : { "sdd", CONTENT_TYPE_APP_VND_IMPRESS, "" },
378 : { "sdm", CONTENT_TYPE_APP_VND_MAIL, "" },
379 : { "sdp", CONTENT_TYPE_APP_VND_IMPRESSPACKED, "" },
380 : { "sds", CONTENT_TYPE_APP_VND_CHART, "" },
381 : { "sdw", CONTENT_TYPE_APP_VND_WRITER, "" },
382 : { "sd~", CONTENT_TYPE_X_STARMAIL, "" },
383 : { "sfs", CONTENT_TYPE_APP_FRAMESET , "" },
384 : { "sgl", CONTENT_TYPE_APP_VND_WRITER_GLOBAL , "" },
385 : { "sim", CONTENT_TYPE_APP_VND_IMAGE, "" },
386 : { "smd", CONTENT_TYPE_APP_STARMAIL_SMD, "" }, //CONTENT_TYPE_X_STARMAIL
387 : { "smf", CONTENT_TYPE_APP_VND_MATH, "" },
388 : { "svh", CONTENT_TYPE_APP_STARHELP, "" },
389 : { "svm", CONTENT_TYPE_IMAGE_GENERIC, "" },
390 : { "sxc", CONTENT_TYPE_APP_VND_SUN_XML_CALC, "" },
391 : { "sxd", CONTENT_TYPE_APP_VND_SUN_XML_DRAW, "" },
392 : { "sxg", CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL, "" },
393 : { "sxi", CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS, "" },
394 : { "sxm", CONTENT_TYPE_APP_VND_SUN_XML_MATH, "" },
395 : { "sxp", CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED, "" },
396 : { "sxs", CONTENT_TYPE_APP_VND_SUN_XML_CHART, "" },
397 : { "sxw", CONTENT_TYPE_APP_VND_SUN_XML_WRITER, "" },
398 : { "tga", CONTENT_TYPE_IMAGE_GENERIC, "" },
399 : { "thm", CONTENT_TYPE_APP_GALLERY_THEME, "" },
400 : { "tif", CONTENT_TYPE_IMAGE_TIFF, "" },
401 : { "tiff", CONTENT_TYPE_IMAGE_TIFF, "" },
402 : { "txt", CONTENT_TYPE_TEXT_PLAIN, "" },
403 : { "url", CONTENT_TYPE_TEXT_URL, "" },
404 : { "vcf", CONTENT_TYPE_TEXT_VCARD, "" },
405 : { "vcs", CONTENT_TYPE_TEXT_VCALENDAR, "" },
406 : { "vdo", CONTENT_TYPE_VIDEO_VDO, "" },
407 : { "vor", CONTENT_TYPE_APP_VND_TEMPLATE, "" },
408 : { "wav", CONTENT_TYPE_AUDIO_WAV, "" },
409 : { "webm", CONTENT_TYPE_VIDEO_WEBM, "" },
410 : { "wmf", CONTENT_TYPE_IMAGE_GENERIC, "" },
411 : { "wrl", CONTENT_TYPE_X_VRML, "" },
412 : { "xbm", CONTENT_TYPE_IMAGE_GENERIC, "" },
413 : { "xcs", CONTENT_TYPE_TEXT_XMLICALENDAR, "" },
414 : { "xls", CONTENT_TYPE_APP_MSEXCEL, "" },
415 : { "xlt", CONTENT_TYPE_APP_MSEXCEL_TEMPL, "" },
416 : { "xlw", CONTENT_TYPE_APP_MSEXCEL, "" },
417 : { "xpm", CONTENT_TYPE_IMAGE_GENERIC, "" },
418 : { "zip", CONTENT_TYPE_APP_ZIP, "" } };
419 :
420 : }
421 :
422 :
423 : // Registration
424 :
425 :
426 0 : Registration::~Registration()
427 : {
428 0 : for ( TypeIDMap::iterator it = m_aTypeIDMap.begin(); it != m_aTypeIDMap.end(); ++it )
429 0 : delete it->second;
430 0 : }
431 :
432 : // static
433 0 : TypeNameMapEntry * Registration::getExtensionEntry(OUString const & rTypeName)
434 : {
435 0 : OUString aTheTypeName = rTypeName.toAsciiLowerCase();;
436 0 : Registration &rRegistration = theRegistration::get();
437 0 : TypeNameMap::iterator it = rRegistration.m_aTypeNameMap.find(aTheTypeName);
438 0 : if (it != rRegistration.m_aTypeNameMap.end())
439 0 : return it->second;
440 0 : return 0;
441 : }
442 :
443 : // static
444 0 : INetContentType Registration::RegisterContentType(OUString const & rTypeName,
445 : OUString const & rPresentation,
446 : OUString const * pExtension,
447 : OUString const * pSystemFileType)
448 : {
449 0 : Registration &rRegistration = theRegistration::get();
450 :
451 : DBG_ASSERT(GetContentType(rTypeName) == CONTENT_TYPE_UNKNOWN,
452 : "Registration::RegisterContentType(): Already registered");
453 :
454 0 : INetContentType eTypeID = INetContentType(rRegistration.m_nNextDynamicID++);
455 0 : OUString aTheTypeName = rTypeName.toAsciiLowerCase();
456 :
457 0 : TypeIDMapEntry * pTypeIDMapEntry = new TypeIDMapEntry;
458 0 : pTypeIDMapEntry->m_aTypeName = aTheTypeName;
459 0 : pTypeIDMapEntry->m_aPresentation = rPresentation;
460 0 : if (pSystemFileType)
461 0 : pTypeIDMapEntry->m_aSystemFileType = *pSystemFileType;
462 0 : rRegistration.m_aTypeIDMap.insert( ::std::make_pair( eTypeID, pTypeIDMapEntry ) );
463 :
464 0 : std::auto_ptr<TypeNameMapEntry> pTypeNameMapEntry(new TypeNameMapEntry());
465 0 : if (pExtension)
466 0 : pTypeNameMapEntry->m_aExtension = *pExtension;
467 0 : pTypeNameMapEntry->m_eTypeID = eTypeID;
468 0 : rRegistration.m_aTypeNameMap.insert(aTheTypeName, pTypeNameMapEntry);
469 :
470 0 : if (pExtension)
471 : {
472 0 : std::auto_ptr<ExtensionMapEntry> pExtensionMapEntry(new ExtensionMapEntry());
473 0 : pExtensionMapEntry->m_eTypeID = eTypeID;
474 0 : rRegistration.m_aExtensionMap.insert(*pExtension, pExtensionMapEntry);
475 : }
476 :
477 0 : return eTypeID;
478 : }
479 :
480 : // static
481 0 : INetContentType Registration::GetContentType(OUString const & rTypeName)
482 : {
483 0 : Registration &rRegistration = theRegistration::get();
484 :
485 0 : OUString aTheTypeName = rTypeName.toAsciiLowerCase();
486 0 : TypeNameMap::iterator it = rRegistration.m_aTypeNameMap.find(aTheTypeName);
487 0 : return it != rRegistration.m_aTypeNameMap.end()
488 0 : ? it->second->m_eTypeID
489 0 : : CONTENT_TYPE_UNKNOWN;
490 : }
491 :
492 : // static
493 0 : OUString Registration::GetContentType(INetContentType eTypeID)
494 : {
495 0 : Registration &rRegistration = theRegistration::get();
496 :
497 0 : TypeIDMap::iterator pEntry = rRegistration.m_aTypeIDMap.find( eTypeID );
498 0 : if( pEntry != rRegistration.m_aTypeIDMap.end() )
499 0 : return pEntry->second->m_aTypeName;
500 0 : return OUString();
501 : }
502 :
503 : // static
504 0 : OUString Registration::GetPresentation(INetContentType eTypeID)
505 : {
506 0 : Registration &rRegistration = theRegistration::get();
507 :
508 0 : TypeIDMap::iterator pEntry = rRegistration.m_aTypeIDMap.find( eTypeID );
509 0 : if( pEntry != rRegistration.m_aTypeIDMap.end() )
510 0 : return pEntry->second->m_aPresentation;
511 : else
512 0 : return OUString();
513 : }
514 :
515 : // static
516 0 : INetContentType Registration::GetContentType4Extension(OUString const & rExtension)
517 : {
518 0 : Registration &rRegistration = theRegistration::get();
519 :
520 0 : ExtensionMap::iterator it = rRegistration.m_aExtensionMap.find(rExtension);
521 0 : return it != rRegistration.m_aExtensionMap.end()
522 0 : ? it->second->m_eTypeID
523 0 : : CONTENT_TYPE_UNKNOWN;
524 : }
525 :
526 :
527 : // seekEntry
528 :
529 :
530 : namespace
531 : {
532 :
533 0 : MediaTypeEntry const * seekEntry(OUString const & rTypeName,
534 : MediaTypeEntry const * pMap, sal_Size nSize)
535 : {
536 : #if defined DBG_UTIL
537 : for (sal_Size i = 0; i < nSize - 1; ++i)
538 : DBG_ASSERT(
539 : rtl_str_compare(
540 : pMap[i].m_pTypeName, pMap[i + 1].m_pTypeName) < 0,
541 : "seekEntry(): Bad map");
542 : #endif
543 :
544 0 : sal_Size nLow = 0;
545 0 : sal_Size nHigh = nSize;
546 0 : while (nLow != nHigh)
547 : {
548 0 : sal_Size nMiddle = (nLow + nHigh) / 2;
549 0 : MediaTypeEntry const * pEntry = pMap + nMiddle;
550 0 : sal_Int32 nCmp = rTypeName.compareToIgnoreAsciiCaseAscii(pEntry->m_pTypeName);
551 0 : if (nCmp < 0)
552 0 : nHigh = nMiddle;
553 0 : else if (nCmp == 0)
554 0 : return pEntry;
555 :
556 : else
557 0 : nLow = nMiddle + 1;
558 : }
559 0 : return 0;
560 : }
561 :
562 : }
563 :
564 : //static
565 0 : INetContentType INetContentTypes::RegisterContentType(OUString const & rTypeName,
566 : OUString const & rPresentation,
567 : OUString const * pExtension,
568 : OUString const * pSystemFileType)
569 : {
570 0 : INetContentType eTypeID = GetContentType(rTypeName);
571 0 : if (eTypeID == CONTENT_TYPE_UNKNOWN)
572 : eTypeID = Registration::RegisterContentType(rTypeName, rPresentation,
573 : pExtension,
574 0 : pSystemFileType);
575 0 : else if (eTypeID > CONTENT_TYPE_LAST)
576 : {
577 0 : TypeIDMapEntry * pTypeEntry = Registration::getEntry(eTypeID);
578 0 : if (pTypeEntry)
579 : {
580 0 : if (!rPresentation.isEmpty())
581 0 : pTypeEntry->m_aPresentation = rPresentation;
582 0 : if (pSystemFileType)
583 0 : pTypeEntry->m_aSystemFileType = *pSystemFileType;
584 : }
585 0 : if (pExtension)
586 : {
587 0 : TypeNameMapEntry * pEntry = Registration::getExtensionEntry(rTypeName);
588 0 : if (pEntry)
589 0 : pEntry->m_aExtension = *pExtension;
590 : }
591 : }
592 0 : return eTypeID;
593 : }
594 :
595 : // static
596 0 : INetContentType INetContentTypes::GetContentType(OUString const & rTypeName)
597 : {
598 0 : OUString aType;
599 0 : OUString aSubType;
600 0 : if (parse(rTypeName, aType, aSubType))
601 : {
602 0 : aType += "/";
603 0 : aType += aSubType;
604 : MediaTypeEntry const * pEntry = seekEntry(aType, aStaticTypeNameMap,
605 0 : CONTENT_TYPE_LAST + 1);
606 0 : return pEntry ? pEntry->m_eTypeID : Registration::GetContentType(aType);
607 : }
608 : else
609 0 : return rTypeName.equalsIgnoreAsciiCase(CONTENT_TYPE_STR_X_STARMAIL) ?
610 0 : CONTENT_TYPE_X_STARMAIL : CONTENT_TYPE_UNKNOWN;
611 : // the content type "x-starmail" has no sub type
612 : }
613 :
614 : //static
615 0 : OUString INetContentTypes::GetContentType(INetContentType eTypeID)
616 : {
617 : static sal_Char const * aMap[CONTENT_TYPE_LAST + 1];
618 : static bool bInitialized = false;
619 0 : if (!bInitialized)
620 : {
621 0 : for (sal_Size i = 0; i <= CONTENT_TYPE_LAST; ++i)
622 0 : aMap[aStaticTypeNameMap[i].m_eTypeID] = aStaticTypeNameMap[i].m_pTypeName;
623 0 : aMap[CONTENT_TYPE_UNKNOWN] = CONTENT_TYPE_STR_APP_OCTSTREAM;
624 : aMap[CONTENT_TYPE_TEXT_PLAIN] = CONTENT_TYPE_STR_TEXT_PLAIN
625 0 : "; charset=iso-8859-1";
626 0 : bInitialized = true;
627 : }
628 :
629 0 : OUString aTypeName = eTypeID <= CONTENT_TYPE_LAST ? OUString::createFromAscii(aMap[eTypeID])
630 0 : : Registration::GetContentType(eTypeID);
631 0 : if (aTypeName.isEmpty())
632 : {
633 : OSL_FAIL("INetContentTypes::GetContentType(): Bad ID");
634 0 : return OUString(CONTENT_TYPE_STR_APP_OCTSTREAM);
635 : }
636 0 : return aTypeName;
637 : }
638 :
639 : //static
640 0 : OUString INetContentTypes::GetPresentation(INetContentType eTypeID,
641 : const LanguageTag& aLocale)
642 : {
643 0 : sal_uInt16 nResID = sal_uInt16();
644 0 : if (eTypeID <= CONTENT_TYPE_LAST)
645 0 : nResID = aStaticResourceIDMap[eTypeID];
646 : else
647 : {
648 0 : OUString aPresentation = Registration::GetPresentation(eTypeID);
649 0 : if (aPresentation.isEmpty())
650 0 : nResID = STR_SVT_MIMETYPE_APP_OCTSTREAM;
651 : else
652 0 : return aPresentation;
653 : }
654 0 : return svl::getStringResource(nResID, aLocale);
655 : }
656 :
657 : //static
658 0 : INetContentType INetContentTypes::GetContentType4Extension(OUString const & rExtension)
659 : {
660 : MediaTypeEntry const * pEntry = seekEntry(rExtension, aStaticExtensionMap,
661 0 : sizeof aStaticExtensionMap / sizeof (MediaTypeEntry));
662 0 : if (pEntry)
663 0 : return pEntry->m_eTypeID;
664 0 : INetContentType eTypeID = Registration::GetContentType4Extension(rExtension);
665 : return eTypeID == CONTENT_TYPE_UNKNOWN ? CONTENT_TYPE_APP_OCTSTREAM
666 0 : : eTypeID;
667 : }
668 :
669 : //static
670 0 : INetContentType INetContentTypes::GetContentTypeFromURL(OUString const & rURL)
671 : {
672 0 : INetContentType eTypeID = CONTENT_TYPE_UNKNOWN;
673 0 : OUString aToken = rURL.getToken(0, ':');
674 0 : if (!aToken.isEmpty())
675 : {
676 0 : if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_FILE))
677 0 : if (rURL[ rURL.getLength() - 1 ] == (sal_Unicode)'/') // folder
678 0 : if (rURL.getLength() > RTL_CONSTASCII_LENGTH("file:///"))
679 0 : if (WildCard("*/{*}/").Matches(rURL)) // special folder
680 0 : eTypeID = CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER;
681 : else
682 : // drive? -> "file:///?|/"
683 0 : if (rURL.getLength() == 11
684 0 : && rURL[ rURL.getLength() - 2 ] == '|')
685 : {
686 : // Drives need further processing, because of
687 : // dynamic type according to underlying volume,
688 : // which cannot be determined here.
689 : }
690 : else // normal folder
691 0 : eTypeID = CONTENT_TYPE_X_CNT_FSYSFOLDER;
692 : else // file system root
693 0 : eTypeID = CONTENT_TYPE_X_CNT_FSYSBOX;
694 : else // file
695 : {
696 : //@@@
697 : }
698 0 : else if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_HTTP)
699 0 : || aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_HTTPS))
700 0 : eTypeID = CONTENT_TYPE_TEXT_HTML;
701 0 : else if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_PRIVATE))
702 : {
703 0 : OUString aSecondPart = rURL.getToken(1, ':');
704 0 : aToken = aSecondPart.getToken(0, '/');
705 0 : if (aToken.equalsAscii(INETTYPE_URL_SUB_FACTORY))
706 : {
707 0 : aToken = aSecondPart.getToken(1, '/');
708 0 : if (aToken.equalsAscii(INETTYPE_URL_SSUB_SWRITER))
709 : {
710 0 : aToken = aSecondPart.getToken(2, '/');
711 0 : eTypeID = aToken.equalsAscii(INETTYPE_URL_SSSUB_WEB) ?
712 : CONTENT_TYPE_APP_VND_WRITER_WEB :
713 0 : aToken.equalsAscii(INETTYPE_URL_SSSUB_GLOB) ?
714 : CONTENT_TYPE_APP_VND_WRITER_GLOBAL :
715 0 : CONTENT_TYPE_APP_VND_WRITER;
716 : }
717 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SCALC))
718 0 : eTypeID = CONTENT_TYPE_APP_VND_CALC;
719 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SDRAW))
720 0 : eTypeID = CONTENT_TYPE_APP_VND_DRAW;
721 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SIMPRESS))
722 0 : eTypeID = CONTENT_TYPE_APP_VND_IMPRESS;
723 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SCHART))
724 0 : eTypeID = CONTENT_TYPE_APP_VND_CHART;
725 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SIMAGE))
726 0 : eTypeID = CONTENT_TYPE_APP_VND_IMAGE;
727 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_SMATH))
728 0 : eTypeID = CONTENT_TYPE_APP_VND_MATH;
729 0 : else if (aToken.equalsAscii(INETTYPE_URL_SSUB_FRAMESET))
730 0 : eTypeID = CONTENT_TYPE_APP_FRAMESET;
731 : }
732 0 : else if (aToken.equalsAscii(INETTYPE_URL_SUB_HELPID))
733 0 : eTypeID = CONTENT_TYPE_APP_STARHELP;
734 : }
735 0 : else if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_MAILTO))
736 0 : eTypeID = CONTENT_TYPE_APP_VND_OUTTRAY;
737 0 : else if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_MACRO))
738 0 : eTypeID = CONTENT_TYPE_APP_MACRO;
739 0 : else if (aToken.equalsIgnoreAsciiCase(INETTYPE_URL_PROT_DATA))
740 : {
741 0 : OUString aSecondPart = rURL.getToken(1, ':');
742 0 : aToken = aSecondPart.getToken(0, ',');
743 0 : eTypeID = GetContentType(aToken);
744 : }
745 : }
746 0 : if (eTypeID == CONTENT_TYPE_UNKNOWN)
747 : {
748 0 : OUString aExtension;
749 0 : if (GetExtensionFromURL(rURL, aExtension))
750 0 : eTypeID = GetContentType4Extension(aExtension);
751 : }
752 0 : return eTypeID;
753 : }
754 :
755 : //static
756 0 : bool INetContentTypes::GetExtensionFromURL(OUString const & rURL,
757 : OUString & rExtension)
758 : {
759 0 : sal_Int32 nSlashPos = 0;
760 0 : sal_Int32 i = 0;
761 0 : while (i >= 0)
762 : {
763 0 : nSlashPos = i;
764 0 : i = rURL.indexOf((sal_Unicode)'/', i + 1);
765 : }
766 0 : if (nSlashPos != 0)
767 : {
768 0 : sal_Int32 nLastDotPos = i = rURL.indexOf((sal_Unicode)'.', nSlashPos);
769 0 : while (i >= 0)
770 : {
771 0 : nLastDotPos = i;
772 0 : i = rURL.indexOf((sal_Unicode)'.', i + 1);
773 : }
774 0 : if (nLastDotPos >- 0)
775 0 : rExtension = rURL.copy(nLastDotPos + 1);
776 0 : return true;
777 : }
778 0 : return false;
779 : }
780 :
781 : // static
782 0 : sal_Unicode const * INetContentTypes::scan(
783 : sal_Unicode const * pBegin, sal_Unicode const * pEnd, OUString * pType,
784 : OUString * pSubType, INetContentTypeParameterList * pParameters)
785 : {
786 0 : sal_Unicode const * p = INetMIME::skipLinearWhiteSpaceComment(pBegin, pEnd);
787 0 : sal_Unicode const * pTypeBegin = p;
788 0 : while (p != pEnd && INetMIME::isTokenChar(*p))
789 : {
790 0 : ++p;
791 : }
792 0 : if (p == pTypeBegin)
793 0 : return 0;
794 0 : sal_Unicode const * pTypeEnd = p;
795 :
796 0 : p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
797 0 : if (p == pEnd || *p++ != '/')
798 0 : return 0;
799 :
800 0 : p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
801 0 : sal_Unicode const * pSubTypeBegin = p;
802 0 : while (p != pEnd && INetMIME::isTokenChar(*p))
803 : {
804 0 : ++p;
805 : }
806 0 : if (p == pSubTypeBegin)
807 0 : return 0;
808 0 : sal_Unicode const * pSubTypeEnd = p;
809 :
810 0 : if (pType != 0)
811 : {
812 0 : *pType = OUString(pTypeBegin, pTypeEnd - pTypeBegin).toAsciiLowerCase();
813 : }
814 0 : if (pSubType != 0)
815 : {
816 0 : *pSubType = OUString(pSubTypeBegin, pSubTypeEnd - pSubTypeBegin)
817 0 : .toAsciiLowerCase();
818 : }
819 :
820 0 : return INetMIME::scanParameters(p, pEnd, pParameters);
821 : }
822 :
823 0 : bool INetContentTypes::parse(
824 : OUString const & rMediaType, OUString & rType, OUString & rSubType,
825 : INetContentTypeParameterList * pParameters)
826 : {
827 0 : sal_Unicode const * b = rMediaType.getStr();
828 0 : sal_Unicode const * e = b + rMediaType.getLength();
829 0 : OUString t;
830 0 : OUString s;
831 0 : INetContentTypeParameterList p;
832 0 : if (scan(b, e, &t, &s, pParameters == 0 ? 0 : &p) == e) {
833 0 : rType = t;
834 0 : rSubType = s;
835 0 : if (pParameters != 0) {
836 0 : *pParameters = p;
837 : }
838 0 : return true;
839 : } else {
840 0 : return false;
841 0 : }
842 : }
843 :
844 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|