LCOV - code coverage report
Current view: top level - svl/source/misc - inettype.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 24 245 9.8 %
Date: 2012-08-25 Functions: 1 23 4.3 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 24 446 5.4 %

           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: */

Generated by: LCOV version 1.10