Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <svtools/imagemgr.hxx>
30 : : #include <tools/urlobj.hxx>
31 : : #include <tools/debug.hxx>
32 : : #include <vcl/svapp.hxx>
33 : : #include <vcl/wrkwin.hxx>
34 : : #include "vcl/image.hxx"
35 : : #include <sot/storage.hxx>
36 : : #include <sot/clsids.hxx>
37 : : #include <unotools/ucbhelper.hxx>
38 : : #include <comphelper/processfactory.hxx>
39 : : #include <com/sun/star/beans/PropertyValue.hpp>
40 : : #include <com/sun/star/container/XNameContainer.hpp>
41 : : #include <com/sun/star/document/XTypeDetection.hpp>
42 : : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43 : : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
44 : : #include <ucbhelper/content.hxx>
45 : : #include <tools/rcid.h>
46 : : #include <rtl/logfile.hxx>
47 : : #include <unotools/configmgr.hxx>
48 : : #include <svtools/svtools.hrc>
49 : : #include <svtools/imagemgr.hrc>
50 : : #include <svtools/svtresid.hxx>
51 : : #include <osl/mutex.hxx>
52 : : #include <vcl/lazydelete.hxx>
53 : :
54 : : // globals *******************************************************************
55 : :
56 : : #define NO_INDEX ((sal_uInt16)0xFFFF)
57 : : #define CONTENT_HELPER ::utl::UCBContentHelper
58 : : #define ASCII_STRING(s) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(s) )
59 : :
60 : : struct SvtExtensionResIdMapping_Impl
61 : : {
62 : : const char* _pExt;
63 : : sal_Bool _bExt;
64 : : sal_uInt16 _nStrId;
65 : : sal_uInt16 _nImgId;
66 : : };
67 : :
68 : : static SvtExtensionResIdMapping_Impl const ExtensionMap_Impl[] =
69 : : {
70 : : { "awk", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
71 : : { "bas", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
72 : : { "bat", sal_True, STR_DESCRIPTION_BATCHFILE, 0 },
73 : : { "bmk", sal_False, STR_DESCRIPTION_BOOKMARKFILE, 0 },
74 : : { "bmp", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_BITMAP },
75 : : { "c", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
76 : : { "cfg", sal_False, STR_DESCRIPTION_CFGFILE, 0 },
77 : : { "cmd", sal_True, STR_DESCRIPTION_BATCHFILE, 0 },
78 : : { "cob", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
79 : : { "com", sal_True, STR_DESCRIPTION_APPLICATION, 0 },
80 : : { "cxx", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
81 : : { "dbf", sal_True, STR_DESCRIPTION_DATABASE_TABLE, IMG_TABLE },
82 : : { "def", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
83 : : { "dll", sal_True, STR_DESCRIPTION_SYSFILE, 0 },
84 : : { "doc", sal_False, STR_DESCRIPTION_WORD_DOC, IMG_WRITER },
85 : : { "dot", sal_False, STR_DESCRIPTION_WORD_DOC, IMG_WRITERTEMPLATE },
86 : : { "docx", sal_False, STR_DESCRIPTION_WORD_DOC, IMG_WRITER },
87 : : { "dxf", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_DXF },
88 : : { "exe", sal_True, STR_DESCRIPTION_APPLICATION, 0 },
89 : : { "gif", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_GIF },
90 : : { "h", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
91 : : { "hlp", sal_False, STR_DESCRIPTION_HELP_DOC, 0 },
92 : : { "hrc", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
93 : : { "htm", sal_False, STR_DESCRIPTION_HTMLFILE, IMG_HTML },
94 : : { "html", sal_False, STR_DESCRIPTION_HTMLFILE, IMG_HTML },
95 : : { "asp", sal_False, STR_DESCRIPTION_HTMLFILE, IMG_HTML },
96 : : { "hxx", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
97 : : { "ini", sal_False, STR_DESCRIPTION_CFGFILE, 0 },
98 : : { "java", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
99 : : { "jpeg", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_JPG },
100 : : { "jpg", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_JPG },
101 : : { "lha", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
102 : : #ifdef WNT
103 : : { "lnk", sal_False, 0, 0 },
104 : : #endif
105 : : { "log", sal_True, STR_DESCRIPTION_LOGFILE, 0 },
106 : : { "lst", sal_True, STR_DESCRIPTION_LOGFILE, 0 },
107 : : { "met", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_MET },
108 : : { "mml", sal_False, STR_DESCRIPTION_MATHML_DOC, IMG_MATH },
109 : : { "mod", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
110 : : { "odb", sal_False, STR_DESCRIPTION_OO_DATABASE_DOC, IMG_OO_DATABASE_DOC },
111 : : { "odg", sal_False, STR_DESCRIPTION_OO_DRAW_DOC, IMG_OO_DRAW_DOC },
112 : : { "odf", sal_False, STR_DESCRIPTION_OO_MATH_DOC, IMG_OO_MATH_DOC },
113 : : { "odm", sal_False, STR_DESCRIPTION_OO_GLOBAL_DOC, IMG_OO_GLOBAL_DOC },
114 : : { "odp", sal_False, STR_DESCRIPTION_OO_IMPRESS_DOC, IMG_OO_IMPRESS_DOC },
115 : : { "ods", sal_False, STR_DESCRIPTION_OO_CALC_DOC, IMG_OO_CALC_DOC },
116 : : { "odt", sal_False, STR_DESCRIPTION_OO_WRITER_DOC, IMG_OO_WRITER_DOC },
117 : : { "otg", sal_False, STR_DESCRIPTION_OO_DRAW_TEMPLATE, IMG_OO_DRAW_TEMPLATE },
118 : : { "otp", sal_False, STR_DESCRIPTION_OO_IMPRESS_TEMPLATE, IMG_OO_IMPRESS_TEMPLATE },
119 : : { "ots", sal_False, STR_DESCRIPTION_OO_CALC_TEMPLATE, IMG_OO_CALC_TEMPLATE },
120 : : { "ott", sal_False, STR_DESCRIPTION_OO_WRITER_TEMPLATE, IMG_OO_WRITER_TEMPLATE },
121 : : { "pas", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
122 : : { "pcd", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_PCD },
123 : : { "pct", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_PCT },
124 : : { "pict", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_PCT },
125 : : { "pcx", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_PCX },
126 : : { "pl", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
127 : : { "png", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_PNG },
128 : : { "rar", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
129 : : { "rtf", sal_False, STR_DESCRIPTION_WORD_DOC, IMG_WRITER },
130 : : { "sbl", sal_False, 0, 0 },
131 : : { "sch", sal_False, 0, 0 },
132 : : { "sda", sal_False, STR_DESCRIPTION_SDRAW_DOC, IMG_DRAW },
133 : : { "sdb", sal_False, STR_DESCRIPTION_SDATABASE_DOC, IMG_DATABASE },
134 : : { "sdc", sal_False, STR_DESCRIPTION_SCALC_DOC, IMG_CALC },
135 : : { "sdd", sal_False, STR_DESCRIPTION_SIMPRESS_DOC, IMG_IMPRESS },
136 : : { "sdp", sal_False, STR_DESCRIPTION_SIMPRESS_DOC, 0 },
137 : : { "sds", sal_False, STR_DESCRIPTION_SCHART_DOC, 0 },
138 : : { "sdw", sal_False, STR_DESCRIPTION_SWRITER_DOC, IMG_WRITER },
139 : : { "sga", sal_False, 0, 0 },
140 : : { "sgf", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_SGF },
141 : : { "sgl", sal_False, STR_DESCRIPTION_GLOBALDOC, IMG_GLOBAL_DOC },
142 : : { "sgv", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_SGV },
143 : : { "shtml", sal_False, STR_DESCRIPTION_HTMLFILE, IMG_HTML },
144 : : { "sim", sal_False, STR_DESCRIPTION_SIMAGE_DOC, IMG_SIM },
145 : : { "smf", sal_False, STR_DESCRIPTION_SMATH_DOC, IMG_MATH },
146 : : { "src", sal_True, STR_DESCRIPTION_SOURCEFILE, 0 },
147 : : { "svh", sal_False, STR_DESCRIPTION_HELP_DOC, 0 },
148 : : { "svm", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_SVM },
149 : : { "stc", sal_False, STR_DESCRIPTION_CALC_TEMPLATE, IMG_CALCTEMPLATE },
150 : : { "std", sal_False, STR_DESCRIPTION_DRAW_TEMPLATE, IMG_DRAWTEMPLATE },
151 : : { "sti", sal_False, STR_DESCRIPTION_IMPRESS_TEMPLATE, IMG_IMPRESSTEMPLATE },
152 : : { "stw", sal_False, STR_DESCRIPTION_WRITER_TEMPLATE, IMG_WRITERTEMPLATE },
153 : : { "sxc", sal_False, STR_DESCRIPTION_SXCALC_DOC, IMG_CALC },
154 : : { "sxd", sal_False, STR_DESCRIPTION_SXDRAW_DOC, IMG_DRAW },
155 : : { "sxg", sal_False, STR_DESCRIPTION_SXGLOBAL_DOC, IMG_GLOBAL_DOC },
156 : : { "sxi", sal_False, STR_DESCRIPTION_SXIMPRESS_DOC, IMG_IMPRESS },
157 : : { "sxm", sal_False, STR_DESCRIPTION_SXMATH_DOC, IMG_MATH },
158 : : { "sxs", sal_False, STR_DESCRIPTION_SXCHART_DOC, 0 },
159 : : { "sxw", sal_False, STR_DESCRIPTION_SXWRITER_DOC, IMG_WRITER },
160 : : { "sys", sal_True, STR_DESCRIPTION_SYSFILE, 0 },
161 : : { "tif", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_TIFF },
162 : : { "tiff", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_TIFF },
163 : : { "txt", sal_False, STR_DESCRIPTION_TEXTFILE, IMG_TEXTFILE },
164 : : { "url", sal_False, STR_DESCRIPTION_LINK, 0 },
165 : : { "vor", sal_False, STR_DESCRIPTION_SOFFICE_TEMPLATE_DOC, IMG_WRITERTEMPLATE },
166 : : { "vxd", sal_True, STR_DESCRIPTION_SYSFILE, 0 },
167 : : { "wmf", sal_True, STR_DESCRIPTION_GRAPHIC_DOC, IMG_WMF },
168 : : { "xls", sal_False, STR_DESCRIPTION_EXCEL_DOC, IMG_CALC },
169 : : { "xlt", sal_False, STR_DESCRIPTION_EXCEL_TEMPLATE_DOC, IMG_CALCTEMPLATE },
170 : : { "xlsx", sal_False, STR_DESCRIPTION_EXCEL_DOC, IMG_CALC },
171 : : { "uu", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
172 : : { "uue", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
173 : : { "z", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
174 : : { "zip", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
175 : : { "zoo", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
176 : : { "gz", sal_True, STR_DESCRIPTION_ARCHIVFILE, 0 },
177 : : { "ppt", sal_False, STR_DESCRIPTION_POWERPOINT, IMG_IMPRESS },
178 : : { "pot", sal_False, STR_DESCRIPTION_POWERPOINT_TEMPLATE, IMG_IMPRESSTEMPLATE },
179 : : { "pps", sal_False, STR_DESCRIPTION_POWERPOINT_SHOW, IMG_IMPRESS },
180 : : { "pptx", sal_False, STR_DESCRIPTION_POWERPOINT, IMG_IMPRESS },
181 : : { "oxt", sal_False, STR_DESCRIPTION_EXTENSION, IMG_EXTENSION },
182 : : { 0, sal_False, 0, 0 }
183 : : };
184 : :
185 : : struct SvtFactory2ExtensionMapping_Impl
186 : : {
187 : : const char* _pFactory;
188 : : const char* _pExtension;
189 : : };
190 : :
191 : : // mapping from "private:factory" url to extension
192 : :
193 : : static SvtFactory2ExtensionMapping_Impl const Fac2ExtMap_Impl[] =
194 : : {
195 : : { "swriter", "odt" },
196 : : { "swriter/web", "html" },
197 : : { "swriter/GlobalDocument", "odm" },
198 : : { "scalc", "ods" },
199 : : { "simpress", "odp" },
200 : : { "sdraw", "odg" },
201 : : { "smath", "odf" },
202 : : { "sdatabase", "odb" },
203 : : { NULL, NULL }
204 : : };
205 : :
206 : : //****************************************************************************
207 : :
208 : 11853 : static String GetImageExtensionByFactory_Impl( const String& rURL )
209 : : {
210 [ + - ][ + - ]: 11853 : INetURLObject aObj( rURL );
211 [ + - ][ + - ]: 11853 : String aPath = aObj.GetURLPath( INetURLObject::NO_DECODE );
212 [ + - ]: 11853 : String aExtension;
213 : :
214 [ + - ]: 11853 : if ( aPath.Len() )
215 : : {
216 : 11853 : sal_uInt16 nIndex = 0;
217 [ + - ]: 37111 : while ( Fac2ExtMap_Impl[ nIndex ]._pFactory )
218 : : {
219 [ + - ][ + + ]: 37111 : if ( aPath.EqualsAscii( Fac2ExtMap_Impl[ nIndex ]._pFactory ) )
220 : : {
221 : : // extension found
222 [ + - ]: 11853 : aExtension = rtl::OUString::createFromAscii(Fac2ExtMap_Impl[ nIndex ]._pExtension);
223 : : // and return it
224 : : return aExtension;
225 : : }
226 : 25258 : ++nIndex;
227 : : }
228 : : }
229 : :
230 : : // no extension found, so use the type detection (performance brake)
231 : :
232 : : try
233 : : {
234 : : // get the TypeDetection service to access all registered types
235 [ # # ]: 0 : ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory > xFac = ::comphelper::getProcessServiceFactory();
236 : : ::com::sun::star::uno::Reference < ::com::sun::star::document::XTypeDetection > xTypeDetector(
237 [ # # ][ # # ]: 0 : xFac->createInstance( ASCII_STRING("com.sun.star.document.TypeDetection") ), ::com::sun::star::uno::UNO_QUERY );
[ # # ][ # # ]
238 : :
239 [ # # ][ # # ]: 0 : ::rtl::OUString aInternalType = xTypeDetector->queryTypeByURL( rURL );
[ # # ]
240 [ # # ]: 0 : ::com::sun::star::uno::Reference < ::com::sun::star::container::XNameAccess > xAccess( xTypeDetector, ::com::sun::star::uno::UNO_QUERY );
241 [ # # ]: 0 : ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue > aTypeProps;
242 [ # # ][ # # ]: 0 : if ( !aInternalType.isEmpty() && xAccess->hasByName( aInternalType ) )
[ # # ][ # # ]
[ # # ]
243 : : {
244 [ # # ][ # # ]: 0 : xAccess->getByName( aInternalType ) >>= aTypeProps;
[ # # ]
245 : 0 : sal_Int32 nProps = aTypeProps.getLength();
246 [ # # ]: 0 : for ( sal_Int32 i = 0; i < nProps; ++i )
247 : : {
248 [ # # ]: 0 : const ::com::sun::star::beans::PropertyValue& rProp = aTypeProps[i];
249 [ # # ]: 0 : if ( rProp.Name.compareToAscii("Extensions") == COMPARE_EQUAL )
250 : : {
251 [ # # ]: 0 : ::com::sun::star::uno::Sequence < ::rtl::OUString > aExtensions;
252 [ # # ][ # # ]: 0 : if ( ( rProp.Value >>= aExtensions ) && aExtensions.getLength() > 0 )
[ # # ][ # # ]
253 : : {
254 : 0 : const ::rtl::OUString* pExtensions = aExtensions.getConstArray();
255 [ # # ][ # # ]: 0 : aExtension = String( pExtensions[0] );
[ # # ]
256 : : break;
257 [ # # ][ # # ]: 0 : }
258 : : }
259 : : }
260 [ # # ]: 0 : }
261 : : }
262 [ # # # ]: 0 : catch( const ::com::sun::star::uno::RuntimeException& )
263 : : {
264 : 0 : throw; // dont hide it!
265 : : }
266 [ # # ]: 0 : catch( const ::com::sun::star::uno::Exception& )
267 : : {
268 : : // type detection failed -> no extension
269 : : }
270 : :
271 [ + - ][ + - ]: 11853 : return aExtension;
272 : : }
273 : :
274 : 11853 : static sal_uInt16 GetIndexOfExtension_Impl( const String& rExtension )
275 : : {
276 : 11853 : sal_uInt16 nRet = NO_INDEX;
277 [ + - ]: 11853 : if ( rExtension.Len() )
278 : : {
279 : 11853 : sal_uInt16 nIndex = 0;
280 [ + - ]: 11853 : String aExt = rExtension;
281 [ + - ]: 11853 : aExt.ToLowerAscii();
282 [ + - ]: 482570 : while ( ExtensionMap_Impl[ nIndex ]._pExt )
283 : : {
284 [ + - ][ + + ]: 482570 : if ( aExt.EqualsAscii( ExtensionMap_Impl[ nIndex ]._pExt ) )
285 : : {
286 : 11853 : nRet = nIndex;
287 : 11853 : break;
288 : : }
289 : 470717 : ++nIndex;
290 [ + - ]: 11853 : }
291 : : }
292 : :
293 : 11853 : return nRet;
294 : : }
295 : :
296 : 11853 : static sal_uInt16 GetImageId_Impl( const String& rExtension )
297 : : {
298 : 11853 : sal_uInt16 nImage = IMG_FILE;
299 [ + - ]: 11853 : if ( rExtension.Len() != NO_INDEX )
300 : : {
301 : 11853 : sal_uInt16 nIndex = GetIndexOfExtension_Impl( rExtension );
302 [ + - ]: 11853 : if ( nIndex != NO_INDEX )
303 : : {
304 : 11853 : nImage = ExtensionMap_Impl[ nIndex ]._nImgId;
305 [ - + ]: 11853 : if ( !nImage )
306 : 0 : nImage = IMG_FILE;
307 : : }
308 : : }
309 : :
310 : 11853 : return nImage;
311 : : }
312 : :
313 : 0 : static sal_Bool GetVolumeProperties_Impl( ::ucbhelper::Content& rContent, svtools::VolumeInfo& rVolumeInfo )
314 : : {
315 : 0 : sal_Bool bRet = sal_False;
316 : :
317 : : try
318 : : {
319 [ # # ][ # # ]: 0 : bRet = ( ( rContent.getPropertyValue( ASCII_STRING("IsVolume") ) >>= rVolumeInfo.m_bIsVolume ) &&
[ # # ][ # # ]
[ # # # # ]
320 [ # # ][ # # ]: 0 : ( rContent.getPropertyValue( ASCII_STRING("IsRemote") ) >>= rVolumeInfo.m_bIsRemote ) &&
[ # # ][ # # ]
[ # # # # ]
321 [ # # ][ # # ]: 0 : ( rContent.getPropertyValue( ASCII_STRING("IsRemoveable") ) >>= rVolumeInfo.m_bIsRemoveable ) &&
[ # # ][ # # ]
[ # # # # ]
322 [ # # ][ # # ]: 0 : ( rContent.getPropertyValue( ASCII_STRING("IsFloppy") ) >>= rVolumeInfo.m_bIsFloppy ) &&
[ # # ][ # # ]
[ # # # # ]
323 [ # # ][ # # ]: 0 : ( rContent.getPropertyValue( ASCII_STRING("IsCompactDisc") ) >>= rVolumeInfo.m_bIsCompactDisc ) );
[ # # ][ # # ]
[ # # ]
[ # # # # ]
[ # # # #
# # # # ]
324 : : }
325 [ # # # ]: 0 : catch( const ::com::sun::star::uno::RuntimeException& )
326 : : {
327 : 0 : throw; // dont hide it!
328 : : }
329 : 0 : catch( const ::com::sun::star::uno::Exception& )
330 : : {
331 : : // type detection failed -> no extension
332 : : }
333 : :
334 : 0 : return bRet;
335 : : }
336 : :
337 : 0 : static sal_uInt16 GetFolderImageId_Impl( const String& rURL )
338 : : {
339 : 0 : sal_uInt16 nRet = IMG_FOLDER;
340 : 0 : ::svtools::VolumeInfo aVolumeInfo;
341 : : try
342 : : {
343 [ # # ][ # # ]: 0 : ::ucbhelper::Content aCnt( rURL, ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
344 [ # # ][ # # ]: 0 : if ( GetVolumeProperties_Impl( aCnt, aVolumeInfo ) )
345 : : {
346 [ # # ]: 0 : if ( aVolumeInfo.m_bIsRemote )
347 : 0 : nRet = IMG_NETWORKDEV;
348 [ # # ]: 0 : else if ( aVolumeInfo.m_bIsCompactDisc )
349 : 0 : nRet = IMG_CDROMDEV;
350 [ # # ]: 0 : else if ( aVolumeInfo.m_bIsRemoveable )
351 : 0 : nRet = IMG_REMOVEABLEDEV;
352 [ # # ]: 0 : else if ( aVolumeInfo.m_bIsVolume )
353 : 0 : nRet = IMG_FIXEDDEV;
354 [ # # ]: 0 : }
355 : : }
356 [ # # # ]: 0 : catch( const ::com::sun::star::uno::RuntimeException& )
357 : : {
358 : 0 : throw; // dont hide it!
359 : : }
360 [ # # ]: 0 : catch( const ::com::sun::star::uno::Exception& )
361 : : {
362 : : // ...
363 : : }
364 : 0 : return nRet;
365 : : }
366 : :
367 : 16275 : static sal_uInt16 GetImageId_Impl( const INetURLObject& rObject, sal_Bool bDetectFolder )
368 : : {
369 : : RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svtools", "hb93813", "SvFileInformationManager::GetImageId_Impl()" );
370 : :
371 [ + - ][ + - ]: 16275 : String aExt, sURL = rObject.GetMainURL( INetURLObject::NO_DECODE );
[ + - ]
372 : 16275 : sal_uInt16 nImage = IMG_FILE;
373 : :
374 [ + + ]: 16275 : if ( rObject.GetProtocol() == INET_PROT_PRIVATE )
375 : : {
376 [ + - ]: 16269 : String aURLPath = sURL.Copy( URL_PREFIX_PRIV_SOFFICE_LEN );
377 [ + - ]: 16269 : String aType = aURLPath.GetToken( 0, INET_PATH_TOKEN );
378 [ + - ][ + - ]: 16269 : if ( aType == String( RTL_CONSTASCII_USTRINGPARAM("factory") ) )
[ + - ][ + + ]
379 : : {
380 : : // detect an image id for our "private:factory" urls
381 [ + - ][ + - ]: 11853 : aExt = GetImageExtensionByFactory_Impl( sURL );
[ + - ]
382 [ + - ]: 11853 : if ( aExt.Len() > 0 )
383 [ + - ]: 11853 : nImage = GetImageId_Impl( aExt );
384 : 11853 : return nImage;
385 : : }
386 [ + - ][ + - ]: 4416 : else if ( aType == String( RTL_CONSTASCII_USTRINGPARAM("image") ) )
[ + - ][ + - ]
387 [ + - ][ + - ]: 16269 : nImage = (sal_uInt16)aURLPath.GetToken( 1, INET_PATH_TOKEN ).ToInt32();
[ + - ][ + - ]
[ + + ][ + - ]
[ + + ]
388 : : }
389 : : else
390 : : {
391 [ + - ][ + - ]: 6 : aExt = rObject.getExtension();
392 [ - + ][ + - ]: 6 : if ( aExt.EqualsAscii( "vor" ) )
393 : : {
394 [ # # ][ # # ]: 0 : SotStorageRef aStorage = new SotStorage( sURL, STREAM_STD_READ );
395 : 0 : sal_uInt16 nId = IMG_WRITERTEMPLATE;
396 [ # # ]: 0 : if ( !aStorage->GetError() )
397 : : {
398 [ # # ]: 0 : SvGlobalName aGlobalName = aStorage->GetClassName();
399 [ # # ][ # # ]: 0 : if ( aGlobalName == SvGlobalName(SO3_SC_CLASSID_50) || aGlobalName == SvGlobalName(SO3_SC_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SC_CLASSID_30) )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # #
# # # # #
# ]
400 : 0 : nId = IMG_CALCTEMPLATE;
401 [ # # ][ # # ]: 0 : else if ( aGlobalName == SvGlobalName(SO3_SDRAW_CLASSID_50) )
[ # # ][ # # ]
402 : 0 : nId = IMG_DRAWTEMPLATE;
403 [ # # ][ # # ]: 0 : else if ( aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_50) ||
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
[ # # # # ]
404 [ # # ][ # # ]: 0 : aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SIMPRESS_CLASSID_30) )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # # ]
405 : 0 : nId = IMG_IMPRESSTEMPLATE;
406 [ # # ][ # # ]: 0 : else if ( aGlobalName == SvGlobalName(SO3_SM_CLASSID_50) || aGlobalName == SvGlobalName(SO3_SM_CLASSID_40) || aGlobalName == SvGlobalName(SO3_SM_CLASSID_30) )
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # #
# # # # #
# ]
407 [ # # ]: 0 : nId = IMG_MATHTEMPLATE;
408 : : }
409 : :
410 [ # # ]: 0 : return nId;
411 : : }
412 : : }
413 : :
414 [ + + ][ + + ]: 4422 : if ( nImage == IMG_FILE && sURL.Len() )
[ + + ]
415 : : {
416 [ + - ][ + - ]: 4 : if ( bDetectFolder && CONTENT_HELPER::IsFolder( sURL ) )
[ + - ][ - + ]
[ + - ]
[ - + # # ]
417 [ # # ]: 0 : nImage = GetFolderImageId_Impl( sURL );
418 [ - + ]: 4 : else if ( aExt.Len() > 0 )
419 [ # # ]: 0 : nImage = GetImageId_Impl( aExt );
420 : : }
421 [ + - ][ + - ]: 16275 : return nImage;
422 : : }
423 : :
424 : 0 : static sal_uInt16 GetDescriptionId_Impl( const String& rExtension, sal_Bool& rbShowExt )
425 : : {
426 : 0 : sal_uInt16 nId = 0;
427 : :
428 [ # # ]: 0 : if ( rExtension.Len() != NO_INDEX )
429 : : {
430 : 0 : sal_uInt16 nIndex = GetIndexOfExtension_Impl( rExtension );
431 [ # # ]: 0 : if ( nIndex != NO_INDEX )
432 : : {
433 : 0 : nId = ExtensionMap_Impl[ nIndex ]._nStrId;
434 : 0 : rbShowExt = ExtensionMap_Impl[ nIndex ]._bExt;
435 : : }
436 : : }
437 : :
438 : 0 : return nId;
439 : : }
440 : :
441 : 12 : static String GetDescriptionByFactory_Impl( const String& rFactory )
442 : : {
443 : 12 : sal_uInt16 nResId = 0;
444 [ + + ]: 12 : if ( rFactory.EqualsIgnoreCaseAscii( "swriter", 0, 7 ) )
445 : 2 : nResId = STR_DESCRIPTION_FACTORY_WRITER;
446 [ + + ]: 10 : else if ( rFactory.EqualsIgnoreCaseAscii( "scalc", 0, 5 ) )
447 : 2 : nResId = STR_DESCRIPTION_FACTORY_CALC;
448 [ + + ]: 8 : else if ( rFactory.EqualsIgnoreCaseAscii( "simpress", 0, 8 ) )
449 : 2 : nResId = STR_DESCRIPTION_FACTORY_IMPRESS;
450 [ + + ]: 6 : else if ( rFactory.EqualsIgnoreCaseAscii( "sdraw", 0, 5 ) )
451 : 2 : nResId = STR_DESCRIPTION_FACTORY_DRAW;
452 [ - + ]: 4 : else if ( rFactory.EqualsIgnoreCaseAscii( "swriter/web", 0, 11 ) )
453 : 0 : nResId = STR_DESCRIPTION_FACTORY_WRITERWEB;
454 [ - + ]: 4 : else if ( rFactory.EqualsIgnoreCaseAscii( "swriter/globaldocument", 0, 22 ) )
455 : 0 : nResId = STR_DESCRIPTION_FACTORY_GLOBALDOC;
456 [ + + ]: 4 : else if ( rFactory.EqualsIgnoreCaseAscii( "smath", 0, 5 ) )
457 : 2 : nResId = STR_DESCRIPTION_FACTORY_MATH;
458 [ + - ]: 2 : else if ( rFactory.EqualsIgnoreCaseAscii( "sdatabase", 0, 9 ) )
459 : 2 : nResId = STR_DESCRIPTION_FACTORY_DATABASE;
460 : :
461 [ + - ]: 12 : if ( nResId )
462 : : {
463 [ + - ]: 12 : SolarMutexGuard aGuard;
464 [ + - ][ + - ]: 12 : return SvtResId(nResId).toString();
[ + - ][ + - ]
465 : : }
466 [ # # ]: 12 : return rtl::OUString();
467 : : }
468 : :
469 : 0 : static sal_uInt16 GetFolderDescriptionId_Impl( const String& rURL )
470 : : {
471 : 0 : sal_uInt16 nRet = STR_DESCRIPTION_FOLDER;
472 : 0 : svtools::VolumeInfo aVolumeInfo;
473 : : try
474 : : {
475 [ # # ][ # # ]: 0 : ::ucbhelper::Content aCnt( rURL, ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () );
476 [ # # ][ # # ]: 0 : if ( GetVolumeProperties_Impl( aCnt, aVolumeInfo ) )
477 : : {
478 [ # # ]: 0 : if ( aVolumeInfo.m_bIsRemote )
479 : 0 : nRet = STR_DESCRIPTION_REMOTE_VOLUME;
480 [ # # ]: 0 : else if ( aVolumeInfo.m_bIsFloppy )
481 : 0 : nRet = STR_DESCRIPTION_FLOPPY_VOLUME;
482 [ # # ]: 0 : else if ( aVolumeInfo.m_bIsCompactDisc )
483 : 0 : nRet = STR_DESCRIPTION_CDROM_VOLUME;
484 [ # # ][ # # ]: 0 : else if ( aVolumeInfo.m_bIsRemoveable || aVolumeInfo.m_bIsVolume )
485 : 0 : nRet = STR_DESCRIPTION_LOCALE_VOLUME;
486 [ # # ]: 0 : }
487 : : }
488 [ # # # ]: 0 : catch( const ::com::sun::star::uno::RuntimeException& )
489 : : {
490 : 0 : throw; // dont hide it!
491 : : }
492 [ # # ]: 0 : catch( const ::com::sun::star::uno::Exception& )
493 : : {
494 : : // ...
495 : : }
496 : 0 : return nRet;
497 : : }
498 : :
499 : 16269 : static Image GetImageFromList_Impl( sal_uInt16 nImageId, sal_Bool bBig )
500 : : {
501 [ + - ][ - + ]: 16269 : if ( !bBig && IMG_FOLDER == nImageId )
502 : : // return our new small folder image (256 colors)
503 [ # # ]: 0 : return Image( SvtResId( IMG_SVT_FOLDER ) );
504 : :
505 : 16269 : ImageList* pList = NULL;
506 : :
507 [ + + ][ + - ]: 16269 : static vcl::DeleteOnDeinit< ImageList > xSmallImageList( NULL );
[ + - ][ # # ]
508 [ + + ][ + - ]: 16269 : static vcl::DeleteOnDeinit< ImageList > xBigImageList( NULL );
[ + - ][ # # ]
509 [ + + ][ + - ]: 16269 : static sal_uLong nStyle = Application::GetSettings().GetStyleSettings().GetSymbolsStyle();
[ + - ][ # # ]
510 : :
511 : : // If the style has been changed, throw away our cache of the older images
512 [ - + ]: 16269 : if ( nStyle != Application::GetSettings().GetStyleSettings().GetSymbolsStyle() )
513 : : {
514 : 0 : xSmallImageList.reset();
515 : 0 : xBigImageList.reset();
516 : 0 : nStyle = Application::GetSettings().GetStyleSettings().GetSymbolsStyle();
517 : : }
518 : :
519 [ - + ]: 16269 : if ( bBig )
520 : : {
521 [ # # ]: 0 : if ( !xBigImageList.get() )
522 [ # # ][ # # ]: 0 : xBigImageList.reset(new ImageList(SvtResId(RID_SVTOOLS_IMAGELIST_BIG)));
[ # # ]
523 : 0 : pList = xBigImageList.get();
524 : : }
525 : : else
526 : : {
527 [ + + ]: 16269 : if ( !xSmallImageList.get() )
528 [ + - ][ + - ]: 60 : xSmallImageList.reset(new ImageList(SvtResId(RID_SVTOOLS_IMAGELIST_SMALL)));
[ + - ]
529 : 16269 : pList = xSmallImageList.get();
530 : : }
531 : :
532 [ + + ]: 16269 : if ( pList->HasImageAtPos( nImageId ) )
533 : 15165 : return pList->GetImage( nImageId );
534 : 16269 : return Image();
535 : : }
536 : :
537 : 12 : String SvFileInformationManager::GetDescription_Impl( const INetURLObject& rObject, sal_Bool bDetectFolder )
538 : : {
539 : : RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svtools", "hb93813", "SvFileInformationManager::GetDescription_Impl()" );
540 : :
541 [ + - ]: 12 : String sDescription;
542 [ + - ][ + - ]: 12 : String sExtension( rObject.getExtension() ), sURL( rObject.GetMainURL( INetURLObject::NO_DECODE ) );
[ + - ][ + - ]
543 : 12 : sal_uInt16 nResId = 0;
544 : 12 : sal_Bool bShowExt = sal_False, bDetected = sal_False, bOnlyFile = sal_False;
545 [ + - ][ + - ]: 12 : sal_Bool bFolder = bDetectFolder ? CONTENT_HELPER::IsFolder( sURL ) : sal_False;
[ + - ][ # # ]
[ + - ]
546 [ + - ]: 12 : if ( !bFolder )
547 : : {
548 [ + - ]: 12 : if ( !bDetected )
549 : : {
550 [ + - ]: 12 : if ( rObject.GetProtocol() == INET_PROT_PRIVATE )
551 : : {
552 [ + - ]: 12 : String aURLPath = sURL.Copy( URL_PREFIX_PRIV_SOFFICE_LEN );
553 [ + - ]: 12 : String aType = aURLPath.GetToken( 0, INET_PATH_TOKEN );
554 [ + - ][ + - ]: 12 : if ( aType == String( RTL_CONSTASCII_USTRINGPARAM("factory") ) )
[ + - ][ + - ]
555 : : {
556 [ + - ][ + - ]: 12 : sDescription = GetDescriptionByFactory_Impl( aURLPath.Copy( aURLPath.Search( INET_PATH_TOKEN ) + 1 ) );
[ + - ][ + - ]
[ + - ][ + - ]
557 : 12 : bDetected = sal_True;
558 [ + - ][ + - ]: 12 : }
559 : : }
560 : :
561 [ - + ]: 12 : if ( !bDetected )
562 : : {
563 : : // search a description by extension
564 : 0 : sal_Bool bExt = ( sExtension.Len() > 0 );
565 [ # # ]: 0 : if ( bExt )
566 : : {
567 [ # # ]: 0 : sExtension.ToLowerAscii();
568 [ # # ]: 0 : nResId = GetDescriptionId_Impl( sExtension, bShowExt );
569 : : }
570 [ # # ]: 0 : if ( !nResId )
571 : : {
572 : 0 : nResId = STR_DESCRIPTION_FILE;
573 : 0 : bOnlyFile = bExt;
574 : : }
575 : : }
576 : : }
577 : : }
578 : : else
579 [ # # ]: 0 : nResId = GetFolderDescriptionId_Impl( sURL );
580 : :
581 [ - + ]: 12 : if ( nResId > 0 )
582 : : {
583 [ # # ]: 0 : if ( bOnlyFile )
584 : : {
585 : 0 : bShowExt = sal_False;
586 [ # # ]: 0 : sExtension.ToUpperAscii();
587 [ # # ]: 0 : sDescription = sExtension;
588 [ # # ]: 0 : sDescription += '-';
589 : : }
590 [ # # ]: 0 : SolarMutexGuard aGuard;
591 [ # # ][ # # ]: 0 : sDescription += SvtResId(nResId).toString();
[ # # ][ # # ]
592 : : }
593 : :
594 : : DBG_ASSERT( sDescription.Len() > 0, "file without description" );
595 : :
596 [ - + ]: 12 : if ( bShowExt )
597 : : {
598 [ # # ][ # # ]: 0 : sDescription += String( RTL_CONSTASCII_USTRINGPARAM(" (") );
[ # # ]
599 [ # # ]: 0 : sDescription += sExtension;
600 [ # # ]: 0 : sDescription += ')';
601 : : }
602 : :
603 [ + - ][ + - ]: 12 : return sDescription;
604 : : }
605 : :
606 : 0 : Image SvFileInformationManager::GetImage( const INetURLObject& rObject, sal_Bool bBig )
607 : : {
608 : 0 : sal_uInt16 nImage = GetImageId_Impl( rObject, sal_True );
609 : : DBG_ASSERT( nImage, "invalid ImageId" );
610 : 0 : return GetImageFromList_Impl( nImage, bBig );
611 : : }
612 : :
613 : 0 : Image SvFileInformationManager::GetFileImage( const INetURLObject& rObject, sal_Bool bBig )
614 : : {
615 : 0 : sal_Int16 nImage = GetImageId_Impl( rObject, sal_False );
616 : : DBG_ASSERT( nImage, "invalid ImageId" );
617 : 0 : return GetImageFromList_Impl( nImage, bBig );
618 : : }
619 : :
620 : 16275 : Image SvFileInformationManager::GetImageNoDefault( const INetURLObject& rObject, sal_Bool bBig )
621 : : {
622 : 16275 : sal_uInt16 nImage = GetImageId_Impl( rObject, sal_True );
623 : : DBG_ASSERT( nImage, "invalid ImageId" );
624 : :
625 [ + + ]: 16275 : if ( nImage == IMG_FILE )
626 : 6 : return Image();
627 : :
628 : 16275 : return GetImageFromList_Impl( nImage, bBig );
629 : : }
630 : :
631 : 0 : Image SvFileInformationManager::GetFolderImage( const svtools::VolumeInfo& rInfo, sal_Bool bBig )
632 : : {
633 : 0 : sal_uInt16 nImage = IMG_FOLDER;
634 : : DBG_ASSERT( nImage, "invalid ImageId" );
635 : :
636 [ # # ]: 0 : if ( rInfo.m_bIsRemote )
637 : 0 : nImage = IMG_NETWORKDEV;
638 [ # # ]: 0 : else if ( rInfo.m_bIsCompactDisc )
639 : 0 : nImage = IMG_CDROMDEV;
640 [ # # ][ # # ]: 0 : else if ( rInfo.m_bIsRemoveable || rInfo.m_bIsFloppy )
641 : 0 : nImage = IMG_REMOVEABLEDEV;
642 [ # # ]: 0 : else if ( rInfo.m_bIsVolume )
643 : 0 : nImage = IMG_FIXEDDEV;
644 : :
645 : 0 : return GetImageFromList_Impl( nImage, bBig );
646 : : }
647 : :
648 : 12 : String SvFileInformationManager::GetDescription( const INetURLObject& rObject )
649 : : {
650 : 12 : return SvFileInformationManager::GetDescription_Impl( rObject, sal_True );
651 : : }
652 : :
653 : 0 : String SvFileInformationManager::GetFileDescription( const INetURLObject& rObject )
654 : : {
655 : 0 : return SvFileInformationManager::GetDescription_Impl( rObject, sal_False );
656 : : }
657 : :
658 : 0 : String SvFileInformationManager::GetFolderDescription( const svtools::VolumeInfo& rInfo )
659 : : {
660 : 0 : sal_uInt16 nResId = STR_DESCRIPTION_FOLDER;
661 [ # # ]: 0 : if ( rInfo.m_bIsRemote )
662 : 0 : nResId = STR_DESCRIPTION_REMOTE_VOLUME;
663 [ # # ]: 0 : else if ( rInfo.m_bIsFloppy )
664 : 0 : nResId = STR_DESCRIPTION_FLOPPY_VOLUME;
665 [ # # ]: 0 : else if ( rInfo.m_bIsCompactDisc )
666 : 0 : nResId = STR_DESCRIPTION_CDROM_VOLUME;
667 [ # # ][ # # ]: 0 : else if ( rInfo.m_bIsRemoveable || rInfo.m_bIsVolume )
668 : 0 : nResId = STR_DESCRIPTION_LOCALE_VOLUME;
669 : :
670 [ # # ][ # # ]: 0 : return SvtResId(nResId).toString();
671 : : }
672 : :
673 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|