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