xref: /core/svtools/source/misc/imagemgr.cxx (revision 60eaa424)
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 <svtools/imagemgr.hxx>
21 #include <tools/diagnose_ex.h>
22 #include <tools/urlobj.hxx>
23 #include <tools/debug.hxx>
24 #include <vcl/image.hxx>
25 #include <sot/storage.hxx>
26 #include <comphelper/classids.hxx>
27 #include <unotools/ucbhelper.hxx>
28 #include <comphelper/processfactory.hxx>
29 #include <com/sun/star/beans/PropertyValue.hpp>
30 #include <com/sun/star/container/XNameAccess.hpp>
31 #include <com/sun/star/document/XTypeDetection.hpp>
32 #include <com/sun/star/ucb/CommandAbortedException.hpp>
33 #include <com/sun/star/ucb/ContentCreationException.hpp>
34 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
35 #include <com/sun/star/uno/XComponentContext.hpp>
36 #include <ucbhelper/content.hxx>
37 #include <svtools/strings.hrc>
38 #include <svtools/svtresid.hxx>
39 #include <bitmaps.hlst>
40 #include <strings.hxx>
41 
42 // globals *******************************************************************
43 
44 #define NO_INDEX        (-1)
45 #define CONTENT_HELPER  ::utl::UCBContentHelper
46 
47 namespace {
48 
49 struct SvtExtensionResIdMapping_Impl
50 {
51     const char* _pExt;
52     bool        _bExt;
53     TranslateId  pStrId;
54     SvImageId   _nImgId;
55 };
56 
57 }
58 
59 SvtExtensionResIdMapping_Impl const ExtensionMap_Impl[] =
60 {
61     { "awk",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
62     { "bas",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
63     { "bat",   true,  STR_DESCRIPTION_BATCHFILE,             SvImageId::NONE },
64     { "bmk",   false, STR_DESCRIPTION_BOOKMARKFILE,          SvImageId::NONE },
65     { "bmp",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::Bitmap },
66     { "c",     true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
67     { "cfg",   false, STR_DESCRIPTION_CFGFILE,               SvImageId::NONE },
68     { "cmd",   true,  STR_DESCRIPTION_BATCHFILE,             SvImageId::NONE },
69     { "cob",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
70     { "com",   true,  STR_DESCRIPTION_APPLICATION,           SvImageId::NONE },
71     { "cxx",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
72     { "dbf",   true,  STR_DESCRIPTION_DATABASE_TABLE,        SvImageId::Table },
73     { "def",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
74     { "dll",   true,  STR_DESCRIPTION_SYSFILE,               SvImageId::NONE },
75     { "doc",   false, STR_DESCRIPTION_WORD_DOC,              SvImageId::Writer },
76     { "dot",   false, STR_DESCRIPTION_WORD_DOC,              SvImageId::WriterTemplate },
77     { "docx",  false, STR_DESCRIPTION_WORD_DOC,              SvImageId::Writer },
78     { "dxf",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::DXF },
79     { "exe",   true,  STR_DESCRIPTION_APPLICATION,           SvImageId::NONE },
80     { "gif",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::GIF },
81     { "h",     true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
82     { "hlp",   false, STR_DESCRIPTION_HELP_DOC,              SvImageId::NONE },
83     { "hrc",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
84     { "htm",   false, STR_DESCRIPTION_HTMLFILE,              SvImageId::HTML },
85     { "html",  false, STR_DESCRIPTION_HTMLFILE,              SvImageId::HTML },
86     { "asp",   false, STR_DESCRIPTION_HTMLFILE,              SvImageId::HTML },
87     { "hxx",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
88     { "ini",   false, STR_DESCRIPTION_CFGFILE,               SvImageId::NONE },
89     { "java",  true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
90     { "jpeg",  true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::JPG },
91     { "jpg",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::JPG },
92     { "lha",   true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
93 #ifdef _WIN32
94     { "lnk",   false, {},                                    SvImageId::NONE },
95 #endif
96     { "log",   true,  STR_DESCRIPTION_LOGFILE,               SvImageId::NONE },
97     { "lst",   true,  STR_DESCRIPTION_LOGFILE,               SvImageId::NONE },
98     { "met",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::MET },
99     { "mml",   false, STR_DESCRIPTION_MATHML_DOC,            SvImageId::Math },
100     { "mod",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
101     { "odb",   false, STR_DESCRIPTION_OO_DATABASE_DOC,       SvImageId::OO_DatabaseDoc },
102     { "odg",   false, STR_DESCRIPTION_OO_DRAW_DOC,           SvImageId::OO_DrawDoc },
103     { "odf",   false, STR_DESCRIPTION_OO_MATH_DOC,           SvImageId::OO_MathDoc },
104     { "odm",   false, STR_DESCRIPTION_OO_GLOBAL_DOC,         SvImageId::OO_GlobalDoc },
105     { "odp",   false, STR_DESCRIPTION_OO_IMPRESS_DOC,        SvImageId::OO_ImpressDoc },
106     { "ods",   false, STR_DESCRIPTION_OO_CALC_DOC,           SvImageId::OO_CalcDoc },
107     { "odt",   false, STR_DESCRIPTION_OO_WRITER_DOC,         SvImageId::OO_WriterDoc },
108     { "otg",   false, STR_DESCRIPTION_OO_DRAW_TEMPLATE,      SvImageId::OO_DrawTemplate },
109     { "otp",   false, STR_DESCRIPTION_OO_IMPRESS_TEMPLATE,   SvImageId::OO_ImpressTemplate },
110     { "ots",   false, STR_DESCRIPTION_OO_CALC_TEMPLATE,      SvImageId::OO_CalcTemplate },
111     { "ott",   false, STR_DESCRIPTION_OO_WRITER_TEMPLATE,    SvImageId::OO_WriterTemplate },
112     { "pas",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
113     { "pcd",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::PCD },
114     { "pct",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::PCT },
115     { "pict",  true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::PCT },
116     { "pcx",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::PCX },
117     { "pl",    true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
118     { "png",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::PNG },
119     { "rar",   true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
120     { "rtf",   false, STR_DESCRIPTION_WORD_DOC,              SvImageId::Writer },
121     { "sbl",   false, {},                                    SvImageId::NONE },
122     { "sch",   false, {},                                    SvImageId::NONE },
123     { "sda",   false, { nullptr, STR_DESCRIPTION_SDRAW_DOC}, SvImageId::Draw },
124     { "sdb",   false, STR_DESCRIPTION_SDATABASE_DOC,         SvImageId::Database },
125     { "sdc",   false, { nullptr, STR_DESCRIPTION_SCALC_DOC}, SvImageId::Calc },
126     { "sdd",   false, { nullptr, STR_DESCRIPTION_SIMPRESS_DOC},          SvImageId::Impress },
127     { "sdp",   false, { nullptr, STR_DESCRIPTION_SIMPRESS_DOC},          SvImageId::NONE },
128     { "sds",   false, { nullptr, STR_DESCRIPTION_SCHART_DOC},            SvImageId::NONE },
129     { "sdw",   false, { nullptr, STR_DESCRIPTION_SWRITER_DOC},           SvImageId::Writer },
130     { "sga",   false, {},                                    SvImageId::NONE },
131     { "sgl",   false, STR_DESCRIPTION_GLOBALDOC,             SvImageId::GlobalDoc },
132     { "shtml", false, STR_DESCRIPTION_HTMLFILE,              SvImageId::HTML },
133     { "sim",   false, STR_DESCRIPTION_SIMAGE_DOC,            SvImageId::SIM },
134     { "smf",   false, { nullptr, STR_DESCRIPTION_SMATH_DOC},             SvImageId::Math },
135     { "src",   true,  STR_DESCRIPTION_SOURCEFILE,            SvImageId::NONE },
136     { "svh",   false, STR_DESCRIPTION_HELP_DOC,              SvImageId::NONE },
137     { "svm",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::SVM },
138     { "stc",   false, STR_DESCRIPTION_CALC_TEMPLATE,         SvImageId::CalcTemplate },
139     { "std",   false, STR_DESCRIPTION_DRAW_TEMPLATE,         SvImageId::DrawTemplate },
140     { "sti",   false, STR_DESCRIPTION_IMPRESS_TEMPLATE,      SvImageId::ImpressTemplate },
141     { "stw",   false, STR_DESCRIPTION_WRITER_TEMPLATE,       SvImageId::WriterTemplate },
142     { "sxc",   false, STR_DESCRIPTION_SXCALC_DOC,            SvImageId::Calc },
143     { "sxd",   false, STR_DESCRIPTION_SXDRAW_DOC,            SvImageId::Draw },
144     { "sxg",   false, STR_DESCRIPTION_SXGLOBAL_DOC,          SvImageId::GlobalDoc },
145     { "sxi",   false, STR_DESCRIPTION_SXIMPRESS_DOC,         SvImageId::Impress },
146     { "sxm",   false, STR_DESCRIPTION_SXMATH_DOC,            SvImageId::Math },
147     { "sxs",   false, STR_DESCRIPTION_SXCHART_DOC,           SvImageId::NONE },
148     { "sxw",   false, STR_DESCRIPTION_SXWRITER_DOC,          SvImageId::Writer },
149     { "sys",   true,  STR_DESCRIPTION_SYSFILE,               SvImageId::NONE },
150     { "tif",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::TIFF },
151     { "tiff",  true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::TIFF },
152     { "txt",   false, STR_DESCRIPTION_TEXTFILE,              SvImageId::TextFile },
153     { "url",   false, STR_DESCRIPTION_LINK,                  SvImageId::NONE },
154     { "vor",   false, STR_DESCRIPTION_SOFFICE_TEMPLATE_DOC,  SvImageId::WriterTemplate },
155     { "vxd",   true,  STR_DESCRIPTION_SYSFILE,               SvImageId::NONE },
156     { "webp",  true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::WEBP },
157     { "wmf",   true,  STR_DESCRIPTION_GRAPHIC_DOC,           SvImageId::WMF },
158     { "xls",   false, STR_DESCRIPTION_EXCEL_DOC,             SvImageId::Calc },
159     { "xlt",   false, STR_DESCRIPTION_EXCEL_TEMPLATE_DOC,    SvImageId::CalcTemplate },
160     { "xlsx",  false, STR_DESCRIPTION_EXCEL_DOC,             SvImageId::Calc },
161     { "uu",    true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
162     { "uue",   true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
163     { "z",     true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
164     { "zip",   true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
165     { "zoo",   true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
166     { "gz",    true,  STR_DESCRIPTION_ARCHIVFILE,            SvImageId::NONE },
167     { "ppt",   false, STR_DESCRIPTION_POWERPOINT,            SvImageId::Impress },
168     { "pot",   false, STR_DESCRIPTION_POWERPOINT_TEMPLATE,   SvImageId::ImpressTemplate },
169     { "pps",   false, STR_DESCRIPTION_POWERPOINT_SHOW,       SvImageId::Impress },
170     { "pptx",  false, STR_DESCRIPTION_POWERPOINT,            SvImageId::Impress },
171     { "oxt",   false, STR_DESCRIPTION_EXTENSION,             SvImageId::Extension },
172     { nullptr, false, {}, SvImageId::NONE }
173 };
174 
175 namespace {
176 
177 struct SvtFactory2ExtensionMapping_Impl
178 {
179     const char*   _pFactory;
180     const char*   _pExtension;
181 };
182 
183 }
184 
185 // mapping from "private:factory" url to extension
186 
187 SvtFactory2ExtensionMapping_Impl const Fac2ExtMap_Impl[] =
188 {
189     { "swriter",                "odt" },
190     { "swriter/web",            "html" },
191     { "swriter/GlobalDocument", "odm" },
192     { "scalc",                  "ods" },
193     { "simpress",               "odp" },
194     { "sdraw",                  "odg" },
195     { "smath",                  "odf" },
196     { "sdatabase",              "odb" },
197     { nullptr, nullptr }
198 };
199 
200 
201 static OUString GetImageExtensionByFactory_Impl( const OUString& rURL )
202 {
203     INetURLObject aObj( rURL );
204     OUString aPath = aObj.GetURLPath( INetURLObject::DecodeMechanism::NONE );
205     OUString aExtension;
206 
207     if ( !aPath.isEmpty() )
208     {
209         sal_uInt16 nIndex = 0;
210         while ( Fac2ExtMap_Impl[ nIndex ]._pFactory )
211         {
212             if ( aPath.equalsAscii( Fac2ExtMap_Impl[ nIndex ]._pFactory ) )
213             {
214                 // extension found
215                 aExtension = OUString::createFromAscii(Fac2ExtMap_Impl[ nIndex ]._pExtension);
216                 // and return it
217                 return aExtension;
218             }
219             ++nIndex;
220         }
221     }
222 
223     // no extension found, so use the type detection (performance brake)
224 
225     try
226     {
227         // get the TypeDetection service to access all registered types
228         css::uno::Reference < css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
229         css::uno::Reference < css::document::XTypeDetection > xTypeDetector(
230             xContext->getServiceManager()->createInstanceWithContext("com.sun.star.document.TypeDetection", xContext),
231             css::uno::UNO_QUERY );
232 
233         OUString aInternalType = xTypeDetector->queryTypeByURL( rURL );
234         css::uno::Reference < css::container::XNameAccess > xAccess( xTypeDetector, css::uno::UNO_QUERY );
235         css::uno::Sequence < css::beans::PropertyValue > aTypeProps;
236         if ( !aInternalType.isEmpty() && xAccess->hasByName( aInternalType ) )
237         {
238             xAccess->getByName( aInternalType ) >>= aTypeProps;
239             for ( const css::beans::PropertyValue& rProp : std::as_const(aTypeProps) )
240             {
241                 if (rProp.Name == "Extensions")
242                 {
243                     css::uno::Sequence < OUString > aExtensions;
244                     if ( ( rProp.Value >>= aExtensions ) && aExtensions.hasElements() )
245                     {
246                         const OUString* pExtensions = aExtensions.getConstArray();
247                         aExtension = pExtensions[0];
248                         break;
249                     }
250                 }
251             }
252         }
253     }
254     catch( const css::uno::RuntimeException& )
255     {
256         throw; // don't hide it!
257     }
258     catch( const css::uno::Exception& )
259     {
260         // type detection failed -> no extension
261     }
262 
263     return aExtension;
264 }
265 
266 static sal_Int32 GetIndexOfExtension_Impl( const OUString& rExtension )
267 {
268     sal_Int32 nRet = NO_INDEX;
269     if ( !rExtension.isEmpty() )
270     {
271         sal_Int32 nIndex = 0;
272         OUString aExt = rExtension.toAsciiLowerCase();
273         while ( ExtensionMap_Impl[ nIndex ]._pExt )
274         {
275             if ( aExt.equalsAscii( ExtensionMap_Impl[ nIndex ]._pExt ) )
276             {
277                 nRet = nIndex;
278                 break;
279             }
280             ++nIndex;
281         }
282     }
283 
284     return nRet;
285 }
286 
287 static SvImageId GetImageId_Impl( const OUString& rExtension )
288 {
289     SvImageId nImage = SvImageId::File;
290     sal_Int32  nIndex = GetIndexOfExtension_Impl( rExtension );
291     if ( nIndex != NO_INDEX )
292     {
293         nImage = ExtensionMap_Impl[ nIndex ]._nImgId;
294         if ( nImage == SvImageId::NONE )
295             nImage = SvImageId::File;
296     }
297 
298     return nImage;
299 }
300 
301 static bool GetVolumeProperties_Impl( ::ucbhelper::Content& rContent, svtools::VolumeInfo& rVolumeInfo )
302 {
303     bool bRet = false;
304 
305     try
306     {
307         bRet = ( ( rContent.getPropertyValue( "IsVolume" ) >>= rVolumeInfo.m_bIsVolume ) &&
308                  ( rContent.getPropertyValue( "IsRemote" ) >>= rVolumeInfo.m_bIsRemote ) &&
309                  ( rContent.getPropertyValue( "IsRemoveable" ) >>= rVolumeInfo.m_bIsRemoveable ) &&
310                  ( rContent.getPropertyValue( "IsFloppy" ) >>= rVolumeInfo.m_bIsFloppy ) &&
311                  ( rContent.getPropertyValue( "IsCompactDisc" ) >>= rVolumeInfo.m_bIsCompactDisc ) );
312     }
313     catch( const css::uno::RuntimeException& )
314     {
315         throw; // don't hide it!
316     }
317     catch( const css::uno::Exception& )
318     {
319         // type detection failed -> no extension
320     }
321 
322     return bRet;
323 }
324 
325 static SvImageId GetFolderImageId_Impl( const OUString& rURL )
326 {
327     SvImageId nRet = SvImageId::Folder;
328     try
329     {
330         ::svtools::VolumeInfo aVolumeInfo;
331         ::ucbhelper::Content aCnt( rURL, css::uno::Reference< css::ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
332         if ( GetVolumeProperties_Impl( aCnt, aVolumeInfo ) )
333         {
334             if ( aVolumeInfo.m_bIsRemote )
335                 nRet = SvImageId::NetworkDevice;
336             else if ( aVolumeInfo.m_bIsCompactDisc )
337                 nRet = SvImageId::CDRomDevice;
338             else if ( aVolumeInfo.m_bIsRemoveable )
339                 nRet = SvImageId::RemoveableDevice;
340             else if ( aVolumeInfo.m_bIsVolume )
341                 nRet = SvImageId::FixedDevice;
342         }
343     }
344     catch( const css::uno::RuntimeException& )
345     {
346         throw; // don't hide it!
347     }
348     catch( const css::uno::Exception& )
349     {
350 
351     }
352     return nRet;
353 }
354 
355 static bool isFolder(
356     OUString const & url, css::uno::Reference<css::ucb::XCommandEnvironment> const & env)
357 {
358     try {
359         return ucbhelper::Content(url, env, comphelper::getProcessComponentContext()).isFolder();
360     } catch (css::uno::RuntimeException &) {
361         throw;
362     } catch (css::ucb::CommandAbortedException &) {
363         assert(false); // this cannot happen
364         throw;
365     } catch (css::uno::Exception &) {
366         TOOLS_INFO_EXCEPTION("svtools.misc", "isFolder(" << url << ")");
367         return false;
368     }
369 }
370 
371 static SvImageId GetImageId_Impl(
372     const INetURLObject& rObject, bool bDetectFolder,
373     css::uno::Reference<css::ucb::XCommandEnvironment> const & env )
374 {
375     OUString aExt, sURL = rObject.GetMainURL( INetURLObject::DecodeMechanism::NONE );
376     SvImageId nImage = SvImageId::File;
377 
378     if ( rObject.GetProtocol() == INetProtocol::PrivSoffice )
379     {
380         OUString aURLPath = sURL.copy( strlen(URL_PREFIX_PRIV_SOFFICE) );
381         OUString aType = aURLPath.getToken( 0, '/' );
382         if ( aType == "factory" )
383         {
384             // detect an image id for our "private:factory" urls
385             aExt = GetImageExtensionByFactory_Impl( sURL );
386             if ( !aExt.isEmpty() )
387                 nImage = GetImageId_Impl( aExt );
388             return nImage;
389         }
390         else if ( aType == "image" )
391             nImage = static_cast<SvImageId>(aURLPath.getToken( 1, '/' ).toInt32());
392     }
393     else
394     {
395         aExt = rObject.getExtension();
396         if ( aExt == "vor" )
397         {
398             SvImageId nId = SvImageId::WriterTemplate;
399             try
400             {
401                 tools::SvRef<SotStorage> aStorage = new SotStorage( sURL, StreamMode::STD_READ );
402                 if ( !aStorage->GetError() )
403                 {
404                     SvGlobalName aGlobalName = aStorage->GetClassName();
405                     if ( aGlobalName == SvGlobalName(SO3_SC_CLASSID_50) || aGlobalName == SvGlobalName(SO3_SC_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SC_CLASSID_30) )
406                         nId = SvImageId::CalcTemplate;
407                     else if ( aGlobalName == SvGlobalName(SO3_SDRAW_CLASSID_50) )
408                         nId = SvImageId::DrawTemplate;
409                     else if ( aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_50) ||
410                             aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_30) )
411                         nId = SvImageId::ImpressTemplate;
412                     else if ( aGlobalName == SvGlobalName(SO3_SM_CLASSID_50) || aGlobalName == SvGlobalName(SO3_SM_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SM_CLASSID_30) )
413                         nId = SvImageId::MathTemplate;
414                 }
415             }
416             catch (const css::ucb::ContentCreationException&)
417             {
418                 TOOLS_WARN_EXCEPTION("svtools.misc", "GetImageId_Impl");
419             }
420 
421             return nId;
422         }
423     }
424 
425     if ( nImage == SvImageId::File && !sURL.isEmpty() )
426     {
427         if ( bDetectFolder && isFolder( sURL, env ) )
428             nImage = GetFolderImageId_Impl( sURL );
429         else if ( !aExt.isEmpty() )
430             nImage = GetImageId_Impl( aExt );
431     }
432     return nImage;
433 }
434 
435 static TranslateId GetDescriptionId_Impl( const OUString& rExtension, bool& rbShowExt )
436 {
437     TranslateId pId;
438     sal_Int32  nIndex = GetIndexOfExtension_Impl( rExtension );
439     if ( nIndex != NO_INDEX )
440     {
441         pId = ExtensionMap_Impl[ nIndex ].pStrId;
442         rbShowExt = ExtensionMap_Impl[ nIndex ]._bExt;
443     }
444 
445     return pId;
446 }
447 
448 static OUString GetDescriptionByFactory_Impl( const OUString& rFactory )
449 {
450     TranslateId pResId;
451     if ( rFactory.startsWithIgnoreAsciiCase( "swriter" ) )
452         pResId = STR_DESCRIPTION_FACTORY_WRITER;
453     else if ( rFactory.startsWithIgnoreAsciiCase( "scalc" ) )
454         pResId = STR_DESCRIPTION_FACTORY_CALC;
455     else if ( rFactory.startsWithIgnoreAsciiCase( "simpress" ) )
456         pResId = STR_DESCRIPTION_FACTORY_IMPRESS;
457     else if ( rFactory.startsWithIgnoreAsciiCase( "sdraw" ) )
458         pResId = STR_DESCRIPTION_FACTORY_DRAW;
459     else if ( rFactory.startsWithIgnoreAsciiCase( "swriter/web" ) )
460         pResId = STR_DESCRIPTION_FACTORY_WRITERWEB;
461     else if ( rFactory.startsWithIgnoreAsciiCase( "swriter/globaldocument" ) )
462         pResId = STR_DESCRIPTION_FACTORY_GLOBALDOC;
463     else if ( rFactory.startsWithIgnoreAsciiCase( "smath" ) )
464         pResId = STR_DESCRIPTION_FACTORY_MATH;
465     else if ( rFactory.startsWithIgnoreAsciiCase( "sdatabase" ) )
466         pResId = STR_DESCRIPTION_FACTORY_DATABASE;
467 
468     if (pResId)
469     {
470         return SvtResId(pResId);
471     }
472     return OUString();
473 }
474 
475 static TranslateId GetFolderDescriptionId_Impl( const OUString& rURL )
476 {
477     TranslateId pRet = STR_DESCRIPTION_FOLDER;
478     try
479     {
480         ::ucbhelper::Content aCnt( rURL, css::uno::Reference< css::ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
481         svtools::VolumeInfo aVolumeInfo;
482         if ( GetVolumeProperties_Impl( aCnt, aVolumeInfo ) )
483         {
484             if ( aVolumeInfo.m_bIsRemote )
485                 pRet = STR_DESCRIPTION_REMOTE_VOLUME;
486             else if ( aVolumeInfo.m_bIsFloppy )
487                 pRet = STR_DESCRIPTION_FLOPPY_VOLUME;
488             else if ( aVolumeInfo.m_bIsCompactDisc )
489                 pRet = STR_DESCRIPTION_CDROM_VOLUME;
490             else if ( aVolumeInfo.m_bIsRemoveable || aVolumeInfo.m_bIsVolume )
491                 pRet = STR_DESCRIPTION_LOCALE_VOLUME;
492         }
493     }
494     catch( const css::uno::RuntimeException& )
495     {
496         throw; // don't hide it!
497     }
498     catch( const css::uno::Exception& )
499     {
500 
501     }
502     return pRet;
503 }
504 
505 static OUString GetImageNameFromList_Impl( SvImageId nImageId, vcl::ImageType eImageType )
506 {
507     if (eImageType == vcl::ImageType::Size32)
508     {
509         switch (nImageId)
510         {
511             case SvImageId::HTML:
512                 return BMP_HTML_32;
513             case SvImageId::OO_DatabaseDoc:
514                 return BMP_OO_DATABASE_DOC_32;
515             case SvImageId::OO_DrawDoc:
516                 return BMP_OO_DRAW_DOC_32;
517             case SvImageId::OO_MathDoc:
518                 return BMP_OO_MATH_DOC_32;
519             case SvImageId::OO_GlobalDoc:
520                 return BMP_OO_GLOBAL_DOC_32;
521             case SvImageId::OO_ImpressDoc:
522                 return BMP_OO_IMPRESS_DOC_32;
523             case SvImageId::OO_CalcDoc:
524                 return BMP_OO_CALC_DOC_32;
525             case SvImageId::OO_WriterDoc:
526                 return BMP_OO_WRITER_DOC_32;
527             case SvImageId::OO_WriterTemplate:
528                 return BMP_OO_WRITER_TEMPLATE_32;
529             default: break;
530         }
531     }
532     else if (eImageType == vcl::ImageType::Size26)
533     {
534         switch (nImageId)
535         {
536             case SvImageId::Impress:
537                 return BMP_IMPRESS_LC;
538             case SvImageId::Bitmap:
539                 return BMP_BITMAP_LC;
540             case SvImageId::Calc:
541                 return BMP_CALC_LC;
542             case SvImageId::CalcTemplate:
543                 return BMP_CALCTEMPLATE_LC;
544             case SvImageId::Database:
545                 return BMP_DATABASE_LC;
546             case SvImageId::ImpressTemplate:
547                 return BMP_IMPRESSTEMPLATE_LC;
548             case SvImageId::GIF:
549                 return BMP_GIF_LC;
550             case SvImageId::HTML:
551                 return BMP_HTML_LC;
552             case SvImageId::JPG:
553                 return BMP_JPG_LC;
554             case SvImageId::Math:
555                 return BMP_MATH_LC;
556             case SvImageId::MathTemplate:
557                 return BMP_MATHTEMPLATE_LC;
558             case SvImageId::File:
559                 return BMP_FILE_LC;
560             case SvImageId::PCD:
561                 return BMP_PCD_LC;
562             case SvImageId::PCT:
563                 return BMP_PCT_LC;
564             case SvImageId::PCX:
565                 return BMP_PCX_LC;
566             case SvImageId::SIM:
567                 return BMP_SIM_LC;
568             case SvImageId::TextFile:
569                 return BMP_TEXTFILE_LC;
570             case SvImageId::TIFF:
571                 return BMP_TIFF_LC;
572             case SvImageId::WEBP:
573                 return BMP_WEBP_LC;
574             case SvImageId::WMF:
575                 return BMP_WMF_LC;
576             case SvImageId::Writer:
577                 return BMP_WRITER_LC;
578             case SvImageId::WriterTemplate:
579                 return BMP_WRITERTEMPLATE_LC;
580             case SvImageId::FixedDevice:
581                 return BMP_FIXEDDEV_LC;
582             case SvImageId::RemoveableDevice:
583                 return BMP_REMOVABLEDEV_LC;
584             case SvImageId::CDRomDevice:
585                 return BMP_CDROMDEV_LC;
586             case SvImageId::NetworkDevice:
587                 return BMP_NETWORKDEV_LC;
588             case SvImageId::Table:
589                 return BMP_TABLE_LC;
590             case SvImageId::Folder:
591                 return BMP_FOLDER_LC;
592             case SvImageId::DXF:
593                 return BMP_DXF_LC;
594             case SvImageId::MET:
595                 return BMP_MET_LC;
596             case SvImageId::PNG:
597                 return BMP_PNG_LC;
598             case SvImageId::SVM:
599                 return BMP_SVM_LC;
600             case SvImageId::GlobalDoc:
601                 return BMP_GLOBAL_DOC_LC;
602             case SvImageId::Draw:
603                 return BMP_DRAW_LC;
604             case SvImageId::DrawTemplate:
605                 return BMP_DRAWTEMPLATE_LC;
606             case SvImageId::OO_DatabaseDoc:
607                 return BMP_OO_DATABASE_DOC_LC;
608             case SvImageId::OO_DrawDoc:
609                 return BMP_OO_DRAW_DOC_LC;
610             case SvImageId::OO_MathDoc:
611                 return BMP_OO_MATH_DOC_LC;
612             case SvImageId::OO_GlobalDoc:
613                 return BMP_OO_GLOBAL_DOC_LC;
614             case SvImageId::OO_ImpressDoc:
615                 return BMP_OO_IMPRESS_DOC_LC;
616             case SvImageId::OO_CalcDoc:
617                 return BMP_OO_CALC_DOC_LC;
618             case SvImageId::OO_WriterDoc:
619                 return BMP_OO_WRITER_DOC_LC;
620             case SvImageId::OO_DrawTemplate:
621                 return BMP_OO_DRAW_TEMPLATE_LC;
622             case SvImageId::OO_ImpressTemplate:
623                 return BMP_OO_IMPRESS_TEMPLATE_LC;
624             case SvImageId::OO_CalcTemplate:
625                 return BMP_OO_CALC_TEMPLATE_LC;
626             case SvImageId::OO_WriterTemplate:
627                 return BMP_OO_WRITER_TEMPLATE_LC;
628             case SvImageId::Extension:
629                 return BMP_EXTENSION_LC;
630             default: break;
631         }
632     }
633     else
634     {
635         switch (nImageId)
636         {
637             case SvImageId::Impress:
638                 return BMP_IMPRESS_SC;
639             case SvImageId::Bitmap:
640                 return BMP_BITMAP_SC;
641             case SvImageId::Calc:
642                 return BMP_CALC_SC;
643             case SvImageId::CalcTemplate:
644                 return BMP_CALCTEMPLATE_SC;
645             case SvImageId::Database:
646                 return BMP_DATABASE_SC;
647             case SvImageId::ImpressTemplate:
648                 return BMP_IMPRESSTEMPLATE_SC;
649             case SvImageId::GIF:
650                 return BMP_GIF_SC;
651             case SvImageId::HTML:
652                 return BMP_HTML_SC;
653             case SvImageId::JPG:
654                 return BMP_JPG_SC;
655             case SvImageId::Math:
656                 return BMP_MATH_SC;
657             case SvImageId::MathTemplate:
658                 return BMP_MATHTEMPLATE_SC;
659             case SvImageId::File:
660                 return BMP_FILE_SC;
661             case SvImageId::PCD:
662                 return BMP_PCD_SC;
663             case SvImageId::PCT:
664                 return BMP_PCT_SC;
665             case SvImageId::PCX:
666                 return BMP_PCX_SC;
667             case SvImageId::SIM:
668                 return BMP_SIM_SC;
669             case SvImageId::TextFile:
670                 return BMP_TEXTFILE_SC;
671             case SvImageId::TIFF:
672                 return BMP_TIFF_SC;
673             case SvImageId::WEBP:
674                 return BMP_WEBP_SC;
675             case SvImageId::WMF:
676                 return BMP_WMF_SC;
677             case SvImageId::Writer:
678                 return BMP_WRITER_SC;
679             case SvImageId::WriterTemplate:
680                 return BMP_WRITERTEMPLATE_SC;
681             case SvImageId::FixedDevice:
682                 return BMP_FIXEDDEV_SC;
683             case SvImageId::RemoveableDevice:
684                 return BMP_REMOVABLEDEV_SC;
685             case SvImageId::CDRomDevice:
686                 return BMP_CDROMDEV_SC;
687             case SvImageId::NetworkDevice:
688                 return BMP_NETWORKDEV_SC;
689             case SvImageId::Table:
690                 return BMP_TABLE_SC;
691             case SvImageId::Folder:
692                 return RID_BMP_FOLDER;
693             case SvImageId::DXF:
694                 return BMP_DXF_SC;
695             case SvImageId::MET:
696                 return BMP_MET_SC;
697             case SvImageId::PNG:
698                 return BMP_PNG_SC;
699             case SvImageId::SVM:
700                 return BMP_SVM_SC;
701             case SvImageId::GlobalDoc:
702                 return BMP_GLOBAL_DOC_SC;
703             case SvImageId::Draw:
704                 return BMP_DRAW_SC;
705             case SvImageId::DrawTemplate:
706                 return BMP_DRAWTEMPLATE_SC;
707             case SvImageId::OO_DatabaseDoc:
708                 return BMP_OO_DATABASE_DOC_SC;
709             case SvImageId::OO_DrawDoc:
710                 return BMP_OO_DRAW_DOC_SC;
711             case SvImageId::OO_MathDoc:
712                 return BMP_OO_MATH_DOC_SC;
713             case SvImageId::OO_GlobalDoc:
714                 return BMP_OO_GLOBAL_DOC_SC;
715             case SvImageId::OO_ImpressDoc:
716                 return BMP_OO_IMPRESS_DOC_SC;
717             case SvImageId::OO_CalcDoc:
718                 return BMP_OO_CALC_DOC_SC;
719             case SvImageId::OO_WriterDoc:
720                 return BMP_OO_WRITER_DOC_SC;
721             case SvImageId::OO_DrawTemplate:
722                 return BMP_OO_DRAW_TEMPLATE_SC;
723             case SvImageId::OO_ImpressTemplate:
724                 return BMP_OO_IMPRESS_TEMPLATE_SC;
725             case SvImageId::OO_CalcTemplate:
726                 return BMP_OO_CALC_TEMPLATE_SC;
727             case SvImageId::OO_WriterTemplate:
728                 return BMP_OO_WRITER_TEMPLATE_SC;
729             case SvImageId::Extension:
730                 return BMP_EXTENSION_SC;
731             default: break;
732         }
733     }
734 
735     return OUString();
736 }
737 
738 static Image GetImageFromList_Impl( SvImageId nImageId, vcl::ImageType eImageType)
739 {
740     OUString sImageName(GetImageNameFromList_Impl(nImageId, eImageType));
741     if (!sImageName.isEmpty())
742         return Image(StockImage::Yes, sImageName);
743     return Image();
744 }
745 
746 OUString SvFileInformationManager::GetDescription_Impl( const INetURLObject& rObject, bool bDetectFolder )
747 {
748     OUString sExtension(rObject.getExtension());
749     OUString sDescription, sURL( rObject.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
750     TranslateId pResId;
751     bool bShowExt = false, bOnlyFile = false;
752     bool bFolder = bDetectFolder && CONTENT_HELPER::IsFolder( sURL );
753     if ( !bFolder )
754     {
755         bool bDetected = false;
756 
757         if ( rObject.GetProtocol() == INetProtocol::PrivSoffice )
758         {
759             OUString aURLPath = sURL.copy( strlen(URL_PREFIX_PRIV_SOFFICE) );
760             OUString aType = aURLPath.getToken( 0, '/' );
761             if ( aType == "factory" )
762             {
763                 sDescription = GetDescriptionByFactory_Impl( aURLPath.copy( aURLPath.indexOf( '/' ) + 1 ) );
764                 bDetected = true;
765             }
766         }
767 
768         if (!bDetected)
769         {
770             // search a description by extension
771             bool bExt = !sExtension.isEmpty();
772             if ( bExt )
773             {
774                 sExtension = sExtension.toAsciiLowerCase();
775                 pResId = GetDescriptionId_Impl( sExtension, bShowExt );
776             }
777             if (!pResId)
778             {
779                 pResId = STR_DESCRIPTION_FILE;
780                 bOnlyFile = bExt;
781             }
782         }
783     }
784     else
785         pResId = GetFolderDescriptionId_Impl( sURL );
786 
787     if (pResId)
788     {
789         if ( bOnlyFile )
790         {
791             bShowExt = false;
792             sExtension = sExtension.toAsciiUpperCase();
793             sDescription = sExtension + "-";
794         }
795         sDescription += SvtResId(pResId);
796     }
797 
798     DBG_ASSERT( !sDescription.isEmpty(), "file without description" );
799 
800     if ( bShowExt )
801     {
802         sDescription += " (" + sExtension + ")";
803     }
804 
805     return sDescription;
806 }
807 
808 OUString SvFileInformationManager::GetImageId(const INetURLObject& rObject, bool bBig)
809 {
810     SvImageId nImage = GetImageId_Impl(
811         rObject, true, utl::UCBContentHelper::getDefaultCommandEnvironment() );
812     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
813     return GetImageNameFromList_Impl(nImage, bBig ? vcl::ImageType::Size26 : vcl::ImageType::Size16);
814 }
815 
816 Image SvFileInformationManager::GetImage(
817     const INetURLObject& rObject, bool bBig,
818     css::uno::Reference<css::ucb::XCommandEnvironment> const & env)
819 {
820     SvImageId nImage = GetImageId_Impl( rObject, true, env );
821     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
822     return GetImageFromList_Impl(nImage, bBig ? vcl::ImageType::Size26 : vcl::ImageType::Size16);
823 }
824 
825 OUString SvFileInformationManager::GetFileImageId(const INetURLObject& rObject)
826 {
827     SvImageId nImage = GetImageId_Impl(
828         rObject, false, utl::UCBContentHelper::getDefaultCommandEnvironment() );
829     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
830     return GetImageNameFromList_Impl(nImage, vcl::ImageType::Size16);
831 }
832 
833 Image SvFileInformationManager::GetImageNoDefault(const INetURLObject& rObject, vcl::ImageType eImageType)
834 {
835     SvImageId nImage = GetImageId_Impl(
836         rObject, true, utl::UCBContentHelper::getDefaultCommandEnvironment());
837     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
838 
839     if ( nImage == SvImageId::File )
840         return Image();
841 
842     return GetImageFromList_Impl(nImage, eImageType);
843 }
844 
845 OUString SvFileInformationManager::GetFolderImageId( const svtools::VolumeInfo& rInfo )
846 {
847     SvImageId nImage = SvImageId::Folder;
848     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
849 
850     if ( rInfo.m_bIsRemote )
851         nImage = SvImageId::NetworkDevice;
852     else if ( rInfo.m_bIsCompactDisc )
853         nImage = SvImageId::CDRomDevice;
854     else if ( rInfo.m_bIsRemoveable || rInfo.m_bIsFloppy )
855         nImage = SvImageId::RemoveableDevice;
856     else if ( rInfo.m_bIsVolume )
857         nImage = SvImageId::FixedDevice;
858 
859     return GetImageNameFromList_Impl(nImage, vcl::ImageType::Size16);
860 }
861 
862 OUString SvFileInformationManager::GetDescription( const INetURLObject& rObject )
863 {
864     return SvFileInformationManager::GetDescription_Impl( rObject, true );
865 }
866 
867 OUString SvFileInformationManager::GetFileDescription( const INetURLObject& rObject )
868 {
869     return SvFileInformationManager::GetDescription_Impl( rObject, false );
870 }
871 
872 OUString SvFileInformationManager::GetFolderDescription( const svtools::VolumeInfo& rInfo )
873 {
874     TranslateId pResId = STR_DESCRIPTION_FOLDER;
875     if ( rInfo.m_bIsRemote )
876         pResId = STR_DESCRIPTION_REMOTE_VOLUME;
877     else if ( rInfo.m_bIsFloppy )
878         pResId = STR_DESCRIPTION_FLOPPY_VOLUME;
879     else if ( rInfo.m_bIsCompactDisc )
880         pResId = STR_DESCRIPTION_CDROM_VOLUME;
881     else if ( rInfo.m_bIsRemoveable || rInfo.m_bIsVolume )
882         pResId = STR_DESCRIPTION_LOCALE_VOLUME;
883 
884     return SvtResId(pResId);
885 }
886 
887 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
888