xref: /aoo4110/main/svl/source/misc/inettype.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svl.hxx"
26*b1cdbd2cSJim Jagielski #include <tools/table.hxx>
27*b1cdbd2cSJim Jagielski #include <tools/wldcrd.hxx>
28*b1cdbd2cSJim Jagielski #include <svl/inettype.hxx>
29*b1cdbd2cSJim Jagielski #include <svl/svldata.hxx>
30*b1cdbd2cSJim Jagielski #include <svl/svl.hrc>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #ifndef _SVSTDARR_STRINGSSORT_DECL
33*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGSSORT
34*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
35*b1cdbd2cSJim Jagielski #undef _SVSTDARR_STRINGSSORT
36*b1cdbd2cSJim Jagielski #endif
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski namespace unnamed_svl_inettype {}
39*b1cdbd2cSJim Jagielski using namespace unnamed_svl_inettype;
40*b1cdbd2cSJim Jagielski 	// unnamed namespaces don't work well yet
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //============================================================================
43*b1cdbd2cSJim Jagielski namespace unnamed_svl_inettype {
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski //============================================================================
46*b1cdbd2cSJim Jagielski struct MediaTypeEntry
47*b1cdbd2cSJim Jagielski {
48*b1cdbd2cSJim Jagielski 	sal_Char const * m_pTypeName;
49*b1cdbd2cSJim Jagielski 	INetContentType	m_eTypeID;
50*b1cdbd2cSJim Jagielski 	sal_Char const * m_pExtension;
51*b1cdbd2cSJim Jagielski };
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski //============================================================================
54*b1cdbd2cSJim Jagielski struct TypeIDMapEntry
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 	UniString m_aTypeName;
57*b1cdbd2cSJim Jagielski 	UniString m_aPresentation;
58*b1cdbd2cSJim Jagielski 	UniString m_aSystemFileType;
59*b1cdbd2cSJim Jagielski };
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //============================================================================
62*b1cdbd2cSJim Jagielski struct TypeNameMapEntry: public UniString
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski 	UniString m_aExtension;
65*b1cdbd2cSJim Jagielski 	INetContentType m_eTypeID;
66*b1cdbd2cSJim Jagielski 
TypeNameMapEntryunnamed_svl_inettype::TypeNameMapEntry67*b1cdbd2cSJim Jagielski 	TypeNameMapEntry(const UniString & rType):
68*b1cdbd2cSJim Jagielski 		UniString(rType), m_eTypeID(CONTENT_TYPE_UNKNOWN) {}
69*b1cdbd2cSJim Jagielski };
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski //============================================================================
72*b1cdbd2cSJim Jagielski struct ExtensionMapEntry: public UniString
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	INetContentType	m_eTypeID;
75*b1cdbd2cSJim Jagielski 
ExtensionMapEntryunnamed_svl_inettype::ExtensionMapEntry76*b1cdbd2cSJim Jagielski 	ExtensionMapEntry(const UniString & rExt):
77*b1cdbd2cSJim Jagielski 		UniString(rExt), m_eTypeID(CONTENT_TYPE_UNKNOWN) {}
78*b1cdbd2cSJim Jagielski };
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski //============================================================================
81*b1cdbd2cSJim Jagielski class Registration
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski 	static Registration * m_pRegistration;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 	Table m_aTypeIDMap; // map TypeID to TypeName, Presentation
86*b1cdbd2cSJim Jagielski 	SvStringsSort m_aTypeNameMap; // map TypeName to TypeID, Extension
87*b1cdbd2cSJim Jagielski 	SvStringsSort m_aExtensionMap; // map Extension to TypeID
88*b1cdbd2cSJim Jagielski 	sal_uInt32 m_nNextDynamicID;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski public:
Registration()91*b1cdbd2cSJim Jagielski 	Registration(): m_nNextDynamicID(CONTENT_TYPE_LAST + 1) {}
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 	~Registration();
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 	static inline void deinitialize();
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	static inline TypeIDMapEntry * getEntry(INetContentType eTypeID);
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	static TypeNameMapEntry * getExtensionEntry(UniString const & rTypeName);
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	static INetContentType RegisterContentType(UniString const & rTypeName,
102*b1cdbd2cSJim Jagielski 											   UniString const &
103*b1cdbd2cSJim Jagielski 											       rPresentation,
104*b1cdbd2cSJim Jagielski 											   UniString const * pExtension,
105*b1cdbd2cSJim Jagielski 											   UniString const *
106*b1cdbd2cSJim Jagielski 											       pSystemFileType);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 	static INetContentType GetContentType(UniString const & rTypeName);
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 	static UniString GetContentType(INetContentType eTypeID);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	static UniString GetPresentation(INetContentType eTypeID);
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	static UniString GetExtension(const UniString & rTypeName);
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	static INetContentType GetContentType4Extension(UniString const &
117*b1cdbd2cSJim Jagielski 													    rExtension);
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski };
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski // static
deinitialize()122*b1cdbd2cSJim Jagielski inline void Registration::deinitialize()
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski 	delete m_pRegistration;
125*b1cdbd2cSJim Jagielski 	m_pRegistration = 0;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski // static
getEntry(INetContentType eTypeID)129*b1cdbd2cSJim Jagielski inline TypeIDMapEntry * Registration::getEntry(INetContentType eTypeID)
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski 	return
132*b1cdbd2cSJim Jagielski 		m_pRegistration ?
133*b1cdbd2cSJim Jagielski 		    static_cast< TypeIDMapEntry * >(m_pRegistration->
134*b1cdbd2cSJim Jagielski 											    m_aTypeIDMap.Get(eTypeID)) :
135*b1cdbd2cSJim Jagielski 		    0;
136*b1cdbd2cSJim Jagielski }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski //============================================================================
139*b1cdbd2cSJim Jagielski MediaTypeEntry const * seekEntry(UniString const & rTypeName,
140*b1cdbd2cSJim Jagielski 								 MediaTypeEntry const * pMap, sal_Size nSize);
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski //============================================================================
143*b1cdbd2cSJim Jagielski /** A mapping from type names to type ids and extensions.  Sorted by type
144*b1cdbd2cSJim Jagielski 	name.
145*b1cdbd2cSJim Jagielski  */
146*b1cdbd2cSJim Jagielski MediaTypeEntry const aStaticTypeNameMap[CONTENT_TYPE_LAST + 1]
147*b1cdbd2cSJim Jagielski 	= { { " ", CONTENT_TYPE_UNKNOWN, "" },
148*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_DOCUMENT, CONTENT_TYPE_X_CNT_DOCUMENT,
149*b1cdbd2cSJim Jagielski 		  "tmp" },
150*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSBOX, CONTENT_TYPE_X_CNT_FSYSBOX, "tmp" },
151*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_CDROM_VOLUME,
152*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_CDROM_VOLUME, "tmp" },
153*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_DISK_35, CONTENT_TYPE_X_CNT_DISK_35, "tmp" },
154*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_DISK_525, CONTENT_TYPE_X_CNT_DISK_525,
155*b1cdbd2cSJim Jagielski 		  "tmp" },
156*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSFILE, CONTENT_TYPE_X_CNT_FSYSFILE,
157*b1cdbd2cSJim Jagielski 		  "tmp" },
158*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FIXED_VOLUME,
159*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_FIXED_VOLUME, "tmp" },
160*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSFOLDER, CONTENT_TYPE_X_CNT_FSYSFOLDER,
161*b1cdbd2cSJim Jagielski 		  "tmp" },
162*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_RAM_VOLUME, CONTENT_TYPE_X_CNT_RAM_VOLUME,
163*b1cdbd2cSJim Jagielski 		  "tmp" },
164*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_REMOTE_VOLUME,
165*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_REMOTE_VOLUME, "tmp" },
166*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_REMOVEABLE_VOLUME,
167*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_REMOVEABLE_VOLUME, "tmp" },
168*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSSPECIALFILE,
169*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_FSYSSPECIALFILE, "tmp" },
170*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSSPECIALFOLDER,
171*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER, "tmp" },
172*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_TAPEDRIVE, CONTENT_TYPE_X_CNT_TAPEDRIVE,
173*b1cdbd2cSJim Jagielski 		  "tmp" },
174*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FSYSURLFILE, CONTENT_TYPE_X_CNT_FSYSURLFILE,
175*b1cdbd2cSJim Jagielski 		  "tmp" },
176*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FTPBOX, CONTENT_TYPE_X_CNT_FTPBOX, "tmp" },
177*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FTPFILE, CONTENT_TYPE_X_CNT_FTPFILE, "tmp" },
178*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FTPFOLDER, CONTENT_TYPE_X_CNT_FTPFOLDER,
179*b1cdbd2cSJim Jagielski 		  "tmp" },
180*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_FTPLINK, CONTENT_TYPE_X_CNT_FTPLINK, "tmp" },
181*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_HTTPBOX, CONTENT_TYPE_X_CNT_HTTPBOX, "tmp" },
182*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_HTTPFILE, CONTENT_TYPE_X_CNT_HTTPFILE,
183*b1cdbd2cSJim Jagielski 		  "tmp" },
184*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_IMAPBOX, CONTENT_TYPE_X_CNT_IMAPBOX, "tmp" },
185*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_IMAPFOLDER, CONTENT_TYPE_X_CNT_IMAPFOLDER,
186*b1cdbd2cSJim Jagielski 		  "tmp" },
187*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_MESSAGE, CONTENT_TYPE_X_CNT_MESSAGE, "tmp" },
188*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_NEWSBOX, CONTENT_TYPE_X_CNT_NEWSBOX, "tmp" },
189*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_NEWSGROUP, CONTENT_TYPE_X_CNT_NEWSGROUP,
190*b1cdbd2cSJim Jagielski 		  "tmp" },
191*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_OUTBOX, CONTENT_TYPE_X_CNT_OUTBOX, "tmp" },
192*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_POP3BOX, CONTENT_TYPE_X_CNT_POP3BOX, "tmp" },
193*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_PUBLISHBOX, CONTENT_TYPE_X_CNT_PUBLISHBOX,
194*b1cdbd2cSJim Jagielski 		  "tmp" },
195*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_SEARCHBOX, CONTENT_TYPE_X_CNT_SEARCHBOX,
196*b1cdbd2cSJim Jagielski 		  "tmp" },
197*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_SEPARATOR, CONTENT_TYPE_X_CNT_SEPARATOR,
198*b1cdbd2cSJim Jagielski 		  "tmp" },
199*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_BOOKMARK, CONTENT_TYPE_X_CNT_BOOKMARK,
200*b1cdbd2cSJim Jagielski 		  "tmp" },
201*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_SUBSCRIBEBOX,
202*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_SUBSCRIBEBOX, "tmp" },
203*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_CDF, CONTENT_TYPE_X_CNT_CDF, "tmp" },
204*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_CDFITEM, CONTENT_TYPE_X_CNT_CDFITEM, "tmp" },
205*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_CDFSUB, CONTENT_TYPE_X_CNT_CDFSUB, "tmp" },
206*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_STARCHANNEL, CONTENT_TYPE_X_CNT_STARCHANNEL,
207*b1cdbd2cSJim Jagielski 		  "tmp" },
208*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_TRASHBOX, CONTENT_TYPE_X_CNT_TRASHBOX,
209*b1cdbd2cSJim Jagielski 		  "tmp" },
210*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_TRASH, CONTENT_TYPE_X_CNT_TRASH, "tmp" },
211*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_VIMBBOARD, CONTENT_TYPE_X_CNT_VIMBBOARD,
212*b1cdbd2cSJim Jagielski 		  "tmp" },
213*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_VIMBBOARDBOX,
214*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_X_CNT_VIMBBOARDBOX, "tmp" },
215*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_VIMBOX, CONTENT_TYPE_X_CNT_VIMBOX, "tmp" },
216*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_CNT_VIMINBOX, CONTENT_TYPE_X_CNT_VIMINBOX,
217*b1cdbd2cSJim Jagielski 		  "tmp" },
218*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_OCTSTREAM, CONTENT_TYPE_APP_OCTSTREAM, "tmp" },
219*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_PDF, CONTENT_TYPE_APP_PDF, "pdf" },
220*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_RTF, CONTENT_TYPE_APP_RTF, "rtf" },
221*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_CALC, CONTENT_TYPE_APP_VND_CALC, "sdc" },
222*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_CHART, CONTENT_TYPE_APP_VND_CHART, "sds" },
223*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_DRAW, CONTENT_TYPE_APP_VND_DRAW, "sda" },
224*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_IMAGE, CONTENT_TYPE_APP_VND_IMAGE, "sim" },
225*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_IMPRESS, CONTENT_TYPE_APP_VND_IMPRESS,
226*b1cdbd2cSJim Jagielski 		  "sdd" },
227*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_IMPRESSPACKED,
228*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_VND_IMPRESSPACKED, "sdp" },
229*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_MAIL, CONTENT_TYPE_APP_VND_MAIL, "sdm" },
230*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_MATH, CONTENT_TYPE_APP_VND_MATH, "smf" },
231*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_NEWS, CONTENT_TYPE_APP_VND_NEWS, "sdm" },
232*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_OUTTRAY, CONTENT_TYPE_APP_VND_OUTTRAY,
233*b1cdbd2cSJim Jagielski 		  "sdm" },
234*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_TEMPLATE, CONTENT_TYPE_APP_VND_TEMPLATE,
235*b1cdbd2cSJim Jagielski 		  "vor" },
236*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_WRITER, CONTENT_TYPE_APP_VND_WRITER,
237*b1cdbd2cSJim Jagielski 		  "sdw" },
238*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_WRITER_GLOBAL,
239*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "sgl" },
240*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_WRITER_WEB,
241*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_VND_WRITER_WEB, "htm" },
242*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_CALC, CONTENT_TYPE_APP_VND_SUN_XML_CALC, "sxc" },
243*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_CHART, CONTENT_TYPE_APP_VND_SUN_XML_CHART, "sxs" },
244*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_DRAW, CONTENT_TYPE_APP_VND_SUN_XML_DRAW, "sxd" },
245*b1cdbd2cSJim Jagielski  		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_IMPRESS, CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS, "sxi" },
246*b1cdbd2cSJim Jagielski  		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_IMPRESSPACKED, CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED, "sxp" },
247*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_MATH, CONTENT_TYPE_APP_VND_SUN_XML_MATH, "sxm" },
248*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_WRITER, CONTENT_TYPE_APP_VND_SUN_XML_WRITER, "sxw" },
249*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_VND_SUN_XML_WRITER_GLOBAL, CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL, "sxg" },
250*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_FRAMESET, CONTENT_TYPE_APP_FRAMESET, "sfs" },
251*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_GALLERY, CONTENT_TYPE_APP_GALLERY, "gal" },
252*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_GALLERY_THEME, CONTENT_TYPE_APP_GALLERY_THEME,
253*b1cdbd2cSJim Jagielski 		  "thm" },
254*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_JAR, CONTENT_TYPE_APP_JAR, "jar" },
255*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MACRO, CONTENT_TYPE_APP_MACRO, "tmp" },
256*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSEXCEL, CONTENT_TYPE_APP_MSEXCEL, "xls" },
257*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSEXCEL_TEMPL, CONTENT_TYPE_APP_MSEXCEL_TEMPL,
258*b1cdbd2cSJim Jagielski 		  "xlt" },
259*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSPPOINT, CONTENT_TYPE_APP_MSPPOINT, "ppt" },
260*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSPPOINT_TEMPL,
261*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_MSPPOINT_TEMPL, "pot" },
262*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSWORD, CONTENT_TYPE_APP_MSWORD, "doc" },
263*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_MSWORD_TEMPL, CONTENT_TYPE_APP_MSWORD_TEMPL,
264*b1cdbd2cSJim Jagielski 		  "dot" },
265*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_SCHEDULE_CMB, CONTENT_TYPE_APP_SCHEDULE,
266*b1cdbd2cSJim Jagielski 		  "tmp" },
267*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_SCHEDULE_EVT, CONTENT_TYPE_APP_SCHEDULE_EVT,
268*b1cdbd2cSJim Jagielski 		  "tmp" },
269*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_SCHEDULE_FEVT,
270*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_SCHEDULE_FORM_EVT, "tmp" },
271*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_SCHEDULE_FTASK,
272*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_SCHEDULE_FORM_TASK, "tmp" },
273*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_SCHEDULE_TASK, CONTENT_TYPE_APP_SCHEDULE_TASK,
274*b1cdbd2cSJim Jagielski 		  "tmp" },
275*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARCALC, CONTENT_TYPE_APP_STARCALC, "sdc" },
276*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARCHART, CONTENT_TYPE_APP_STARCHART, "sds" },
277*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARDRAW, CONTENT_TYPE_APP_STARDRAW, "sda" },
278*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARHELP, CONTENT_TYPE_APP_STARHELP, "svh" },
279*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARIMAGE, CONTENT_TYPE_APP_STARIMAGE, "sim" },
280*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARIMPRESS, CONTENT_TYPE_APP_STARIMPRESS,
281*b1cdbd2cSJim Jagielski 		  "sdd" },
282*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARMAIL_SDM, CONTENT_TYPE_APP_STARMAIL_SDM,
283*b1cdbd2cSJim Jagielski 		  "sdm" },
284*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARMAIL_SMD, CONTENT_TYPE_APP_STARMAIL_SMD,
285*b1cdbd2cSJim Jagielski 		  "smd" },
286*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARMATH, CONTENT_TYPE_APP_STARMATH, "smf" },
287*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARWRITER, CONTENT_TYPE_APP_STARWRITER,
288*b1cdbd2cSJim Jagielski 		  "sdw" },
289*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_STARWRITER_GLOB,
290*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_STARWRITER_GLOB, "sgl" },
291*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_CDE_CALENDAR_APP,
292*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_APP_CDE_CALENDAR_APP, "appt" },
293*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_APP_ZIP, CONTENT_TYPE_APP_ZIP, "zip" },
294*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_AUDIO_AIFF, CONTENT_TYPE_AUDIO_AIFF, "aif" },
295*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_AUDIO_BASIC, CONTENT_TYPE_AUDIO_BASIC, "au" },
296*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_AUDIO_MIDI, CONTENT_TYPE_AUDIO_MIDI, "mid" },
297*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_AUDIO_WAV, CONTENT_TYPE_AUDIO_WAV, "wav" },
298*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_GENERIC, CONTENT_TYPE_IMAGE_GENERIC, "tmp" },
299*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_GIF, CONTENT_TYPE_IMAGE_GIF, "gif" },
300*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_JPEG, CONTENT_TYPE_IMAGE_JPEG, "jpg" },
301*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_PCX, CONTENT_TYPE_IMAGE_PCX, "pcx" },
302*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_PNG, CONTENT_TYPE_IMAGE_PNG, "png" },
303*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_TIFF, CONTENT_TYPE_IMAGE_TIFF, "tif" },
304*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_IMAGE_BMP, CONTENT_TYPE_IMAGE_BMP, "bmp" },
305*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MSG_RFC822, CONTENT_TYPE_INET_MESSAGE_RFC822,
306*b1cdbd2cSJim Jagielski 		  "tmp" },
307*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MULTI_ALTERNATIVE,
308*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_INET_MULTIPART_ALTERNATIVE, "tmp" },
309*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MULTI_DIGEST,
310*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_INET_MULTIPART_DIGEST, "tmp" },
311*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MULTI_MIXED,
312*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_INET_MULTIPART_MIXED, "tmp" },
313*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MULTI_PARALLEL,
314*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_INET_MULTIPART_PARALLEL, "tmp" },
315*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_INET_MULTI_RELATED,
316*b1cdbd2cSJim Jagielski 		  CONTENT_TYPE_INET_MULTIPART_RELATED, "tmp" },
317*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_ICALENDAR, CONTENT_TYPE_TEXT_ICALENDAR,
318*b1cdbd2cSJim Jagielski 		  "ics" },
319*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_HTML, CONTENT_TYPE_TEXT_HTML, "htm" },
320*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_PLAIN, CONTENT_TYPE_TEXT_PLAIN, "txt" },
321*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_XMLICALENDAR, CONTENT_TYPE_TEXT_XMLICALENDAR,
322*b1cdbd2cSJim Jagielski 		  "xcs" },
323*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_URL, CONTENT_TYPE_TEXT_URL, "url" },
324*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_VCALENDAR, CONTENT_TYPE_TEXT_VCALENDAR,
325*b1cdbd2cSJim Jagielski 		  "vcs" },
326*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_TEXT_VCARD, CONTENT_TYPE_TEXT_VCARD, "vcf" },
327*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_VIDEO_VDO, CONTENT_TYPE_VIDEO_VDO, "vdo" },
328*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_VIDEO_MSVIDEO, CONTENT_TYPE_VIDEO_MSVIDEO, "avi" },
329*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_STARMAIL, CONTENT_TYPE_X_STARMAIL, "smd" },
330*b1cdbd2cSJim Jagielski 		{ CONTENT_TYPE_STR_X_VRML, CONTENT_TYPE_X_VRML, "wrl" }
331*b1cdbd2cSJim Jagielski };
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski //============================================================================
334*b1cdbd2cSJim Jagielski /** A mapping from type IDs to presentation resource IDs.  Sorted by type ID.
335*b1cdbd2cSJim Jagielski  */
336*b1cdbd2cSJim Jagielski sal_uInt16 const aStaticResourceIDMap[CONTENT_TYPE_LAST + 1]
337*b1cdbd2cSJim Jagielski 	= {	STR_SVT_MIMETYPE_APP_OCTSTREAM, // CONTENT_TYPE_UNKNOWN
338*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_OCTSTREAM, // CONTENT_TYPE_APP_OCTSTREAM
339*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_PDF, // CONTENT_TYPE_APP_PDF
340*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_RTF, // CONTENT_TYPE_APP_RTF
341*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSWORD, // CONTENT_TYPE_APP_MSWORD
342*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSWORD, // CONTENT_TYPE_APP_MSWORD_TEMPL //@todo new presentation string?
343*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARCALC, // CONTENT_TYPE_APP_STARCALC
344*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARCHART, // CONTENT_TYPE_APP_STARCHART
345*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARDRAW, // CONTENT_TYPE_APP_STARDRAW
346*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARHELP, // CONTENT_TYPE_APP_STARHELP
347*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARIMAGE, // CONTENT_TYPE_APP_STARIMAGE
348*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARIMPRESS, // CONTENT_TYPE_APP_STARIMPRESS
349*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARMATH, // CONTENT_TYPE_APP_STARMATH
350*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARWRITER, // CONTENT_TYPE_APP_STARWRITER
351*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_ZIP, // CONTENT_TYPE_APP_ZIP
352*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_AUDIO_AIFF, // CONTENT_TYPE_AUDIO_AIFF
353*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_AUDIO_BASIC, // CONTENT_TYPE_AUDIO_BASIC
354*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_AUDIO_MIDI, // CONTENT_TYPE_AUDIO_MIDI
355*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_AUDIO_WAV, // CONTENT_TYPE_AUDIO_WAV
356*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_GIF, // CONTENT_TYPE_IMAGE_GIF
357*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_JPEG, // CONTENT_TYPE_IMAGE_JPEG
358*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_PCX, // CONTENT_TYPE_IMAGE_PCX
359*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_PNG, // CONTENT_TYPE_IMAGE_PNG
360*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_TIFF, // CONTENT_TYPE_IMAGE_TIFF
361*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_BMP, // CONTENT_TYPE_IMAGE_BMP
362*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_HTML, // CONTENT_TYPE_TEXT_HTML
363*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_PLAIN, // CONTENT_TYPE_TEXT_PLAIN
364*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_URL, // CONTENT_TYPE_TEXT_URL
365*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_VCARD, // CONTENT_TYPE_TEXT_VCARD
366*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_VIDEO_VDO, // CONTENT_TYPE_VIDEO_VDO
367*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_VIDEO_MSVIDEO, // CONTENT_TYPE_VIDEO_MSVIDEO
368*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_MSG, // CONTENT_TYPE_X_CNT_MESSAGE
369*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_DOCUMENT, // CONTENT_TYPE_X_CNT_DOCUMENT
370*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_POP3BOX, // CONTENT_TYPE_X_CNT_POP3BOX
371*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_IMAPBOX, // CONTENT_TYPE_X_CNT_IMAPBOX
372*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_IMAPFLD, // CONTENT_TYPE_X_CNT_IMAPFOLDER
373*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_VIMBOX, // CONTENT_TYPE_X_CNT_VIMBOX
374*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_VIMINBOX, // CONTENT_TYPE_X_CNT_VIMINBOX
375*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_BBBOX, // CONTENT_TYPE_X_CNT_VIMBBOARDBOX
376*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_VIM_BB, // CONTENT_TYPE_X_CNT_VIMBBOARD
377*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_NEWSBOX, // CONTENT_TYPE_X_CNT_NEWSBOX
378*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_NEWSGRP, // CONTENT_TYPE_X_CNT_NEWSGROUP
379*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_OUTBOX, // CONTENT_TYPE_X_CNT_OUTBOX
380*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FTPBOX, // CONTENT_TYPE_X_CNT_FTPBOX
381*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FTPFLD, // CONTENT_TYPE_X_CNT_FTPFOLDER
382*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FTPFILE, // CONTENT_TYPE_X_CNT_FTPFILE
383*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FTPLINK, // CONTENT_TYPE_X_CNT_FTPLINK
384*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_HTTPBOX, // CONTENT_TYPE_X_CNT_HTTPBOX
385*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FSYSBOX, // CONTENT_TYPE_X_CNT_FSYSBOX
386*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FSYSFLD, // CONTENT_TYPE_X_CNT_FSYSFOLDER
387*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FSYSFILE, // CONTENT_TYPE_X_CNT_FSYSFILE
388*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FSYSURLFILE, // CONTENT_TYPE_X_CNT_FSYSURLFILE
389*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_PUBLBOX, // CONTENT_TYPE_X_CNT_PUBLISHBOX
390*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_SRCHBOX, // CONTENT_TYPE_X_CNT_SEARCHBOX
391*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_SUBSCRBOX, // CONTENT_TYPE_X_CNT_SUBSCRIBEBOX
392*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_BOOKMARK, // CONTENT_TYPE_X_CNT_BOOKMARK
393*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_CDF, // CONTENT_TYPE_X_CNT_CDF
394*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_CDFSUB, // CONTENT_TYPE_X_CNT_CDFSUB
395*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_CDFITEM, // CONTENT_TYPE_X_CNT_CDFITEM
396*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_TRASHBOX, // CONTENT_TYPE_X_CNT_TRASHBOX
397*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_TRASH, // CONTENT_TYPE_X_CNT_TRASH
398*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_X_STARMAIL
399*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_X_VRML, // CONTENT_TYPE_X_VRML
400*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_REMOV_VOL,
401*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_X_CNT_REMOVEABLE_VOLUME
402*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_FIX_VOL, // CONTENT_TYPE_X_CNT_FIXED_VOLUME
403*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_REM_VOL, // CONTENT_TYPE_X_CNT_REMOTE_VOLUME
404*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_RAM_VOL, // CONTENT_TYPE_X_CNT_RAM_VOLUME
405*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_CDROM, // CONTENT_TYPE_X_CNT_CDROM_VOLUME
406*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_DISK_35, // CONTENT_TYPE_X_CNT_DISK_35
407*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_DISK_525, // CONTENT_TYPE_X_CNT_DISK_525
408*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_TAPEDRIVE, // CONTENT_TYPE_X_CNT_TAPEDRIVE
409*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_GAL, // CONTENT_TYPE_APP_GALLERY
410*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_GAL_THEME, // CONTENT_TYPE_APP_GALLERY_THEME
411*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_STARCHANNEL, // CONTENT_TYPE_X_CNT_STARCHANNEL
412*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_SEPARATOR, // CONTENT_TYPE_X_CNT_SEPARATOR
413*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARW_GLOB, // CONTENT_TYPE_APP_STARWRITER_GLOB
414*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SDM, // CONTENT_TYPE_APP_STARMAIL_SDM
415*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SMD, // CONTENT_TYPE_APP_STARMAIL_SMD
416*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARCALC, // CONTENT_TYPE_APP_VND_CALC
417*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARCHART, // CONTENT_TYPE_APP_VND_CHART
418*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARDRAW, // CONTENT_TYPE_APP_VND_DRAW
419*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARIMAGE, // CONTENT_TYPE_APP_VND_IMAGE
420*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARIMPRESS, // CONTENT_TYPE_APP_VND_IMPRESS
421*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_MAIL
422*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARMATH, // CONTENT_TYPE_APP_VND_MATH
423*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARWRITER, // CONTENT_TYPE_APP_VND_WRITER
424*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARW_GLOB, // CONTENT_TYPE_APP_VND_WRITER_GLOBAL
425*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_STARW_WEB, // CONTENT_TYPE_APP_VND_WRITER_WEB
426*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_SCHEDULE, // CONTENT_TYPE_APP_SCHEDULE
427*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_SCHEDULE_EVT, // CONTENT_TYPE_APP_SCHEDULE_EVT
428*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_SCHEDULE_TASK, // CONTENT_TYPE_APP_SCHEDULE_TASK
429*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_SCHEDULE_FEVT, // CONTENT_TYPE_APP_SCHEDULE_FORM_EVT
430*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_SCHEDULE_FTASK,
431*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_APP_SCHEDULE_FORM_TASK
432*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_FRAMESET, // CONTENT_TYPE_APP_FRAMESET
433*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_MACRO, // CONTENT_TYPE_APP_MACRO
434*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_SFSYSFOLDER,
435*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER
436*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_CNT_SFSYSFILE, // CONTENT_TYPE_X_CNT_FSYSSPECIALFILE
437*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_TEMPLATE, // CONTENT_TYPE_APP_VND_TEMPLATE
438*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_IMAGE_GENERIC, // CONTENT_TYPE_IMAGE_GENERIC
439*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_NEWS
440*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_X_STARMAIL, // CONTENT_TYPE_APP_VND_OUTTRAY
441*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_HTML, // CONTENT_TYPE_X_CNT_HTTPFILE
442*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSEXCEL, // CONTENT_TYPE_APP_MSEXCEL
443*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSEXCEL_TEMPL, // CONTENT_TYPE_APP_MSEXCEL_TEMPL
444*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSPPOINT, // CONTENT_TYPE_APP_MSPPOINT
445*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_MSPPOINT, // CONTENT_TYPE_APP_MSPPOINT_TEMPL //@todo new presentation string?
446*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_VCALENDAR, // CONTENT_TYPE_TEXT_VCALENDAR
447*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_ICALENDAR, // CONTENT_TYPE_TEXT_ICALENDAR
448*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_XMLICALENDAR, // CONTENT_TYPE_TEXT_XMLICALENDAR
449*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_TEXT_CDE_CALENDAR_APP,
450*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_APP_CDE_CALENDAR_APP
451*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MSG_RFC822, // CONTENT_TYPE_INET_MESSAGE_RFC822
452*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MULTI_ALTERNATIVE,
453*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_INET_MULTIPART_ALTERNATIVE
454*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MULTI_DIGEST,
455*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_INET_MULTIPART_DIGEST
456*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MULTI_PARALLEL,
457*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_INET_MULTIPART_PARALLEL
458*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MULTI_RELATED,
459*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_INET_MULTIPART_RELATED
460*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_INET_MULTI_MIXED,
461*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_INET_MULTIPART_MIXED
462*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_IMPRESSPACKED,
463*b1cdbd2cSJim Jagielski 			// CONTENT_TYPE_APP_VND_IMPRESSPACKED
464*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_JAR, // CONTENT_TYPE_APP_JAR
465*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXWRITER, // CONTENT_TYPE_APP_VND_SUN_XML_WRITER
466*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXCALC, // CONTENT_TYPE_APP_VND_SUN_XML_CALC
467*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXIMPRESS, // CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS
468*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXDRAW, // CONTENT_TYPE_APP_VND_SUN_XML_DRAW
469*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXCHART, // CONTENT_TYPE_APP_VND_SUN_XML_CHART
470*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXMATH, // CONTENT_TYPE_APP_VND_SUN_XML_MATH
471*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXGLOBAL, // CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL
472*b1cdbd2cSJim Jagielski 		STR_SVT_MIMETYPE_APP_SXIPACKED, // CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED
473*b1cdbd2cSJim Jagielski  };
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski //============================================================================
476*b1cdbd2cSJim Jagielski /** A mapping from extensions to type IDs.  Sorted by extension.
477*b1cdbd2cSJim Jagielski  */
478*b1cdbd2cSJim Jagielski MediaTypeEntry const aStaticExtensionMap[]
479*b1cdbd2cSJim Jagielski 	= { { "aif", CONTENT_TYPE_AUDIO_AIFF, "" },
480*b1cdbd2cSJim Jagielski 		{ "aiff", CONTENT_TYPE_AUDIO_AIFF, "" },
481*b1cdbd2cSJim Jagielski 		{ "appt", CONTENT_TYPE_APP_CDE_CALENDAR_APP, "" },
482*b1cdbd2cSJim Jagielski 		{ "au", CONTENT_TYPE_AUDIO_BASIC, "" },
483*b1cdbd2cSJim Jagielski 		{ "avi", CONTENT_TYPE_VIDEO_MSVIDEO, "" },
484*b1cdbd2cSJim Jagielski 		{ "bmp", CONTENT_TYPE_IMAGE_BMP, "" },
485*b1cdbd2cSJim Jagielski 		{ "cgm", CONTENT_TYPE_IMAGE_GENERIC, "" },
486*b1cdbd2cSJim Jagielski 		{ "doc", CONTENT_TYPE_APP_MSWORD, "" },
487*b1cdbd2cSJim Jagielski 		{ "dot", CONTENT_TYPE_APP_MSWORD_TEMPL, "" },
488*b1cdbd2cSJim Jagielski 		{ "dxf", CONTENT_TYPE_IMAGE_GENERIC, "" },
489*b1cdbd2cSJim Jagielski 		{ "eps", CONTENT_TYPE_IMAGE_GENERIC, "" },
490*b1cdbd2cSJim Jagielski 		{ "gal", CONTENT_TYPE_APP_GALLERY, "" },
491*b1cdbd2cSJim Jagielski 		{ "gif", CONTENT_TYPE_IMAGE_GIF, "" },
492*b1cdbd2cSJim Jagielski 		{ "htm", CONTENT_TYPE_TEXT_HTML, "" },
493*b1cdbd2cSJim Jagielski 		{ "html", CONTENT_TYPE_TEXT_HTML, "" },
494*b1cdbd2cSJim Jagielski 		{ "ics", CONTENT_TYPE_TEXT_ICALENDAR, "" },
495*b1cdbd2cSJim Jagielski 		{ "jar", CONTENT_TYPE_APP_JAR, "" },
496*b1cdbd2cSJim Jagielski 		{ "jpeg", CONTENT_TYPE_IMAGE_JPEG, "" },
497*b1cdbd2cSJim Jagielski 		{ "jpg", CONTENT_TYPE_IMAGE_JPEG, "" },
498*b1cdbd2cSJim Jagielski 		{ "met", CONTENT_TYPE_IMAGE_GENERIC, "" },
499*b1cdbd2cSJim Jagielski 		{ "mid", CONTENT_TYPE_AUDIO_MIDI, "" },
500*b1cdbd2cSJim Jagielski 		{ "midi", CONTENT_TYPE_AUDIO_MIDI, "" },
501*b1cdbd2cSJim Jagielski 		{ "pbm", CONTENT_TYPE_IMAGE_GENERIC, "" },
502*b1cdbd2cSJim Jagielski 		{ "pcd", CONTENT_TYPE_IMAGE_GENERIC, "" },
503*b1cdbd2cSJim Jagielski 		{ "pct", CONTENT_TYPE_IMAGE_GENERIC, "" },
504*b1cdbd2cSJim Jagielski 		{ "pcx", CONTENT_TYPE_IMAGE_PCX, "" },
505*b1cdbd2cSJim Jagielski 		{ "pdf", CONTENT_TYPE_APP_PDF, "" },
506*b1cdbd2cSJim Jagielski 		{ "pgm", CONTENT_TYPE_IMAGE_GENERIC, "" },
507*b1cdbd2cSJim Jagielski 		{ "png", CONTENT_TYPE_IMAGE_PNG, "" },
508*b1cdbd2cSJim Jagielski 		{ "pot", CONTENT_TYPE_APP_MSPPOINT_TEMPL, "" },
509*b1cdbd2cSJim Jagielski 		{ "ppm", CONTENT_TYPE_IMAGE_GENERIC, "" },
510*b1cdbd2cSJim Jagielski 		{ "ppt", CONTENT_TYPE_APP_MSPPOINT, "" },
511*b1cdbd2cSJim Jagielski 		{ "psd", CONTENT_TYPE_IMAGE_GENERIC, "" },
512*b1cdbd2cSJim Jagielski 		{ "ras", CONTENT_TYPE_IMAGE_GENERIC, "" },
513*b1cdbd2cSJim Jagielski 		{ "rtf", CONTENT_TYPE_APP_RTF, "" },
514*b1cdbd2cSJim Jagielski 		{ "sda", CONTENT_TYPE_APP_VND_DRAW, "" },
515*b1cdbd2cSJim Jagielski 		{ "sdc", CONTENT_TYPE_APP_VND_CALC, "" },
516*b1cdbd2cSJim Jagielski 		{ "sdd", CONTENT_TYPE_APP_VND_IMPRESS, "" },
517*b1cdbd2cSJim Jagielski 		{ "sdm", CONTENT_TYPE_APP_VND_MAIL, "" },
518*b1cdbd2cSJim Jagielski 		{ "sdp", CONTENT_TYPE_APP_VND_IMPRESSPACKED, "" },
519*b1cdbd2cSJim Jagielski 		{ "sds", CONTENT_TYPE_APP_VND_CHART, "" },
520*b1cdbd2cSJim Jagielski 		{ "sdw", CONTENT_TYPE_APP_VND_WRITER, "" },
521*b1cdbd2cSJim Jagielski 		{ "sd~", CONTENT_TYPE_X_STARMAIL, "" },
522*b1cdbd2cSJim Jagielski 		{ "sfs", CONTENT_TYPE_APP_FRAMESET , "" },
523*b1cdbd2cSJim Jagielski 		{ "sgl", CONTENT_TYPE_APP_VND_WRITER_GLOBAL , "" },
524*b1cdbd2cSJim Jagielski 		{ "sim", CONTENT_TYPE_APP_VND_IMAGE, "" },
525*b1cdbd2cSJim Jagielski 		{ "smd", CONTENT_TYPE_APP_STARMAIL_SMD, "" }, //CONTENT_TYPE_X_STARMAIL
526*b1cdbd2cSJim Jagielski 		{ "smf", CONTENT_TYPE_APP_VND_MATH, "" },
527*b1cdbd2cSJim Jagielski 		{ "svh", CONTENT_TYPE_APP_STARHELP, "" },
528*b1cdbd2cSJim Jagielski 		{ "svm", CONTENT_TYPE_IMAGE_GENERIC, "" },
529*b1cdbd2cSJim Jagielski 		{ "sxc", CONTENT_TYPE_APP_VND_SUN_XML_CALC, "" },
530*b1cdbd2cSJim Jagielski 		{ "sxd", CONTENT_TYPE_APP_VND_SUN_XML_DRAW, "" },
531*b1cdbd2cSJim Jagielski 		{ "sxg", CONTENT_TYPE_APP_VND_SUN_XML_WRITER_GLOBAL, "" },
532*b1cdbd2cSJim Jagielski 		{ "sxi", CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS, "" },
533*b1cdbd2cSJim Jagielski 		{ "sxm", CONTENT_TYPE_APP_VND_SUN_XML_MATH, "" },
534*b1cdbd2cSJim Jagielski 		{ "sxp", CONTENT_TYPE_APP_VND_SUN_XML_IMPRESSPACKED, "" },
535*b1cdbd2cSJim Jagielski 		{ "sxs", CONTENT_TYPE_APP_VND_SUN_XML_CHART, "" },
536*b1cdbd2cSJim Jagielski 		{ "sxw", CONTENT_TYPE_APP_VND_SUN_XML_WRITER, "" },
537*b1cdbd2cSJim Jagielski 		{ "tga", CONTENT_TYPE_IMAGE_GENERIC, "" },
538*b1cdbd2cSJim Jagielski 		{ "thm", CONTENT_TYPE_APP_GALLERY_THEME, "" },
539*b1cdbd2cSJim Jagielski 		{ "tif", CONTENT_TYPE_IMAGE_TIFF, "" },
540*b1cdbd2cSJim Jagielski 		{ "tiff", CONTENT_TYPE_IMAGE_TIFF, "" },
541*b1cdbd2cSJim Jagielski 		{ "txt", CONTENT_TYPE_TEXT_PLAIN, "" },
542*b1cdbd2cSJim Jagielski 		{ "url", CONTENT_TYPE_TEXT_URL, "" },
543*b1cdbd2cSJim Jagielski 		{ "vcf", CONTENT_TYPE_TEXT_VCARD, "" },
544*b1cdbd2cSJim Jagielski 		{ "vcs", CONTENT_TYPE_TEXT_VCALENDAR, "" },
545*b1cdbd2cSJim Jagielski 		{ "vdo", CONTENT_TYPE_VIDEO_VDO, "" },
546*b1cdbd2cSJim Jagielski 		{ "vor", CONTENT_TYPE_APP_VND_TEMPLATE, "" },
547*b1cdbd2cSJim Jagielski 		{ "wav", CONTENT_TYPE_AUDIO_WAV, "" },
548*b1cdbd2cSJim Jagielski 		{ "wmf", CONTENT_TYPE_IMAGE_GENERIC, "" },
549*b1cdbd2cSJim Jagielski 		{ "wrl", CONTENT_TYPE_X_VRML, "" },
550*b1cdbd2cSJim Jagielski 		{ "xbm", CONTENT_TYPE_IMAGE_GENERIC, "" },
551*b1cdbd2cSJim Jagielski 		{ "xcs", CONTENT_TYPE_TEXT_XMLICALENDAR, "" },
552*b1cdbd2cSJim Jagielski 		{ "xls", CONTENT_TYPE_APP_MSEXCEL, "" },
553*b1cdbd2cSJim Jagielski 		{ "xlt", CONTENT_TYPE_APP_MSEXCEL_TEMPL, "" },
554*b1cdbd2cSJim Jagielski 		{ "xlw", CONTENT_TYPE_APP_MSEXCEL, "" },
555*b1cdbd2cSJim Jagielski 		{ "xpm", CONTENT_TYPE_IMAGE_GENERIC, "" },
556*b1cdbd2cSJim Jagielski 		{ "zip", CONTENT_TYPE_APP_ZIP, "" } };
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski //============================================================================
559*b1cdbd2cSJim Jagielski /** A mapping from presentations to type IDs.  Sorted by presentations.
560*b1cdbd2cSJim Jagielski  */
561*b1cdbd2cSJim Jagielski MediaTypeEntry const aStaticPresentationMap[]
562*b1cdbd2cSJim Jagielski 	= { { "Binary Data", CONTENT_TYPE_APP_OCTSTREAM, "" },
563*b1cdbd2cSJim Jagielski 		{ "Bitmap", CONTENT_TYPE_IMAGE_BMP, "" },
564*b1cdbd2cSJim Jagielski 		{ "DOS Command File", CONTENT_TYPE_APP_OCTSTREAM, "" },
565*b1cdbd2cSJim Jagielski 		{ "Digital Video", CONTENT_TYPE_VIDEO_MSVIDEO, "" },
566*b1cdbd2cSJim Jagielski 		{ "Executable", CONTENT_TYPE_APP_OCTSTREAM, "" },
567*b1cdbd2cSJim Jagielski 		{ "Grafik", CONTENT_TYPE_IMAGE_GENERIC, "" },
568*b1cdbd2cSJim Jagielski 		{ "HTM", CONTENT_TYPE_TEXT_HTML, "" },
569*b1cdbd2cSJim Jagielski 		{ "HTML", CONTENT_TYPE_TEXT_HTML, "" },
570*b1cdbd2cSJim Jagielski 		{ "Hypertext", CONTENT_TYPE_TEXT_HTML, "" },
571*b1cdbd2cSJim Jagielski 		{ "Icon", CONTENT_TYPE_IMAGE_GENERIC, "" },
572*b1cdbd2cSJim Jagielski 		{ "Image File", CONTENT_TYPE_IMAGE_GENERIC, "" },
573*b1cdbd2cSJim Jagielski 		{ "MIDI", CONTENT_TYPE_AUDIO_MIDI, "" },
574*b1cdbd2cSJim Jagielski 		{ "Master Document", CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "" },
575*b1cdbd2cSJim Jagielski 		{ "Plain Text", CONTENT_TYPE_TEXT_PLAIN, "" },
576*b1cdbd2cSJim Jagielski 		{ "StarCalc", CONTENT_TYPE_APP_VND_CALC, "" },
577*b1cdbd2cSJim Jagielski 		{ "StarCalc 3.0", CONTENT_TYPE_APP_VND_CALC, "" },
578*b1cdbd2cSJim Jagielski 		{ "StarCalc 4.0", CONTENT_TYPE_APP_VND_CALC, "" },
579*b1cdbd2cSJim Jagielski 		{ "StarCalc 5.0", CONTENT_TYPE_APP_VND_CALC, "" },
580*b1cdbd2cSJim Jagielski 		{ "StarCalc Datei", CONTENT_TYPE_APP_VND_CALC, "" },
581*b1cdbd2cSJim Jagielski 		{ "StarCalc Document", CONTENT_TYPE_APP_VND_CALC, "" },
582*b1cdbd2cSJim Jagielski 		{ "StarCalc File", CONTENT_TYPE_APP_VND_CALC, "" },
583*b1cdbd2cSJim Jagielski 		{ "StarChart 3.0", CONTENT_TYPE_APP_VND_CHART, "" },
584*b1cdbd2cSJim Jagielski 		{ "StarChart 4.0", CONTENT_TYPE_APP_VND_CHART, "" },
585*b1cdbd2cSJim Jagielski 		{ "StarChart 5.0", CONTENT_TYPE_APP_VND_CHART, "" },
586*b1cdbd2cSJim Jagielski 		{ "StarChart Document", CONTENT_TYPE_APP_VND_CHART, "" },
587*b1cdbd2cSJim Jagielski 		{ "StarDraw 3.0", CONTENT_TYPE_APP_VND_DRAW, "" },
588*b1cdbd2cSJim Jagielski 		{ "StarDraw 5.0", CONTENT_TYPE_APP_VND_DRAW, "" },
589*b1cdbd2cSJim Jagielski 		{ "StarDraw", CONTENT_TYPE_APP_VND_DRAW, "" },
590*b1cdbd2cSJim Jagielski 		{ "StarDraw Document", CONTENT_TYPE_APP_VND_DRAW, "" },
591*b1cdbd2cSJim Jagielski 		{ "StarImpress 4.0", CONTENT_TYPE_APP_VND_IMPRESS, "" },
592*b1cdbd2cSJim Jagielski 		{ "StarImpress 5.0 (packed)", CONTENT_TYPE_APP_VND_IMPRESSPACKED, "" },
593*b1cdbd2cSJim Jagielski 		{ "StarImpress 5.0", CONTENT_TYPE_APP_VND_IMPRESS, "" },
594*b1cdbd2cSJim Jagielski 		{ "StarImpress Document", CONTENT_TYPE_APP_VND_IMPRESS, "" },
595*b1cdbd2cSJim Jagielski 		{ "StarMath 3.0", CONTENT_TYPE_APP_VND_MATH, "" },
596*b1cdbd2cSJim Jagielski 		{ "StarMath 4.0", CONTENT_TYPE_APP_VND_MATH, "" },
597*b1cdbd2cSJim Jagielski 		{ "StarMath 5.0", CONTENT_TYPE_APP_VND_MATH, "" },
598*b1cdbd2cSJim Jagielski 		{ "StarMath Document", CONTENT_TYPE_APP_VND_MATH, "" },
599*b1cdbd2cSJim Jagielski 		{ "StarMessage5", CONTENT_TYPE_APP_VND_MAIL, "" },
600*b1cdbd2cSJim Jagielski 		{ "StarOffice XML (Calc)", CONTENT_TYPE_APP_VND_SUN_XML_CALC, "" },
601*b1cdbd2cSJim Jagielski 		{ "StarOffice XML (Impress)", CONTENT_TYPE_APP_VND_SUN_XML_IMPRESS, "" },
602*b1cdbd2cSJim Jagielski 		{ "StarOffice XML (Draw)", CONTENT_TYPE_APP_VND_SUN_XML_DRAW, "" },
603*b1cdbd2cSJim Jagielski 		{ "StarOffice XML (Chart)", CONTENT_TYPE_APP_VND_SUN_XML_CHART, "" },
604*b1cdbd2cSJim Jagielski 		{ "StarOffice XML (Writer)", CONTENT_TYPE_APP_VND_SUN_XML_WRITER, "" },
605*b1cdbd2cSJim Jagielski 		{ "StarWriter", CONTENT_TYPE_APP_VND_WRITER, "" },
606*b1cdbd2cSJim Jagielski 		{ "StarWriter 3.0", CONTENT_TYPE_APP_VND_WRITER, "" },
607*b1cdbd2cSJim Jagielski 		{ "StarWriter 4.0", CONTENT_TYPE_APP_VND_WRITER, "" },
608*b1cdbd2cSJim Jagielski 		{ "StarWriter 5.0", CONTENT_TYPE_APP_VND_WRITER, "" },
609*b1cdbd2cSJim Jagielski 		{ "StarWriter Document", CONTENT_TYPE_APP_VND_WRITER, "" },
610*b1cdbd2cSJim Jagielski 		{ "StarWriter/Global 5.0", CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "" },
611*b1cdbd2cSJim Jagielski 		{ "StarWriter/Global Document", CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "" },
612*b1cdbd2cSJim Jagielski 		{ "StarWriter/Web 5.0", CONTENT_TYPE_APP_VND_WRITER_WEB, "" },
613*b1cdbd2cSJim Jagielski 		{ "StarWriterGlobal Document", CONTENT_TYPE_APP_VND_WRITER_GLOBAL, "" },
614*b1cdbd2cSJim Jagielski 		{ "StarWriterHtml Document", CONTENT_TYPE_APP_VND_WRITER_WEB, "" },
615*b1cdbd2cSJim Jagielski 		{ "UniformResourceLocator", CONTENT_TYPE_TEXT_URL, "" },
616*b1cdbd2cSJim Jagielski 		{ "text/html", CONTENT_TYPE_TEXT_HTML, "" } };
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski //============================================================================
621*b1cdbd2cSJim Jagielski //
622*b1cdbd2cSJim Jagielski //  Registration
623*b1cdbd2cSJim Jagielski //
624*b1cdbd2cSJim Jagielski //============================================================================
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski // static
627*b1cdbd2cSJim Jagielski Registration * Registration::m_pRegistration = 0;
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski //============================================================================
~Registration()630*b1cdbd2cSJim Jagielski Registration::~Registration()
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski 	{for (sal_uLong i = 0; i < m_aTypeIDMap.Count(); ++i)
633*b1cdbd2cSJim Jagielski 		delete static_cast< TypeIDMapEntry * >(m_aTypeIDMap.GetObject(i));
634*b1cdbd2cSJim Jagielski 	}
635*b1cdbd2cSJim Jagielski 	m_aTypeIDMap.Clear();
636*b1cdbd2cSJim Jagielski 	{for (sal_uInt16 i = 0; i < m_aTypeNameMap.Count(); ++i)
637*b1cdbd2cSJim Jagielski 		delete static_cast< TypeNameMapEntry * >(m_aTypeNameMap.GetObject(i));
638*b1cdbd2cSJim Jagielski 	}
639*b1cdbd2cSJim Jagielski 	m_aTypeNameMap.Remove(sal_uInt16(0), m_aTypeNameMap.Count());
640*b1cdbd2cSJim Jagielski 	{for (sal_uInt16 i = 0; i < m_aExtensionMap.Count(); ++i)
641*b1cdbd2cSJim Jagielski 		delete
642*b1cdbd2cSJim Jagielski 			static_cast< ExtensionMapEntry * >(m_aExtensionMap.GetObject(i));
643*b1cdbd2cSJim Jagielski 	}
644*b1cdbd2cSJim Jagielski 	m_aExtensionMap.Remove(sal_uInt16(0), m_aExtensionMap.Count());
645*b1cdbd2cSJim Jagielski }
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski //============================================================================
648*b1cdbd2cSJim Jagielski // static
getExtensionEntry(UniString const & rTypeName)649*b1cdbd2cSJim Jagielski TypeNameMapEntry * Registration::getExtensionEntry(UniString const &
650*b1cdbd2cSJim Jagielski 												       rTypeName)
651*b1cdbd2cSJim Jagielski {
652*b1cdbd2cSJim Jagielski 	if (m_pRegistration)
653*b1cdbd2cSJim Jagielski 	{
654*b1cdbd2cSJim Jagielski 		UniString aTheTypeName = rTypeName;
655*b1cdbd2cSJim Jagielski 		aTheTypeName.ToLowerAscii();
656*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos;
657*b1cdbd2cSJim Jagielski 		if (m_pRegistration->m_aTypeNameMap.Seek_Entry(&aTheTypeName, &nPos))
658*b1cdbd2cSJim Jagielski 			return static_cast< TypeNameMapEntry * >(m_pRegistration->
659*b1cdbd2cSJim Jagielski 													     m_aTypeNameMap.
660*b1cdbd2cSJim Jagielski 													         GetObject(nPos));
661*b1cdbd2cSJim Jagielski 	}
662*b1cdbd2cSJim Jagielski 	return 0;
663*b1cdbd2cSJim Jagielski }
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski //============================================================================
666*b1cdbd2cSJim Jagielski // static
RegisterContentType(UniString const & rTypeName,UniString const & rPresentation,UniString const * pExtension,UniString const * pSystemFileType)667*b1cdbd2cSJim Jagielski INetContentType Registration::RegisterContentType(UniString const & rTypeName,
668*b1cdbd2cSJim Jagielski 												  UniString const &
669*b1cdbd2cSJim Jagielski 												      rPresentation,
670*b1cdbd2cSJim Jagielski 												  UniString const *
671*b1cdbd2cSJim Jagielski 												      pExtension,
672*b1cdbd2cSJim Jagielski 												  UniString const *
673*b1cdbd2cSJim Jagielski 												      pSystemFileType)
674*b1cdbd2cSJim Jagielski {
675*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
676*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski 	DBG_ASSERT(GetContentType(rTypeName) == CONTENT_TYPE_UNKNOWN,
679*b1cdbd2cSJim Jagielski 			   "Registration::RegisterContentType(): Already registered");
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski 	INetContentType eTypeID
682*b1cdbd2cSJim Jagielski 		= INetContentType(m_pRegistration->m_nNextDynamicID++);
683*b1cdbd2cSJim Jagielski 	UniString aTheTypeName = rTypeName;
684*b1cdbd2cSJim Jagielski 	aTheTypeName.ToLowerAscii();
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 	TypeIDMapEntry * pTypeIDMapEntry = new TypeIDMapEntry;
687*b1cdbd2cSJim Jagielski 	pTypeIDMapEntry->m_aTypeName = aTheTypeName;
688*b1cdbd2cSJim Jagielski 	pTypeIDMapEntry->m_aPresentation = rPresentation;
689*b1cdbd2cSJim Jagielski 	if (pSystemFileType)
690*b1cdbd2cSJim Jagielski 		pTypeIDMapEntry->m_aSystemFileType = *pSystemFileType;
691*b1cdbd2cSJim Jagielski 	m_pRegistration->m_aTypeIDMap.Insert(eTypeID, pTypeIDMapEntry);
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 	TypeNameMapEntry * pTypeNameMapEntry = new TypeNameMapEntry(aTheTypeName);
694*b1cdbd2cSJim Jagielski 	if (pExtension)
695*b1cdbd2cSJim Jagielski 		pTypeNameMapEntry->m_aExtension = *pExtension;
696*b1cdbd2cSJim Jagielski 	pTypeNameMapEntry->m_eTypeID = eTypeID;
697*b1cdbd2cSJim Jagielski 	m_pRegistration->m_aTypeNameMap.Insert(pTypeNameMapEntry);
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 	if (pExtension)
700*b1cdbd2cSJim Jagielski 	{
701*b1cdbd2cSJim Jagielski 		ExtensionMapEntry * pExtensionMapEntry
702*b1cdbd2cSJim Jagielski 			= new ExtensionMapEntry(*pExtension);
703*b1cdbd2cSJim Jagielski 		pExtensionMapEntry->m_eTypeID = eTypeID;
704*b1cdbd2cSJim Jagielski 		m_pRegistration->m_aExtensionMap.Insert(pExtensionMapEntry);
705*b1cdbd2cSJim Jagielski 	}
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski 	return eTypeID;
708*b1cdbd2cSJim Jagielski }
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski //============================================================================
711*b1cdbd2cSJim Jagielski // static
GetContentType(UniString const & rTypeName)712*b1cdbd2cSJim Jagielski INetContentType Registration::GetContentType(UniString const & rTypeName)
713*b1cdbd2cSJim Jagielski {
714*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
715*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 	UniString aTheTypeName = rTypeName;
718*b1cdbd2cSJim Jagielski 	aTheTypeName.ToLowerAscii();
719*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos;
720*b1cdbd2cSJim Jagielski 	return m_pRegistration->m_aTypeNameMap.Seek_Entry(&aTheTypeName, &nPos) ?
721*b1cdbd2cSJim Jagielski 		       static_cast< TypeNameMapEntry * >(m_pRegistration->
722*b1cdbd2cSJim Jagielski 												     m_aTypeNameMap.
723*b1cdbd2cSJim Jagielski 												         GetObject(nPos))->
724*b1cdbd2cSJim Jagielski 		           m_eTypeID :
725*b1cdbd2cSJim Jagielski 		       CONTENT_TYPE_UNKNOWN;
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski //============================================================================
729*b1cdbd2cSJim Jagielski // static
GetContentType(INetContentType eTypeID)730*b1cdbd2cSJim Jagielski UniString Registration::GetContentType(INetContentType eTypeID)
731*b1cdbd2cSJim Jagielski {
732*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
733*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	TypeIDMapEntry * pEntry
736*b1cdbd2cSJim Jagielski 		= static_cast< TypeIDMapEntry * >(m_pRegistration->
737*b1cdbd2cSJim Jagielski 										      m_aTypeIDMap.Get(eTypeID));
738*b1cdbd2cSJim Jagielski 	return pEntry ? pEntry->m_aTypeName : UniString();
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski //============================================================================
742*b1cdbd2cSJim Jagielski // static
GetPresentation(INetContentType eTypeID)743*b1cdbd2cSJim Jagielski UniString Registration::GetPresentation(INetContentType eTypeID)
744*b1cdbd2cSJim Jagielski {
745*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
746*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski 	TypeIDMapEntry * pEntry
749*b1cdbd2cSJim Jagielski 		= static_cast< TypeIDMapEntry * >(m_pRegistration->
750*b1cdbd2cSJim Jagielski 										      m_aTypeIDMap.Get(eTypeID));
751*b1cdbd2cSJim Jagielski 	return pEntry ? pEntry->m_aPresentation : UniString();
752*b1cdbd2cSJim Jagielski }
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski //============================================================================
755*b1cdbd2cSJim Jagielski // static
GetExtension(UniString const & rTypeName)756*b1cdbd2cSJim Jagielski UniString Registration::GetExtension(UniString const & rTypeName)
757*b1cdbd2cSJim Jagielski {
758*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
759*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 	UniString aTheTypeName = rTypeName;
762*b1cdbd2cSJim Jagielski 	aTheTypeName.ToLowerAscii();
763*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos;
764*b1cdbd2cSJim Jagielski 	return m_pRegistration->m_aTypeNameMap.Seek_Entry(&aTheTypeName, &nPos) ?
765*b1cdbd2cSJim Jagielski 		       static_cast< TypeNameMapEntry * >(m_pRegistration->
766*b1cdbd2cSJim Jagielski 												     m_aTypeNameMap.
767*b1cdbd2cSJim Jagielski 												         GetObject(nPos))->
768*b1cdbd2cSJim Jagielski 		           m_aExtension :
769*b1cdbd2cSJim Jagielski 		       UniString();
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski //============================================================================
773*b1cdbd2cSJim Jagielski // static
GetContentType4Extension(UniString const & rExtension)774*b1cdbd2cSJim Jagielski INetContentType Registration::GetContentType4Extension(UniString const &
775*b1cdbd2cSJim Jagielski 													       rExtension)
776*b1cdbd2cSJim Jagielski {
777*b1cdbd2cSJim Jagielski 	if (!m_pRegistration)
778*b1cdbd2cSJim Jagielski 		m_pRegistration = new Registration;
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos;
781*b1cdbd2cSJim Jagielski 	return m_pRegistration->
782*b1cdbd2cSJim Jagielski 		           m_aExtensionMap.
783*b1cdbd2cSJim Jagielski 		               Seek_Entry(const_cast< UniString * >(&rExtension),
784*b1cdbd2cSJim Jagielski 								  &nPos) ?
785*b1cdbd2cSJim Jagielski 		       static_cast< ExtensionMapEntry * >(m_pRegistration->
786*b1cdbd2cSJim Jagielski 												      m_aExtensionMap.
787*b1cdbd2cSJim Jagielski 												          GetObject(nPos))->
788*b1cdbd2cSJim Jagielski 		           m_eTypeID :
789*b1cdbd2cSJim Jagielski 		       CONTENT_TYPE_UNKNOWN;
790*b1cdbd2cSJim Jagielski }
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski //============================================================================
793*b1cdbd2cSJim Jagielski //
794*b1cdbd2cSJim Jagielski //  seekEntry
795*b1cdbd2cSJim Jagielski //
796*b1cdbd2cSJim Jagielski //============================================================================
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski namespace unnamed_svl_inettype {
799*b1cdbd2cSJim Jagielski 
seekEntry(UniString const & rTypeName,MediaTypeEntry const * pMap,sal_Size nSize)800*b1cdbd2cSJim Jagielski MediaTypeEntry const * seekEntry(UniString const & rTypeName,
801*b1cdbd2cSJim Jagielski 								 MediaTypeEntry const * pMap, sal_Size nSize)
802*b1cdbd2cSJim Jagielski {
803*b1cdbd2cSJim Jagielski #if defined DBG_UTIL
804*b1cdbd2cSJim Jagielski     for (sal_Size i = 0; i < nSize - 1; ++i)
805*b1cdbd2cSJim Jagielski         DBG_ASSERT(
806*b1cdbd2cSJim Jagielski             rtl_str_compare(
807*b1cdbd2cSJim Jagielski                 pMap[i].m_pTypeName, pMap[i + 1].m_pTypeName) < 0,
808*b1cdbd2cSJim Jagielski             "seekEntry(): Bad map");
809*b1cdbd2cSJim Jagielski #endif
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski 	sal_Size nLow = 0;
812*b1cdbd2cSJim Jagielski 	sal_Size nHigh = nSize;
813*b1cdbd2cSJim Jagielski 	while (nLow != nHigh)
814*b1cdbd2cSJim Jagielski 	{
815*b1cdbd2cSJim Jagielski 		sal_Size nMiddle = (nLow + nHigh) / 2;
816*b1cdbd2cSJim Jagielski 		MediaTypeEntry const * pEntry = pMap + nMiddle;
817*b1cdbd2cSJim Jagielski 		switch (rTypeName.CompareIgnoreCaseToAscii(pEntry->m_pTypeName))
818*b1cdbd2cSJim Jagielski 		{
819*b1cdbd2cSJim Jagielski 			case COMPARE_LESS:
820*b1cdbd2cSJim Jagielski 				nHigh = nMiddle;
821*b1cdbd2cSJim Jagielski 				break;
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 			case COMPARE_EQUAL:
824*b1cdbd2cSJim Jagielski 				return pEntry;
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 			case COMPARE_GREATER:
827*b1cdbd2cSJim Jagielski 				nLow = nMiddle + 1;
828*b1cdbd2cSJim Jagielski 				break;
829*b1cdbd2cSJim Jagielski 		}
830*b1cdbd2cSJim Jagielski 	}
831*b1cdbd2cSJim Jagielski 	return 0;
832*b1cdbd2cSJim Jagielski }
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski //============================================================================
837*b1cdbd2cSJim Jagielski //
838*b1cdbd2cSJim Jagielski //  INetContentTypes
839*b1cdbd2cSJim Jagielski //
840*b1cdbd2cSJim Jagielski //============================================================================
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski //static
Uninitialize()843*b1cdbd2cSJim Jagielski void INetContentTypes::Uninitialize()
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski 	Registration::deinitialize();
846*b1cdbd2cSJim Jagielski }
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski //============================================================================
849*b1cdbd2cSJim Jagielski //static
RegisterContentType(UniString const & rTypeName,UniString const & rPresentation,UniString const * pExtension,UniString const * pSystemFileType)850*b1cdbd2cSJim Jagielski INetContentType INetContentTypes::RegisterContentType(UniString const &
851*b1cdbd2cSJim Jagielski 													      rTypeName,
852*b1cdbd2cSJim Jagielski 													  UniString const &
853*b1cdbd2cSJim Jagielski 													      rPresentation,
854*b1cdbd2cSJim Jagielski 													  UniString const *
855*b1cdbd2cSJim Jagielski 													      pExtension,
856*b1cdbd2cSJim Jagielski 													  UniString const *
857*b1cdbd2cSJim Jagielski 													      pSystemFileType)
858*b1cdbd2cSJim Jagielski {
859*b1cdbd2cSJim Jagielski 	INetContentType eTypeID = GetContentType(rTypeName);
860*b1cdbd2cSJim Jagielski 	if (eTypeID == CONTENT_TYPE_UNKNOWN)
861*b1cdbd2cSJim Jagielski 		eTypeID = Registration::RegisterContentType(rTypeName, rPresentation,
862*b1cdbd2cSJim Jagielski 													pExtension,
863*b1cdbd2cSJim Jagielski 													pSystemFileType);
864*b1cdbd2cSJim Jagielski 	else if (eTypeID > CONTENT_TYPE_LAST)
865*b1cdbd2cSJim Jagielski 	{
866*b1cdbd2cSJim Jagielski 		TypeIDMapEntry * pTypeEntry = Registration::getEntry(eTypeID);
867*b1cdbd2cSJim Jagielski 		if (pTypeEntry)
868*b1cdbd2cSJim Jagielski 		{
869*b1cdbd2cSJim Jagielski 			if (rPresentation.Len() != 0)
870*b1cdbd2cSJim Jagielski 				pTypeEntry->m_aPresentation = rPresentation;
871*b1cdbd2cSJim Jagielski 			if (pSystemFileType)
872*b1cdbd2cSJim Jagielski 				pTypeEntry->m_aSystemFileType = *pSystemFileType;
873*b1cdbd2cSJim Jagielski 		}
874*b1cdbd2cSJim Jagielski 		if (pExtension)
875*b1cdbd2cSJim Jagielski 		{
876*b1cdbd2cSJim Jagielski 			TypeNameMapEntry * pEntry
877*b1cdbd2cSJim Jagielski 				= Registration::getExtensionEntry(rTypeName);
878*b1cdbd2cSJim Jagielski 			if (pEntry)
879*b1cdbd2cSJim Jagielski 				pEntry->m_aExtension = *pExtension;
880*b1cdbd2cSJim Jagielski 		}
881*b1cdbd2cSJim Jagielski 	}
882*b1cdbd2cSJim Jagielski 	return eTypeID;
883*b1cdbd2cSJim Jagielski }
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski //============================================================================
886*b1cdbd2cSJim Jagielski // static
GetContentType(UniString const & rTypeName)887*b1cdbd2cSJim Jagielski INetContentType INetContentTypes::GetContentType(UniString const & rTypeName)
888*b1cdbd2cSJim Jagielski {
889*b1cdbd2cSJim Jagielski 	UniString aType;
890*b1cdbd2cSJim Jagielski 	UniString aSubType;
891*b1cdbd2cSJim Jagielski 	if (parse(rTypeName, aType, aSubType))
892*b1cdbd2cSJim Jagielski 	{
893*b1cdbd2cSJim Jagielski 		aType += '/';
894*b1cdbd2cSJim Jagielski 		aType += aSubType;
895*b1cdbd2cSJim Jagielski 		MediaTypeEntry const * pEntry = seekEntry(aType, aStaticTypeNameMap,
896*b1cdbd2cSJim Jagielski 												  CONTENT_TYPE_LAST + 1);
897*b1cdbd2cSJim Jagielski 		return pEntry ? pEntry->m_eTypeID :
898*b1cdbd2cSJim Jagielski 			            Registration::GetContentType(aType);
899*b1cdbd2cSJim Jagielski 	}
900*b1cdbd2cSJim Jagielski 	else
901*b1cdbd2cSJim Jagielski 		return
902*b1cdbd2cSJim Jagielski 			rTypeName.EqualsIgnoreCaseAscii(CONTENT_TYPE_STR_X_STARMAIL) ?
903*b1cdbd2cSJim Jagielski 			    CONTENT_TYPE_X_STARMAIL : CONTENT_TYPE_UNKNOWN;
904*b1cdbd2cSJim Jagielski 			// the content type "x-starmail" has no sub type
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski //============================================================================
908*b1cdbd2cSJim Jagielski //static
GetContentType(INetContentType eTypeID)909*b1cdbd2cSJim Jagielski UniString INetContentTypes::GetContentType(INetContentType eTypeID)
910*b1cdbd2cSJim Jagielski {
911*b1cdbd2cSJim Jagielski 	static sal_Char const * aMap[CONTENT_TYPE_LAST + 1];
912*b1cdbd2cSJim Jagielski 	static bool bInitialized = false;
913*b1cdbd2cSJim Jagielski 	if (!bInitialized)
914*b1cdbd2cSJim Jagielski 	{
915*b1cdbd2cSJim Jagielski 		for (sal_Size i = 0; i <= CONTENT_TYPE_LAST; ++i)
916*b1cdbd2cSJim Jagielski 			aMap[aStaticTypeNameMap[i].m_eTypeID]
917*b1cdbd2cSJim Jagielski 				= aStaticTypeNameMap[i].m_pTypeName;
918*b1cdbd2cSJim Jagielski 		aMap[CONTENT_TYPE_UNKNOWN] = CONTENT_TYPE_STR_APP_OCTSTREAM;
919*b1cdbd2cSJim Jagielski 		aMap[CONTENT_TYPE_TEXT_PLAIN] = CONTENT_TYPE_STR_TEXT_PLAIN
920*b1cdbd2cSJim Jagielski 			                                "; charset=iso-8859-1";
921*b1cdbd2cSJim Jagielski 		bInitialized = true;
922*b1cdbd2cSJim Jagielski 	}
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 	UniString aTypeName = eTypeID <= CONTENT_TYPE_LAST ?
925*b1cdbd2cSJim Jagielski 		                      UniString::CreateFromAscii(aMap[eTypeID]) :
926*b1cdbd2cSJim Jagielski 		                      Registration::GetContentType(eTypeID);
927*b1cdbd2cSJim Jagielski 	if (aTypeName.Len() == 0)
928*b1cdbd2cSJim Jagielski 	{
929*b1cdbd2cSJim Jagielski 		DBG_ERROR("INetContentTypes::GetContentType(): Bad ID");
930*b1cdbd2cSJim Jagielski 		return
931*b1cdbd2cSJim Jagielski 			UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(
932*b1cdbd2cSJim Jagielski 				                           CONTENT_TYPE_STR_APP_OCTSTREAM));
933*b1cdbd2cSJim Jagielski 	}
934*b1cdbd2cSJim Jagielski 	return aTypeName;
935*b1cdbd2cSJim Jagielski }
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski //============================================================================
938*b1cdbd2cSJim Jagielski //static
GetPresentation(INetContentType eTypeID,const::com::sun::star::lang::Locale & aLocale)939*b1cdbd2cSJim Jagielski UniString INetContentTypes::GetPresentation(INetContentType eTypeID,
940*b1cdbd2cSJim Jagielski 											const ::com::sun::star::lang::Locale& aLocale)
941*b1cdbd2cSJim Jagielski {
942*b1cdbd2cSJim Jagielski 	sal_uInt16 nResID = sal_uInt16();
943*b1cdbd2cSJim Jagielski 	if (eTypeID <= CONTENT_TYPE_LAST)
944*b1cdbd2cSJim Jagielski 		nResID = aStaticResourceIDMap[eTypeID];
945*b1cdbd2cSJim Jagielski 	else
946*b1cdbd2cSJim Jagielski 	{
947*b1cdbd2cSJim Jagielski 		UniString aPresentation = Registration::GetPresentation(eTypeID);
948*b1cdbd2cSJim Jagielski 		if (aPresentation.Len() == 0)
949*b1cdbd2cSJim Jagielski 			nResID = STR_SVT_MIMETYPE_APP_OCTSTREAM;
950*b1cdbd2cSJim Jagielski 		else
951*b1cdbd2cSJim Jagielski 			return aPresentation;
952*b1cdbd2cSJim Jagielski 	}
953*b1cdbd2cSJim Jagielski 	return SvtSimpleResId(nResID, aLocale);
954*b1cdbd2cSJim Jagielski }
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski //============================================================================
957*b1cdbd2cSJim Jagielski //static
GetExtension(UniString const & rTypeName)958*b1cdbd2cSJim Jagielski UniString INetContentTypes::GetExtension(UniString const & rTypeName)
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski 	MediaTypeEntry const * pEntry = seekEntry(rTypeName, aStaticTypeNameMap,
961*b1cdbd2cSJim Jagielski 											  CONTENT_TYPE_LAST + 1);
962*b1cdbd2cSJim Jagielski 	if (pEntry)
963*b1cdbd2cSJim Jagielski 		return UniString::CreateFromAscii(pEntry->m_pExtension);
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 	UniString aExtension = Registration::GetExtension(rTypeName);
966*b1cdbd2cSJim Jagielski 	if (aExtension.Len() != 0)
967*b1cdbd2cSJim Jagielski 		return aExtension;
968*b1cdbd2cSJim Jagielski 	// special handling of text types, which come in uncounted variations:
969*b1cdbd2cSJim Jagielski 	return rTypeName.EqualsIgnoreCaseAscii("text", 0,
970*b1cdbd2cSJim Jagielski 										   RTL_CONSTASCII_LENGTH("text")) ?
971*b1cdbd2cSJim Jagielski 		       UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("txt")) :
972*b1cdbd2cSJim Jagielski 		       UniString::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("tmp"));
973*b1cdbd2cSJim Jagielski }
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski //============================================================================
976*b1cdbd2cSJim Jagielski //static
GetContentType4Extension(UniString const & rExtension)977*b1cdbd2cSJim Jagielski INetContentType INetContentTypes::GetContentType4Extension(UniString const &
978*b1cdbd2cSJim Jagielski 														       rExtension)
979*b1cdbd2cSJim Jagielski {
980*b1cdbd2cSJim Jagielski 	MediaTypeEntry const * pEntry = seekEntry(rExtension, aStaticExtensionMap,
981*b1cdbd2cSJim Jagielski 											  sizeof aStaticExtensionMap
982*b1cdbd2cSJim Jagielski 											      / sizeof (MediaTypeEntry));
983*b1cdbd2cSJim Jagielski 	if (pEntry)
984*b1cdbd2cSJim Jagielski 		return pEntry->m_eTypeID;
985*b1cdbd2cSJim Jagielski 	INetContentType eTypeID
986*b1cdbd2cSJim Jagielski 		= Registration::GetContentType4Extension(rExtension);
987*b1cdbd2cSJim Jagielski 	return eTypeID == CONTENT_TYPE_UNKNOWN ? CONTENT_TYPE_APP_OCTSTREAM :
988*b1cdbd2cSJim Jagielski 		                                     eTypeID;
989*b1cdbd2cSJim Jagielski }
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski //============================================================================
992*b1cdbd2cSJim Jagielski //static
GetContentTypeFromURL(UniString const & rURL)993*b1cdbd2cSJim Jagielski INetContentType INetContentTypes::GetContentTypeFromURL(UniString const &
994*b1cdbd2cSJim Jagielski 														    rURL)
995*b1cdbd2cSJim Jagielski {
996*b1cdbd2cSJim Jagielski 	INetContentType eTypeID = CONTENT_TYPE_UNKNOWN;
997*b1cdbd2cSJim Jagielski 	UniString aToken = rURL.GetToken(0, ':');
998*b1cdbd2cSJim Jagielski 	if (aToken.Len() != 0)
999*b1cdbd2cSJim Jagielski 	{
1000*b1cdbd2cSJim Jagielski 		if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_FILE))
1001*b1cdbd2cSJim Jagielski 			if (rURL.GetChar(rURL.Len() - 1) == '/') // folder
1002*b1cdbd2cSJim Jagielski 				if (rURL.Len() > RTL_CONSTASCII_LENGTH("file:///"))
1003*b1cdbd2cSJim Jagielski 					if (WildCard(UniString(RTL_CONSTASCII_USTRINGPARAM(
1004*b1cdbd2cSJim Jagielski 						                       "*/{*}/"))).
1005*b1cdbd2cSJim Jagielski 						    Matches(rURL)) // special folder
1006*b1cdbd2cSJim Jagielski 						eTypeID = CONTENT_TYPE_X_CNT_FSYSSPECIALFOLDER;
1007*b1cdbd2cSJim Jagielski 					else
1008*b1cdbd2cSJim Jagielski 						// drive? -> "file:///?|/"
1009*b1cdbd2cSJim Jagielski 						if (rURL.Len() == 11
1010*b1cdbd2cSJim Jagielski 							&& rURL.GetChar(rURL.Len() - 2) == '|')
1011*b1cdbd2cSJim Jagielski 						{
1012*b1cdbd2cSJim Jagielski 							// Drives need further processing, because of
1013*b1cdbd2cSJim Jagielski 							// dynamic type according to underlying volume,
1014*b1cdbd2cSJim Jagielski 							// which cannot be determined here.
1015*b1cdbd2cSJim Jagielski 						}
1016*b1cdbd2cSJim Jagielski 						else // normal folder
1017*b1cdbd2cSJim Jagielski 							eTypeID = CONTENT_TYPE_X_CNT_FSYSFOLDER;
1018*b1cdbd2cSJim Jagielski 				else // file system root
1019*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_X_CNT_FSYSBOX;
1020*b1cdbd2cSJim Jagielski 			else // file
1021*b1cdbd2cSJim Jagielski 			{
1022*b1cdbd2cSJim Jagielski 				//@@@
1023*b1cdbd2cSJim Jagielski 			}
1024*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_HTTP)
1025*b1cdbd2cSJim Jagielski 				 || aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_HTTPS))
1026*b1cdbd2cSJim Jagielski 			eTypeID = CONTENT_TYPE_TEXT_HTML;
1027*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_PRIVATE))
1028*b1cdbd2cSJim Jagielski 		{
1029*b1cdbd2cSJim Jagielski 			UniString aSecondPart = rURL.GetToken(1, ':');
1030*b1cdbd2cSJim Jagielski 			aToken = aSecondPart.GetToken(0, '/');
1031*b1cdbd2cSJim Jagielski 			if (aToken.EqualsAscii(INETTYPE_URL_SUB_FACTORY))
1032*b1cdbd2cSJim Jagielski 			{
1033*b1cdbd2cSJim Jagielski 				aToken = aSecondPart.GetToken(1, '/');
1034*b1cdbd2cSJim Jagielski 				if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SWRITER))
1035*b1cdbd2cSJim Jagielski 				{
1036*b1cdbd2cSJim Jagielski 					aToken = aSecondPart.GetToken(2, '/');
1037*b1cdbd2cSJim Jagielski 					eTypeID = aToken.EqualsAscii(INETTYPE_URL_SSSUB_WEB) ?
1038*b1cdbd2cSJim Jagielski 						          CONTENT_TYPE_APP_VND_WRITER_WEB :
1039*b1cdbd2cSJim Jagielski 						      aToken.EqualsAscii(INETTYPE_URL_SSSUB_GLOB) ?
1040*b1cdbd2cSJim Jagielski 						          CONTENT_TYPE_APP_VND_WRITER_GLOBAL :
1041*b1cdbd2cSJim Jagielski 						          CONTENT_TYPE_APP_VND_WRITER;
1042*b1cdbd2cSJim Jagielski 				}
1043*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SCALC))
1044*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_CALC;
1045*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SDRAW))
1046*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_DRAW;
1047*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SIMPRESS))
1048*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_IMPRESS;
1049*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SCHART))
1050*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_CHART;
1051*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SIMAGE))
1052*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_IMAGE;
1053*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SMATH))
1054*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_VND_MATH;
1055*b1cdbd2cSJim Jagielski 				else if (aToken.EqualsAscii(INETTYPE_URL_SSUB_FRAMESET))
1056*b1cdbd2cSJim Jagielski 					eTypeID = CONTENT_TYPE_APP_FRAMESET;
1057*b1cdbd2cSJim Jagielski 			}
1058*b1cdbd2cSJim Jagielski 			else if (aToken.EqualsAscii(INETTYPE_URL_SUB_HELPID))
1059*b1cdbd2cSJim Jagielski 				eTypeID = CONTENT_TYPE_APP_STARHELP;
1060*b1cdbd2cSJim Jagielski 		}
1061*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_COMPONENT))
1062*b1cdbd2cSJim Jagielski 		{
1063*b1cdbd2cSJim Jagielski 			aToken = rURL.GetToken(1, ':'); // aToken now equals ss / *
1064*b1cdbd2cSJim Jagielski 			aToken = aToken.GetToken(0, '/');
1065*b1cdbd2cSJim Jagielski   			if (aToken.EqualsAscii(INETTYPE_URL_SSUB_SS))
1066*b1cdbd2cSJim Jagielski   				eTypeID = rURL.SearchAscii(INETTYPE_URL_SCHED_CMB)
1067*b1cdbd2cSJim Jagielski 					          == STRING_NOTFOUND
1068*b1cdbd2cSJim Jagielski 					      && rURL.SearchAscii(INETTYPE_URL_SCHED_FORM)
1069*b1cdbd2cSJim Jagielski 					             == STRING_NOTFOUND ?
1070*b1cdbd2cSJim Jagielski 					          CONTENT_TYPE_APP_SCHEDULE :
1071*b1cdbd2cSJim Jagielski 				          rURL.SearchAscii(INETTYPE_URL_SCHED_TASK)
1072*b1cdbd2cSJim Jagielski 					              == STRING_NOTFOUND ?
1073*b1cdbd2cSJim Jagielski 					          CONTENT_TYPE_APP_SCHEDULE_EVT :
1074*b1cdbd2cSJim Jagielski 				              CONTENT_TYPE_APP_SCHEDULE_TASK;
1075*b1cdbd2cSJim Jagielski 		}
1076*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_MAILTO))
1077*b1cdbd2cSJim Jagielski 			eTypeID = CONTENT_TYPE_APP_VND_OUTTRAY;
1078*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_MACRO))
1079*b1cdbd2cSJim Jagielski 			eTypeID = CONTENT_TYPE_APP_MACRO;
1080*b1cdbd2cSJim Jagielski 		else if (aToken.EqualsIgnoreCaseAscii(INETTYPE_URL_PROT_DATA))
1081*b1cdbd2cSJim Jagielski 		{
1082*b1cdbd2cSJim Jagielski 			UniString aSecondPart = rURL.GetToken(1, ':');
1083*b1cdbd2cSJim Jagielski 			aToken = aSecondPart.GetToken(0, ',');
1084*b1cdbd2cSJim Jagielski 			eTypeID = GetContentType(aToken);
1085*b1cdbd2cSJim Jagielski 		}
1086*b1cdbd2cSJim Jagielski     }
1087*b1cdbd2cSJim Jagielski 	if (eTypeID == CONTENT_TYPE_UNKNOWN)
1088*b1cdbd2cSJim Jagielski 	{
1089*b1cdbd2cSJim Jagielski 		UniString aExtension;
1090*b1cdbd2cSJim Jagielski 		if (GetExtensionFromURL(rURL, aExtension))
1091*b1cdbd2cSJim Jagielski 			eTypeID = GetContentType4Extension(aExtension);
1092*b1cdbd2cSJim Jagielski 	}
1093*b1cdbd2cSJim Jagielski 	return eTypeID;
1094*b1cdbd2cSJim Jagielski }
1095*b1cdbd2cSJim Jagielski 
1096*b1cdbd2cSJim Jagielski //============================================================================
1097*b1cdbd2cSJim Jagielski //static
GetExtensionFromURL(UniString const & rURL,UniString & rExtension)1098*b1cdbd2cSJim Jagielski bool INetContentTypes::GetExtensionFromURL(UniString const & rURL,
1099*b1cdbd2cSJim Jagielski 										   UniString & rExtension)
1100*b1cdbd2cSJim Jagielski {
1101*b1cdbd2cSJim Jagielski 	xub_StrLen nSlashPos = 0;
1102*b1cdbd2cSJim Jagielski 	xub_StrLen i = 0;
1103*b1cdbd2cSJim Jagielski 	while (i != STRING_NOTFOUND)
1104*b1cdbd2cSJim Jagielski 	{
1105*b1cdbd2cSJim Jagielski 		nSlashPos = i;
1106*b1cdbd2cSJim Jagielski 		i = rURL.Search('/', i + 1);
1107*b1cdbd2cSJim Jagielski 	}
1108*b1cdbd2cSJim Jagielski 	if (nSlashPos != 0)
1109*b1cdbd2cSJim Jagielski 	{
1110*b1cdbd2cSJim Jagielski 		xub_StrLen nLastDotPos = i = rURL.Search('.', nSlashPos);
1111*b1cdbd2cSJim Jagielski 		while (i != STRING_NOTFOUND)
1112*b1cdbd2cSJim Jagielski 		{
1113*b1cdbd2cSJim Jagielski 			nLastDotPos = i;
1114*b1cdbd2cSJim Jagielski 			i = rURL.Search('.', i + 1);
1115*b1cdbd2cSJim Jagielski 		}
1116*b1cdbd2cSJim Jagielski 		if (nLastDotPos != STRING_NOTFOUND)
1117*b1cdbd2cSJim Jagielski 			rExtension = rURL.Copy(nLastDotPos + 1);
1118*b1cdbd2cSJim Jagielski 		return true;
1119*b1cdbd2cSJim Jagielski 	}
1120*b1cdbd2cSJim Jagielski 	return false;
1121*b1cdbd2cSJim Jagielski }
1122*b1cdbd2cSJim Jagielski 
1123*b1cdbd2cSJim Jagielski //============================================================================
1124*b1cdbd2cSJim Jagielski //static
MapStringToContentType(UniString const & rPresentation)1125*b1cdbd2cSJim Jagielski INetContentType INetContentTypes::MapStringToContentType(UniString const &
1126*b1cdbd2cSJim Jagielski 														     rPresentation)
1127*b1cdbd2cSJim Jagielski {
1128*b1cdbd2cSJim Jagielski 	MediaTypeEntry const * pEntry = seekEntry(rPresentation,
1129*b1cdbd2cSJim Jagielski 											  aStaticPresentationMap,
1130*b1cdbd2cSJim Jagielski 											  sizeof aStaticPresentationMap
1131*b1cdbd2cSJim Jagielski 											      / sizeof (MediaTypeEntry));
1132*b1cdbd2cSJim Jagielski 	return pEntry ? pEntry->m_eTypeID : CONTENT_TYPE_UNKNOWN;
1133*b1cdbd2cSJim Jagielski }
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski //============================================================================
1136*b1cdbd2cSJim Jagielski // static
parse(ByteString const & rMediaType,ByteString & rType,ByteString & rSubType,INetContentTypeParameterList * pParameters)1137*b1cdbd2cSJim Jagielski bool INetContentTypes::parse(ByteString const & rMediaType,
1138*b1cdbd2cSJim Jagielski 							 ByteString & rType, ByteString & rSubType,
1139*b1cdbd2cSJim Jagielski 							 INetContentTypeParameterList * pParameters)
1140*b1cdbd2cSJim Jagielski {
1141*b1cdbd2cSJim Jagielski 	sal_Char const * p = rMediaType.GetBuffer();
1142*b1cdbd2cSJim Jagielski 	sal_Char const * pEnd = p + rMediaType.Len();
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1145*b1cdbd2cSJim Jagielski 	sal_Char const * pToken = p;
1146*b1cdbd2cSJim Jagielski 	bool bDowncase = false;
1147*b1cdbd2cSJim Jagielski 	while (p != pEnd && INetMIME::isTokenChar(*p))
1148*b1cdbd2cSJim Jagielski 	{
1149*b1cdbd2cSJim Jagielski 		bDowncase = bDowncase || INetMIME::isUpperCase(*p);
1150*b1cdbd2cSJim Jagielski 		++p;
1151*b1cdbd2cSJim Jagielski 	}
1152*b1cdbd2cSJim Jagielski 	if (p == pToken)
1153*b1cdbd2cSJim Jagielski 		return false;
1154*b1cdbd2cSJim Jagielski 	rType = ByteString(pToken, sal::static_int_cast< xub_StrLen >(p - pToken));
1155*b1cdbd2cSJim Jagielski 	if (bDowncase)
1156*b1cdbd2cSJim Jagielski 		rType.ToLowerAscii();
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1159*b1cdbd2cSJim Jagielski 	if (p == pEnd || *p++ != '/')
1160*b1cdbd2cSJim Jagielski 		return false;
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1163*b1cdbd2cSJim Jagielski 	pToken = p;
1164*b1cdbd2cSJim Jagielski 	bDowncase = false;
1165*b1cdbd2cSJim Jagielski 	while (p != pEnd && INetMIME::isTokenChar(*p))
1166*b1cdbd2cSJim Jagielski 	{
1167*b1cdbd2cSJim Jagielski 		bDowncase = bDowncase || INetMIME::isUpperCase(*p);
1168*b1cdbd2cSJim Jagielski 		++p;
1169*b1cdbd2cSJim Jagielski 	}
1170*b1cdbd2cSJim Jagielski 	if (p == pToken)
1171*b1cdbd2cSJim Jagielski 		return false;
1172*b1cdbd2cSJim Jagielski 	rSubType = ByteString(
1173*b1cdbd2cSJim Jagielski         pToken, sal::static_int_cast< xub_StrLen >(p - pToken));
1174*b1cdbd2cSJim Jagielski 	if (bDowncase)
1175*b1cdbd2cSJim Jagielski 		rSubType.ToLowerAscii();
1176*b1cdbd2cSJim Jagielski 
1177*b1cdbd2cSJim Jagielski 	return INetMIME::scanParameters(p, pEnd, pParameters) == pEnd;
1178*b1cdbd2cSJim Jagielski }
1179*b1cdbd2cSJim Jagielski 
1180*b1cdbd2cSJim Jagielski //============================================================================
1181*b1cdbd2cSJim Jagielski // static
parse(UniString const & rMediaType,UniString & rType,UniString & rSubType,INetContentTypeParameterList * pParameters)1182*b1cdbd2cSJim Jagielski bool INetContentTypes::parse(UniString const & rMediaType,
1183*b1cdbd2cSJim Jagielski 							 UniString & rType, UniString & rSubType,
1184*b1cdbd2cSJim Jagielski 							 INetContentTypeParameterList * pParameters)
1185*b1cdbd2cSJim Jagielski {
1186*b1cdbd2cSJim Jagielski 	sal_Unicode const * p = rMediaType.GetBuffer();
1187*b1cdbd2cSJim Jagielski 	sal_Unicode const * pEnd = p + rMediaType.Len();
1188*b1cdbd2cSJim Jagielski 
1189*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1190*b1cdbd2cSJim Jagielski 	sal_Unicode const * pToken = p;
1191*b1cdbd2cSJim Jagielski 	bool bDowncase = false;
1192*b1cdbd2cSJim Jagielski 	while (p != pEnd && INetMIME::isTokenChar(*p))
1193*b1cdbd2cSJim Jagielski 	{
1194*b1cdbd2cSJim Jagielski 		bDowncase = bDowncase || INetMIME::isUpperCase(*p);
1195*b1cdbd2cSJim Jagielski 		++p;
1196*b1cdbd2cSJim Jagielski 	}
1197*b1cdbd2cSJim Jagielski 	if (p == pToken)
1198*b1cdbd2cSJim Jagielski 		return false;
1199*b1cdbd2cSJim Jagielski 	rType = UniString(pToken, sal::static_int_cast< xub_StrLen >(p - pToken));
1200*b1cdbd2cSJim Jagielski 	if (bDowncase)
1201*b1cdbd2cSJim Jagielski 		rType.ToLowerAscii();
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1204*b1cdbd2cSJim Jagielski 	if (p == pEnd || *p++ != '/')
1205*b1cdbd2cSJim Jagielski 		return false;
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 	p = INetMIME::skipLinearWhiteSpaceComment(p, pEnd);
1208*b1cdbd2cSJim Jagielski 	pToken = p;
1209*b1cdbd2cSJim Jagielski 	bDowncase = false;
1210*b1cdbd2cSJim Jagielski 	while (p != pEnd && INetMIME::isTokenChar(*p))
1211*b1cdbd2cSJim Jagielski 	{
1212*b1cdbd2cSJim Jagielski 		bDowncase = bDowncase || INetMIME::isUpperCase(*p);
1213*b1cdbd2cSJim Jagielski 		++p;
1214*b1cdbd2cSJim Jagielski 	}
1215*b1cdbd2cSJim Jagielski 	if (p == pToken)
1216*b1cdbd2cSJim Jagielski 		return false;
1217*b1cdbd2cSJim Jagielski 	rSubType = UniString(
1218*b1cdbd2cSJim Jagielski         pToken, sal::static_int_cast< xub_StrLen >(p - pToken));
1219*b1cdbd2cSJim Jagielski 	if (bDowncase)
1220*b1cdbd2cSJim Jagielski 		rSubType.ToLowerAscii();
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski 	return INetMIME::scanParameters(p, pEnd, pParameters) == pEnd;
1223*b1cdbd2cSJim Jagielski }
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski //============================================================================
1226*b1cdbd2cSJim Jagielski // static
appendUSASCIIParameter(ByteString const & rMediaType,ByteString const & rAttribute,ByteString const & rValue)1227*b1cdbd2cSJim Jagielski ByteString INetContentTypes::appendUSASCIIParameter(ByteString const &
1228*b1cdbd2cSJim Jagielski 													    rMediaType,
1229*b1cdbd2cSJim Jagielski 													ByteString const &
1230*b1cdbd2cSJim Jagielski 													    rAttribute,
1231*b1cdbd2cSJim Jagielski 													ByteString const & rValue)
1232*b1cdbd2cSJim Jagielski {
1233*b1cdbd2cSJim Jagielski 	ByteString aResult = rMediaType;
1234*b1cdbd2cSJim Jagielski 	aResult.Append(RTL_CONSTASCII_STRINGPARAM("; "));
1235*b1cdbd2cSJim Jagielski 	aResult += rAttribute;
1236*b1cdbd2cSJim Jagielski 	aResult += '=';
1237*b1cdbd2cSJim Jagielski 	bool bQuote = false;
1238*b1cdbd2cSJim Jagielski 	for (xub_StrLen i = 0; i < rValue.Len(); ++i)
1239*b1cdbd2cSJim Jagielski 	{
1240*b1cdbd2cSJim Jagielski 		// When the value contains any ' characters, use a quoted string
1241*b1cdbd2cSJim Jagielski 		// instead of a token, in order to avoid confusion with RFC 2231
1242*b1cdbd2cSJim Jagielski 		// extensions:
1243*b1cdbd2cSJim Jagielski 		sal_uInt32 nChar = sal_uChar(rValue.GetChar(i));
1244*b1cdbd2cSJim Jagielski 		DBG_ASSERT(INetMIME::isUSASCII(nChar),
1245*b1cdbd2cSJim Jagielski 				   "INetContentTypes::appendUSASCIIParameter(): Bad value");
1246*b1cdbd2cSJim Jagielski 		if (!INetMIME::isTokenChar(nChar) || nChar == '\'')
1247*b1cdbd2cSJim Jagielski 		{
1248*b1cdbd2cSJim Jagielski 			bQuote = true;
1249*b1cdbd2cSJim Jagielski 			break;
1250*b1cdbd2cSJim Jagielski 		}
1251*b1cdbd2cSJim Jagielski 	}
1252*b1cdbd2cSJim Jagielski 	if (bQuote)
1253*b1cdbd2cSJim Jagielski 	{
1254*b1cdbd2cSJim Jagielski 		aResult += '"';
1255*b1cdbd2cSJim Jagielski 		for (xub_StrLen i = 0; i < rValue.Len(); ++i)
1256*b1cdbd2cSJim Jagielski 		{
1257*b1cdbd2cSJim Jagielski 			// Escape LF as well as CR to avoid confusion with line folding:
1258*b1cdbd2cSJim Jagielski 			sal_uInt32 nChar = sal_uChar(rValue.GetChar(i));
1259*b1cdbd2cSJim Jagielski 			DBG_ASSERT(INetMIME::isUSASCII(nChar),
1260*b1cdbd2cSJim Jagielski 					   "INetContentTypes::appendUSASCIIParameter():"
1261*b1cdbd2cSJim Jagielski 					       " Bad value");
1262*b1cdbd2cSJim Jagielski 			switch (nChar)
1263*b1cdbd2cSJim Jagielski 			{
1264*b1cdbd2cSJim Jagielski 				case 0x0A: // LF
1265*b1cdbd2cSJim Jagielski 				case 0x0D: // CR
1266*b1cdbd2cSJim Jagielski 				case '"':
1267*b1cdbd2cSJim Jagielski 				case '\\':
1268*b1cdbd2cSJim Jagielski 					aResult += '\\';
1269*b1cdbd2cSJim Jagielski 				default:
1270*b1cdbd2cSJim Jagielski 					aResult += static_cast< char >(nChar);
1271*b1cdbd2cSJim Jagielski 					break;
1272*b1cdbd2cSJim Jagielski 			}
1273*b1cdbd2cSJim Jagielski 		}
1274*b1cdbd2cSJim Jagielski 		aResult += '"';
1275*b1cdbd2cSJim Jagielski 	}
1276*b1cdbd2cSJim Jagielski 	else
1277*b1cdbd2cSJim Jagielski 		aResult += rValue;
1278*b1cdbd2cSJim Jagielski 	return aResult;
1279*b1cdbd2cSJim Jagielski }
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski //============================================================================
1282*b1cdbd2cSJim Jagielski // static
appendUSASCIIParameter(UniString const & rMediaType,UniString const & rAttribute,UniString const & rValue)1283*b1cdbd2cSJim Jagielski UniString INetContentTypes::appendUSASCIIParameter(UniString const &
1284*b1cdbd2cSJim Jagielski 												       rMediaType,
1285*b1cdbd2cSJim Jagielski 												   UniString const &
1286*b1cdbd2cSJim Jagielski 												       rAttribute,
1287*b1cdbd2cSJim Jagielski 												   UniString const & rValue)
1288*b1cdbd2cSJim Jagielski {
1289*b1cdbd2cSJim Jagielski 	UniString aResult = rMediaType;
1290*b1cdbd2cSJim Jagielski 	aResult.AppendAscii(RTL_CONSTASCII_STRINGPARAM("; "));
1291*b1cdbd2cSJim Jagielski 	aResult += rAttribute;
1292*b1cdbd2cSJim Jagielski 	aResult += '=';
1293*b1cdbd2cSJim Jagielski 	bool bQuote = false;
1294*b1cdbd2cSJim Jagielski 	for (xub_StrLen i = 0; i < rValue.Len(); ++i)
1295*b1cdbd2cSJim Jagielski 	{
1296*b1cdbd2cSJim Jagielski 		// When the value contains any ' characters, use a quoted string
1297*b1cdbd2cSJim Jagielski 		// instead of a token, in order to avoid confusion with RFC 2231
1298*b1cdbd2cSJim Jagielski 		// extensions:
1299*b1cdbd2cSJim Jagielski 		sal_uInt32 nChar = rValue.GetChar(i);
1300*b1cdbd2cSJim Jagielski 		DBG_ASSERT(INetMIME::isUSASCII(nChar),
1301*b1cdbd2cSJim Jagielski 				   "INetContentTypes::appendUSASCIIParameter(): Bad value");
1302*b1cdbd2cSJim Jagielski 		if (!INetMIME::isTokenChar(nChar) || nChar == '\'')
1303*b1cdbd2cSJim Jagielski 		{
1304*b1cdbd2cSJim Jagielski 			bQuote = true;
1305*b1cdbd2cSJim Jagielski 			break;
1306*b1cdbd2cSJim Jagielski 		}
1307*b1cdbd2cSJim Jagielski 	}
1308*b1cdbd2cSJim Jagielski 	if (bQuote)
1309*b1cdbd2cSJim Jagielski 	{
1310*b1cdbd2cSJim Jagielski 		aResult += '"';
1311*b1cdbd2cSJim Jagielski 		for (xub_StrLen i = 0; i < rValue.Len(); ++i)
1312*b1cdbd2cSJim Jagielski 		{
1313*b1cdbd2cSJim Jagielski 			// Escape LF as well as CR to avoid confusion with line folding:
1314*b1cdbd2cSJim Jagielski 			sal_uInt32 nChar = rValue.GetChar(i);
1315*b1cdbd2cSJim Jagielski 			DBG_ASSERT(INetMIME::isUSASCII(nChar),
1316*b1cdbd2cSJim Jagielski 					   "INetContentTypes::appendUSASCIIParameter():"
1317*b1cdbd2cSJim Jagielski 					       " Bad value");
1318*b1cdbd2cSJim Jagielski 			switch (nChar)
1319*b1cdbd2cSJim Jagielski 			{
1320*b1cdbd2cSJim Jagielski 				case 0x0A: // LF
1321*b1cdbd2cSJim Jagielski 				case 0x0D: // CR
1322*b1cdbd2cSJim Jagielski 				case '"':
1323*b1cdbd2cSJim Jagielski 				case '\\':
1324*b1cdbd2cSJim Jagielski 					aResult += '\\';
1325*b1cdbd2cSJim Jagielski 				default:
1326*b1cdbd2cSJim Jagielski 					aResult += sal_Unicode(nChar);
1327*b1cdbd2cSJim Jagielski 					break;
1328*b1cdbd2cSJim Jagielski 			}
1329*b1cdbd2cSJim Jagielski 		}
1330*b1cdbd2cSJim Jagielski 		aResult += '"';
1331*b1cdbd2cSJim Jagielski 	}
1332*b1cdbd2cSJim Jagielski 	else
1333*b1cdbd2cSJim Jagielski 		aResult += rValue;
1334*b1cdbd2cSJim Jagielski 	return aResult;
1335*b1cdbd2cSJim Jagielski }
1336*b1cdbd2cSJim Jagielski 
1337