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