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